输出流必须要注意的一些细节。
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()方法
当然close的时候也会刷新,但是可能close的时候报错(这个方法会抛出异常),或者想及时的把数据发送给对方或者输出到文件,最好还是flush()一下。
2.什么时候用字符流,什么时候用字节流?
字符操作用writer(最好是BufferedWriter)效率更高,操作方法
如果操作需要换行字符的使用PrintWriter
操作二进制文件,图片,音频等数据的时候,用字节流(最好使用BufferedOutputStream,效率高)
3. 网络传输过程中-Socket编程过程中应该怎么使用输出流,输入流?
发送图片,二进制文件,对象流等---最好使用BufferedOutputStream包装,然后输出字节流,需要flush
发送字符串----最好用BufferedWriter或者PrintWriter包装,然后输出字符串,需要flush
另外:
socket读取的时候,read()操作是阻塞式的,也就是说,除非一端flush或者使用了非包装的字节流,这边才能读取到数据,当对方close关闭流的时候,才是真正的读取完毕