本帖最后由 我要的幸福呢 于 2014-2-17 21:17 编辑
问题已明白,看了一下源码,BufferedOutputStream里面缓冲区(也就是一个字节数组)的默认大小是8192字节,当缓冲区中数据达到最大值后就是自动执行flush()操作,将数据刷新出去。我代码的问题就是数据到最后并没有填满BufferedOutputStream的缓冲区,所以没有自动刷新出去,也没有手动刷新(包括bufOut的关闭操作),所以造成了数据丢失。
看过了tcp上传图片的视频之后,自己写的代码,使用了缓冲流(视频中毕老师没用缓冲流),发现了数据丢失的情况,即原图片大小为18999字节,上传后图片大小只有16384字节。经过多次尝试之后,发现加入下面注释的代码之后正常,但是我记得缓冲字节输出流是不用flush刷新的,翻看io流时候的代码也没有。大家帮忙看看问题出在哪里。代码如下- import java.io.*;
- import java.net.*;
- class UploadPicClient
- {
- public static void main(String[] args) throws Exception
- {
- Socket s = new Socket("192.168.31.1",10010);
- BufferedInputStream bis = new BufferedInputStream(
- new FileInputStream("client.png"));
- BufferedOutputStream bufOut = new BufferedOutputStream(
- s.getOutputStream());
- byte[] buf = new byte[1024];
- int len = 0;
- while((len=bis.read(buf))!=-1)
- {
- bufOut.write(buf,0,len);
- //bufOut.flush();//为什么不刷新,就不正常?
- }
- s.shutdownOutput();
- BufferedReader bufIn = new BufferedReader(
- new InputStreamReader(s.getInputStream()));
- System.out.println(bufIn.readLine());
- bis.close();
- s.close();
- }
- }
- class UploadPicServer
- {
- public static void main(String[] args) throws Exception
- {
- ServerSocket ss = new ServerSocket(10010);
- Socket s = ss.accept();
- String ip = s.getInetAddress().getHostAddress();
- System.out.println(ip+" connected...");
- BufferedInputStream bufIn = new BufferedInputStream(
- s.getInputStream());
- BufferedOutputStream bos = new BufferedOutputStream(
- new FileOutputStream("server.png"));
- byte[] buf = new byte[1024];
- int len = 0;
- while((len=bufIn.read(buf))!=-1)
- {
- bos.write(buf,0,len);
- }
- PrintWriter pw = new PrintWriter(s.getOutputStream(),true);
- pw.println("图片上传成功");
- bos.close();
- s.close();
- ss.close();
- }
- }
复制代码
|