Java 如何防止AutoCloseInputStream关闭InputStream
我想做的是:打开大文件的InputStream,按10MB块读取它,上传一个块,读取下一个块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
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没有帮助:(如何重新打开它?