gpt4 book ai didi

java - 如何安全地取消 InputStream 读取?

转载 作者:行者123 更新时间:2023-11-29 07:20:45 25 4
gpt4 key购买 nike

当从 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();

谢谢

最佳答案

调用 close()对 JVM 及其资源做您想做的事。

但是,在某些情况下,它可能会产生不良影响。例如,如果输入流(最终)是一个套接字流,那么关闭流就会关闭套接字,并且 take 可能会导致正在发送数据的远程服务器看到网络错误。 (这可能无关紧要,但如果处理不干净,您很可能会在远程网络服务器的日志文件中看到异常。)


Even if it was in the middle of being read and doesn't finish?

是的。任何“正在运行”的数据都将被丢弃。

  • 通过关闭其套接字句柄,此应用程序隐含地表明它不再对数据感兴趣。
  • 在正常情况下1,没有其他任何东西具有允许它读取该数据的套接字句柄。
  • 没有任何其他方法可以重新连接到套接字。套接字 API 不支持……在操作系统级别。
  • 因此,“保留”数据毫无意义。

(如果我们讨论的是套接字流,那么如果远程服务器在关闭传播后试图向套接字写入更多数据,则它可能会得到一个异常。但即使发生这种情况,远程服务器在连接“拔掉插头”之前,服务器无法知道这一端实际读取了多少数据。)

Also, does the buffer need to be somehow cancelled or closed as well.

因为它是 ByteArrayOutputStream , 不需要。从内存缓冲区(字节数组,StringBuffers)读取/写入的流不需要关闭2。 GC 可以毫无问题地回收纯内存中的资源。还有一个BufferedInput/OutputStream不需要关闭如果它包装的流不需要关闭。


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

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

关于java - 如何安全地取消 InputStream 读取?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4990058/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com