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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值