前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >JAVA中关闭OutputStream

JAVA中关闭OutputStream

作者头像
用户7886150
修改2021-04-25 17:45:45
1K0
修改2021-04-25 17:45:45
举报
文章被收录于专栏:bit哲学院bit哲学院

参考链接: Java OutputStream类

2016年03月23日 12:47:44

 今天做项目,在发送完图片之后,关闭了OutputStream,发现程序抛出异常:socket isclosed。软件只需要关闭发送图片的I/O流,不能关闭socket。因此在网上查了一下,发现关闭OutputStream的同时socket也会关闭。

 想要只关闭I/O流而不关闭socket,需要用socket的ShutdownInput/ShutdownOutput。

 以下来自转载:http://blog.csdn.net/zz880329/article/details/7463925

  只要关闭Socket的InputStream或OutputStream其中任何一个,就关闭了Socket,这是不好的关闭方法。正确的方法应该是ShutdownInput/ShutdownOutput。  通常应用程序也可以在OutputStream写一个专门的结束标记替代EOF,然后flush。但在一些专门的编码的Stream里flush和close是有不同语意的,比如chunked编码、比如ZIP压缩等。在这种情况下调用了OutputStream的close就不能再接收任何信息。比如使用ZIP压缩发送和接收数据的例子:发送方:在Socket的OutputStream上封装GZIPOutputStream或DeflaterOutputStream1、发送数据2、发送数据结束标志(此时需要关闭GZIPOutputStream或DeflaterOutputStream,否则不保证全部数据都被发送至对方)3、接收应答4、结束接收方:在Socket的InputStream上封装GZIPInputStream或InflaterInputStream1、接收数据2、收到数据结束标志3、发送数据处理结果4、结束。按道理,发送方在发送完结束标志后应该可以关闭Output了,如果简单的调用了OutputStream.close,JDK的实现就会把InputStream和Socket同时关闭,这显然是不行的。为了正确的实现应用逻辑,就需要做一些额外的、本来不必要的处理。比如需要覆盖SocketOutputStream的close,让它调用Socket.ShutdownOutput,而不调用它的close.

本文系转载,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文系转载前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
文件存储
文件存储(Cloud File Storage,CFS)为您提供安全可靠、可扩展的共享文件存储服务。文件存储可与腾讯云服务器、容器服务、批量计算等服务搭配使用,为多个计算节点提供容量和性能可弹性扩展的高性能共享存储。腾讯云文件存储的管理界面简单、易使用,可实现对现有应用的无缝集成;按实际用量付费,为您节约成本,简化 IT 运维工作。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档