Java输出流需要明白的几点细节

原文:https://my.oschina.net/yibuliushen/blog/727631

输出流必须要注意的一些细节。

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关闭流的时候,才是真正的读取完毕

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值