Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/353.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何防止AutoCloseInputStream关闭InputStream_Java_Android_Inputstream - Fatal编程技术网

Java 如何防止AutoCloseInputStream关闭InputStream

Java 如何防止AutoCloseInputStream关闭InputStream,java,android,inputstream,Java,Android,Inputstream,我想做的是:打开大文件的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(c

我想做的是:打开大文件的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作为InputStream返回。这个实现打破了InputStream的约定,因为它在first.read()之后会自动关闭,所以当我尝试读取下一个块时,我会得到IOException—“流已关闭”

我不想一开始就获取整个数组。read(),因为文件可能很大,并且会使性能恶化,或者会调用OutOfMemory错误

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

已更新


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

请不要对更多信息进行向下投票,这更多是一个注释,但其中包含代码。 我认为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中,并返回异常发生前读取的字节数

问题不在AutoCloseInputStream中,而是在Android系统中。它在内存不足时关闭流


我通过重新打开流并调用InputStream.skip(offset:long)解决了这个问题。

这不是Java。它可能是Scala或JavaScript。不清楚您在问什么。@EJP代码不是Java,而是Kotlin。但这是Java的问题。InputStream和AutoCloseInputStream是java类,但事实证明并非如此。我希望一个带有Java标记的问题不包含非Java代码。请调整您的标签。或者删除您的问题。我已经在使用此函数的别名:public int read(byte b[])抛出IOException{return read(b,0,b.length);}//代码取自java.io.InputStream sourceok,这很有意义。你有没有尝试过在之后立即调用read,看看它是否返回-1从api文档中我的直觉告诉我这可能是一个文件结束问题。如果你是对的,问题不在AutoCloseInputStream中,而是在Android系统中。它在内存不足时关闭流。将android:largeHeap设置为true没有帮助:(如何重新打开它?