源码如下:
byte[] bytearray = new byte[512];//建立内存块,使用分块传输加快io速度
int len = 0;
input = new BufferedInputStream(new FileInputStream("F:\\1018.rar"),512);
output = con.getOutputStream();
//先将output封装成BufferedWriter,方便写字符串
BufferedWriter br = new BufferedWriter(output);
br.write("hello Mr Server ,this is the file from DaytimeClientServlet1,please recieve\r");
br.flush();
//现在我想发送字节流了,为避免从字符到字节的转换,将output包装成BufferedOutputStream
BufferedOutputStream bOut = new BufferedOutputStream(output,512);
while ((len = input.read(bytearray)) != -1) {
bOut.write(bytearray, 0, len);
bOut.flush();
}
input.close();
output.close();
byte[] bytearray = new byte[512];//建立内存块,使用分块传输加快io速度
int len = 0;
input = new BufferedInputStream(new FileInputStream("F:\\1018.rar"),512);
output = con.getOutputStream();
//先将output封装成BufferedWriter,方便写字符串
BufferedWriter br = new BufferedWriter(output);
br.write("hello Mr Server ,this is the file from DaytimeClientServlet1,please recieve\r");
br.flush();
//现在我想发送字节流了,为避免从字符到字节的转换,将output包装成BufferedOutputStream
BufferedOutputStream bOut = new BufferedOutputStream(output,512);
while ((len = input.read(bytearray)) != -1) {
bOut.write(bytearray, 0, len);
bOut.flush();
}
input.close();
output.close();
FileOutputStream fw = new FileOutputStream("c:\\dest.class"); InputStream input = req.getInputStream();
//为方便读字符串,先将input包装成BufferedReader
BufferedReader br = new BufferedReader(new InputStreamReader(input),512);
String x = br.readLine();//读第一句
//br.close();
//为测试,再将input包装成BufferedInputSteam
String newx = new String("Server received it:" + x);
BufferedInputStream bs = new BufferedInputStream(input);
try{
byte[] bytearray = new byte[512]; //建立内存块,使用分块传输加快io速度
int len = 0;
while ( (len = bs.read(bytearray)) != -1) {
fw.write(bytearray, 0, len);
fw.flush();
}
input.close();
bs.close();
fw.flush();
fw.close();
我本来只正对这个input使用了一个bufferedreader包装的,并将第一行以后的全部由string转为byte[],那样的话,一切正常。
我现在为了加深自己的理解:先将input包装成一个基于字符的io对象,然后再包装成一个基于字节流
io对象,请大家告诉我为什么这种搞法会有错?我的代码错在哪里?
请师傅们指教!!!
这样不容易出错
InputStream is=client.getInputStream();
BufferedReader br=new BufferedReader(new InputStreamReader(is));
do{
String str=br.readline();
......
}while(!str.eqauls("END"));
ObjectInputStream ois=new ObjectInputStream(is);
....
ois.readObject();好像是BufferedReader多读了一些数据到buffer里,结果把ObjectInputStream的数据破坏了
比如说ObjectInputStream里有5000bytes,2045bytes应该用BufferedReader读,但BufferedReader如果buffersize为2048,读的时候就多读了3bytes,而ObjectInputStream不知道BufferedReader的存在,就丢了3bytes,刚好是ObjectInputStream的头,结果出错.
....
BufferedReader br = new BufferedReader(new InputStreamReader(input),512);
//读入512
String x = br.readLine();//读第一句,读出多少,假设一行80,//还有512-80个在Buffer里
String newx = new String("Server received it:" + x);
BufferedInputStream bs = new BufferedInputStream(input);//不知道 br 里还有512-80个结果:丢了512-80个