黑马程序员技术交流社区

标题: 小细节让我足足郁闷了三小时. ---BufferedOutputStream [打印本页]

作者: 范龙彬    时间: 2011-11-25 11:38
标题: 小细节让我足足郁闷了三小时. ---BufferedOutputStream
本帖最后由 范龙彬 于 2011-11-25 14:14 编辑

网络编程...中上传图片代码
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;


public class Test7 {
        public static void main(String[]args) throws IOException{
                Socket s =new Socket("127.0.0.1",10003);
                BufferedInputStream  bufi =new BufferedInputStream(new FileInputStream("d:\\123.jpg"));
                BufferedOutputStream bufo =new BufferedOutputStream(s.getOutputStream());
                byte [] buf =new byte[1024];
                int len =0;
                while((len=bufi.read(buf))!=-1){
                        bufo.write(buf,0,len);
                }
       
                s.shutdownOutput();
                BufferedInputStream  bufr =new BufferedInputStream(s.getInputStream());
                byte [] nuf =new byte [1024];
                bufr.read(nuf);
                System.out.println(new String(nuf));
        }
}
class PicServe{
        public static void main(String[]args) throws IOException{
                ServerSocket ss =new ServerSocket(10003);
                Socket  s= ss.accept();
                System.out.println(s.getLocalAddress());
                BufferedInputStream  bufi =new BufferedInputStream(s.getInputStream());
                byte [] buf =new byte[1024];
                int len =0;
                        BufferedOutputStream bufo  =new BufferedOutputStream(new FileOutputStream("D:\\345.jpg"));
                while((len =bufi.read(buf))!=-1){
                        bufo.write(buf,0,len);
                }
               
        /*        OutputStream out =s.getOutputStream();
                out.write("上传成功".getBytes());*/
                BufferedOutputStream  bufoo =new BufferedOutputStream(s.getOutputStream());
                bufoo.write("上传成功".getBytes());
                bufoo.flush();  //   小小的一个刷新足足让我郁闷三小时..               
               
        }
}


 OutputStream 的write方法可以自动刷新 
经过测试 查找相关文档发现 BufferedOutputStream  为了节约了计算机资源,避免每次都调用一次写入流的操作 .加入了一个byte[] 数组  ..这里要注意的是它不具备自动刷新功能.大家小心..

可能是因为上面的问题秀住大脑了,有一个问题一直没有想通
这段代码出现了数据丢失..
3.52M的文件上传完却变成了 3.5M  为什么  求解

该贴已经同步到 范龙彬的微博
作者: 刘一扬    时间: 2011-11-25 11:45
传输的时候没刷流,导致数据丢失,没有传递到目的端
while((len=bufi.read(buf))!=-1){
                        bufo.write(buf,0,len);
                        bufo.flush();                 //刷流
                }

while((len =bufi.read(buf))!=-1){
                        bufo.write(buf,0,len);
                       bufo.flush();                //刷流
                }


作者: 幽雅    时间: 2014-5-3 18:04
:)路过  看看
作者: yang649981273    时间: 2014-9-6 21:05
flush():赞,我也卡在这卡半天,看了你的我才弄出来这里和视频有一些出入?




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2