gpt4 book ai didi

java - 如何防止通过 AutoClose InputStream 关​​闭 InputStream

转载 作者:行者123 更新时间:2023-11-29 19:15:57 29 4
gpt4 key购买 nike

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

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 作为 InputStream。此实现打破了 InputStream 的契约(Contract),因为它在第一个 .read() 之后自行关闭,因此当我尝试读取下一个 block 时,我收到 IOException - “流已关闭”。

我不想首先获取整个数组.read(),因为文件可能很大,这会降低性能或调用 OutOfMemory 错误。

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

已更新

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

最佳答案

请不要对它更多的评论投反对票以获取更多信息,但其中包含代码有点长。我认为 AutoCloseInputStream 仅在到达文件末尾时才关闭 inputStream

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

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

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

关于java - 如何防止通过 AutoClose InputStream 关​​闭 InputStream,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43501341/

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