JAVA中关闭OutputStream
2016-03-23 12:47
681 查看
今天做项目,在发送完图片之后,关闭了OutputStream,发现程序抛出异常:socket is
closed。软件只需要关闭发送图片的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或DeflaterOutputStream
1、发送数据
2、发送数据结束标志(此时需要关闭GZIPOutputStream或DeflaterOutputStream,否则不保证全部数据都被发送至对方)
3、接收应答
4、结束
接收方:在Socket的InputStream上封装GZIPInputStream或InflaterInputStream
1、接收数据
2、收到数据结束标志
3、发送数据处理结果
4、结束。
按道理,发送方在发送完结束标志后应该可以关闭Output了,如果简单的调用了OutputStream.close,JDK的实现就会把InputStream和Socket同时关闭,这显然是不行的。为了正确的实现应用逻辑,就需要做一些额外的、本来不必要的处理。比如需要覆盖SocketOutputStream的close,让它调用Socket.ShutdownOutput,而不调用它的close.
closed。软件只需要关闭发送图片的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或DeflaterOutputStream
1、发送数据
2、发送数据结束标志(此时需要关闭GZIPOutputStream或DeflaterOutputStream,否则不保证全部数据都被发送至对方)
3、接收应答
4、结束
接收方:在Socket的InputStream上封装GZIPInputStream或InflaterInputStream
1、接收数据
2、收到数据结束标志
3、发送数据处理结果
4、结束。
按道理,发送方在发送完结束标志后应该可以关闭Output了,如果简单的调用了OutputStream.close,JDK的实现就会把InputStream和Socket同时关闭,这显然是不行的。为了正确的实现应用逻辑,就需要做一些额外的、本来不必要的处理。比如需要覆盖SocketOutputStream的close,让它调用Socket.ShutdownOutput,而不调用它的close.
相关文章推荐
- JAVA中修饰符类型的区别
- JAVA线程生命周期
- JAVA线程引起的CPU满负载
- eclipse中import中的引用都显示错…
- JavaWeb 分页操作
- 图解使用Eclipse的SVN插件创建项目的主干/分支/标签
- Java JTree 实现两棵树之间节点拖拽
- JAVA针式打印机打印整理
- java Socket 短连接和长连接的区别
- JDK各个版本的新特性jdk1.5-jdk8
- Java获得某目录下文件总大小
- JavaAgent(转载)
- java 实现FTP sftp
- spring 的事务及五种配置方式
- Java ArrayList添加item实现,之后再补充
- java工具 使用---1
- java桥接sqlserver数据库
- Java中list泛型插入int或者String字符串并排序
- Java 容器源码分析之1.7HashMap
- Myeclipse的web项目移植到Eclipse中需要添加的包