输出流必需要注意的一些细节。编程
OutputStream---字节输出流
经常使用的实现类:
FileOutputStream---字节文件输出流,write数据后马上写到文件中去
BufferedOutputStream---带缓冲区的字节输出流,数据会先存放到缓存取,缓冲区满的话会自动flush到目的地。
也就是说这个类写数据必需要调用flush方法,不然数据没法写到目的地,固然也能够调用close方法,这个方法关闭流的时候会自动flush缓存
Writer----字符输出流
FileWriter---字符文件输出流,write后,会将字符转换成字节缓存到底层的bytebuffer中去,若是满了(或者调用flush,close方法),才会输出到目的地
BufferedWriter---字符缓冲输出流,writer后,会将字符缓存起来,若是满了(或者调用了flush,close方法),才会输出到目的地
PrintWriter----字符输出流(可当作也是一个包装类,带缓冲区的,与BufferedWriter功能类似) 能够设置自动刷新,使用println(xxx)方法,自动输出到目的地。
若是没有指定自动刷新,必须调用flush或者close方法网络
问题:
1.何时要用flush()方法?
上面的总结能够发现:字节流只有非Buffered的输出流才不须要调用flush() 或者使用了PrintWriter自动刷新了
BufferedOutputStream BufferedWriter PrintWriter(非自动刷新) 都须要显示的调用flush()方法socket
固然close的时候也会刷新,可是可能close的时候报错(这个方法会抛出异常),或者想及时的把数据发送给对方或者输出到文件,最好仍是flush()一下。spa
2.何时用字符流,何时用字节流?
字符操做用writer(最好是BufferedWriter)效率更高,操做方法
若是操做须要换行字符的使用PrintWriter对象
操做二进制文件,图片,音频等数据的时候,用字节流(最好使用BufferedOutputStream,效率高)图片
3. 网络传输过程当中-Socket编程过程当中应该怎么使用输出流,输入流?
发送图片,二进制文件,对象流等---最好使用BufferedOutputStream包装,而后输出字节流,须要flush
发送字符串----最好用BufferedWriter或者PrintWriter包装,而后输出字符串,须要flush
另外:
socket读取的时候,read()操做是阻塞式的,也就是说,除非一端flush或者使用了非包装的字节流,这边才能读取到数据,当对方close关闭流的时候,才是真正的读取完毕字符串