如何安全地取消InputStream读取?

cot*_*aws 1 java buffer inputstream

从InputStream读取时,有没有办法在读取达到一定大小时取消读取并忽略流的其余部分,确保资源完全释放?

到目前为止,我刚刚完成阅读,但理想情况下我想停止阅读并继续前进.我该如何安全地做到这一点?

这是我到目前为止:

ByteArrayOutputStream buffer = new ByteArrayOutputStream();

int nRead;
byte[] byteData = new byte[16384];

while ((nRead = inputStream.read(byteData, 0, byteData.length)) != -1){

    if(buffer.size() <= MAX_FILE_SIZE){
        buffer.write(byteData, 0, nRead);
    }

}

if(buffer.size() <= MAX_FILE_SIZE){
    buffer.flush();
    mData = buffer.toByteArray();
}

inputStream.close();
Run Code Online (Sandbox Code Playgroud)

谢谢

Ste*_*n C 5

调用close()就JVM及其资源执行您想要的操作.

但是,在某些情况下,它可能具有不合需要的效果.例如,如果输入流(最终)是套接字流,则关闭流将关闭套接字,并且可能导致正在发送数据的远程服务器看到网络错误.(这可能无关紧要,但如果处理不当,您可能会在远程Web服务器的日志文件中看到异常.)


即使它正处于被阅读的中间并且没有完成?

是.任何"飞行中"的数据都将被丢弃.

  • 通过关闭其套接字句柄,该应用程序隐含地表示它不再对数据感兴趣.
  • 在正常情况下1,没有任何其他套接字句柄允许它读取该数据.
  • 其他任何东西都无法重新连接到套接字.套接字API不支持这一点......在操作系统级别.
  • 因此,"保持"数据毫无意义.

(如果我们讨论的是套接字流,那么远程服务器在关闭传播后尝试向套接字写入更多数据时可能会出现异常.但即使发生这种情况,远程服务器也无法知道这个数据有多少在连接上"拉动插头"之前实际读完了.)

此外,缓冲区是否需要以某种方式取消或关闭.

因为它是一个ByteArrayOutputStream,StringBuffers不需要关闭读取/写入内存缓冲区(字节数组)的数据流2.GC可以回收纯粹的内存资源而不会出现任何问题.也BufferedInput/OutputStream并不需要关闭,如果它包裹流并不需要关闭.


1 - 我认为Linux/Unix可以打开套接字,并将其传递给分叉的子进程.但是,父进程和子进程都使用套接字是不切实际的,因为协调它们的使用很困难.此外,您不能在Java进程之间执行此类操作,因为Java ProcessAPI不允许它.

2 - 唯一不适用的假设是当缓冲区是Buffer由共享内存段或内存映射文件支持的NIO时......垃圾收集器可能无法及时回收.我说假设,因为我不认为NIO Buffer对象有现成的流包装器.