【发布时间】:2021-04-23 23:47:42
【问题描述】:
我正在尝试使用此方法将另一个应用程序获取的文件保存到后台线程的内部目录中:
public static File saveUri(Uri uri,File file, WeakReference<Context> contextWeakReference) throws IOException {
ContentResolver resolver=contextWeakReference.get().getContentResolver();
InputStream inputStream=resolver.openInputStream(uri);
ByteArrayOutputStream stream=new ByteArrayOutputStream();
FileOutputStream fileOutputStream=new FileOutputStream(file);
byte[] buffer = new byte[1024];
int bytesRead;
while ((bytesRead = inputStream.read(buffer)) != -1) {
stream.write(buffer, 0, bytesRead);
}
fileOutputStream.write(stream.toByteArray());
fileOutputStream.close();
inputStream.close();
return file ;
}
它可以工作,直到我保存 100 MB 大小的文件。在此之上,它给出了:
java.lang.OutOfMemoryError: Failed to allocate a 134217744 byte allocation with 25165824 free bytes and 124MB until OOM, max allowed footprint 95471864, growth limit 201326592
在这一行:
stream.write(buffer, 0, bytesRead);
这是我用于后台处理的:
public static final ExecutorService databaseWriteExecutor =
Executors.newSingleThreadExecutor();
我应该怎么做才能保存大文件而不导致内存不足错误。
【问题讨论】: