当前位置: 首页 > 知识库问答 >
问题:

如何防止通过自动关闭输入流关闭输入流

贾俊艾
2023-03-14

我想做的是:打开大文件的InputStream,读取10MB的块,上传一个块,读取下一个块。

val chunkCount = Math.ceil(totalSize.toDouble() / chunkSize.toDouble()).toInt()
for (chunkNumber in (0..chunkCount-1)) {
    var chunk = ByteArray(chunkSize)
    val currentChunkSize = inputStream.read(chunk)
    if (chunk.size != currentChunkSize) { //last chunk
        chunk = chunk.copyOf(currentChunkSize)
    }
    // uploading of chunk
}

我为这个任务编写了很好的代码,但问题是ContentResolver返回ParcelFileDescriptor。AutoCloseInputStream作为InputStriam。这个实现打破了InputStream的契约,因为它在first.read()之后自动关闭,所以当我尝试读取下一个块时,我得到了IOException——“流已关闭”。

我不想一开始就得到整个数组。read(),因为文件可能很大,这会降低性能,或者会调用内存错误。

如何防止AutoCloseInputStream关闭InputStream,或者让ContentResolver返回正常的FileInputStream?

更新

问题不在于AutoCloseInputStream,而在于Android系统,如果应用程序内存不足,它会关闭流。

共有2个答案

公羊宇定
2023-03-14

问题不在于自动关闭输入流,而在于Android系统。当内存不足时,它将关闭流。

我通过重新打开流并调用InputStream解决了这个问题。跳过(偏移:长)

常茂
2023-03-14

请不要否决它的更多的额外信息的评论,但有点长的代码。我认为AutoCloseInputStream只在到达文件末尾时关闭InputStream

你需要像这样调用read吗?其中len是块大小,off是最后一个块上传偏移量需要的位置

int read (byte[] b, int off, int len)

类InputStream的read(b,off,len)方法只是重复调用read()方法。如果第一个这样的调用导致IOException,则从对read(b,off,len)方法的调用中返回该异常。如果对read()的任何后续调用导致IOException,则异常被捕获并被视为文件结束;到那时为止读取的字节存储到b中,并返回异常发生之前读取的字节数。

 类似资料:
  • 问题内容: 我在try / catch块中有以下代码 我的问题是,当我必须在finally块中关闭这些流时,是否必须关闭所有3个流,或者仅关闭 befferedreader 会关闭所有其他流? 问题答案: 按照惯例,包装流(用于包装现有流)在关闭时会关闭基础流,因此仅在示例中必须关闭。而且,关闭已经关闭的流通常是无害的,因此关闭所有3个流都不会受到伤害。

  • 问题内容: Java中的InputStreams和OutputStreams是否在销毁时关闭()?我完全理解这可能是错误的形式(尤其是在C和C ++世界中),但是我很好奇。 另外,假设我有以下代码: 无名的FileInputStream是否在p.load()之后超出范围,并因此被破坏,就像C ++范围规则一样?我尝试在Google上搜索Java的匿名变量范围,但这并没有达到我的预期。 谢谢。 问题

  • 我包一个插座。通过InputStreamReader获取getInputStream(),并包装一个套接字。getOutputStream()由OutputStreamWriter创建。我发现这些流的关闭顺序真的很重要,但我不知道为什么。 如果我先关闭outputStream,然后再关闭inputStream,它可以正常工作: 但是,如果我先关闭inputStream,然后再关闭outputStr

  • 当我在Jersey中有一个监听POST请求的方法,并且当我想从中获取数据的方法中有一个InputStream作为参数时,我需要关闭这个InputStream还是Jersey会处理这个问题? 我没有找到任何相关信息。不久前,我读过使用JAX-RS 2.0的RESTful Java,我不记得是否有人提到过它。现在浏览一下,我发现了几个代码示例,并且流没有关闭。我觉得没必要,但我想问问。

  • 我有一些代码,其中多个方法使用键盘,并在主方法中连续调用。我正在做的练习特别要求使用4种不同的方法,所以我不能把它们放在一起。最初,我用键盘。在每个方法的末尾关闭(),但当第二个方法运行时,无论调用顺序如何,这都会导致NoTouchElementException。通过卸下键盘。close(),代码现在可以工作了,但是我现在收到了资源泄漏的警告,因为键盘没有关闭。有人能告诉我一种关闭输入而不出错的

  • 问题内容: 我的网站在iPhone / Safari浏览器上的呈现效果很好,但有一个例外:我的文本输入字段具有一种怪异的圆形样式,与我的网站的其余部分完全不一样。 有没有一种方法可以指示Safari(通过CSS或元数据)不对输入字段进行舍入并按预期将其呈现为矩形? 问题答案: 在iOS 5及更高版本上,出色的技巧可以解决问题: 如果必须仅在iOS上删除圆角,否则由于某些原因不能在跨平台标准化圆角,