当文件很大时,我的 android 程序在这条线上崩溃。有什么办法可以防止程序崩溃?
byte[] myByteArray = new byte[(int)mFile.length()];
其他详细信息:- 我正在尝试将文件发送到服务器。错误日志-
E/dalvikvm-heap(29811): Out of memory on a 136309996-byte allocation.
当文件很大时,我的 android 程序在这条线上崩溃。有什么办法可以防止程序崩溃?
byte[] myByteArray = new byte[(int)mFile.length()];
其他详细信息:- 我正在尝试将文件发送到服务器。错误日志-
E/dalvikvm-heap(29811): Out of memory on a 136309996-byte allocation.
读取文件时应该使用流。由于您提到发送到服务器,您应该将该文件流式传输到服务器。
正如其他人所提到的,您应该考虑您的数据大小(1GB 似乎过多)。我没有对此进行测试,但代码中的基本方法如下所示:
// open a stream to the file
FileInputStream fileInputStream = new FileInputStream(filePath);
// open a stream to the server
HttpURLConnection connection = new URL(url).openConnection();
DataOutputStream outputStream = new DataOutputStream(connection.getOutputStream());
byte[] buffer = new byte[BUFFER_SIZE]; // pick some buffer size
int bytesRead = 0;
// continually read from the file into the buffer and immediately write that to output stream
while ((bytesRead = fileInputStream.read(buffer)) != -1) {
outputStream.write(buffer);
}
希望这足够清楚,可以满足您的需求。
在 JDK 7 中,您可以使用Files.readAllBytes(Path)
.
例子:
import java.nio.file.Files;
import java.nio.file.Paths;
import java.nio.file.Path;
Path path = Paths.get("path/to/file");
byte[] myByteArray = Files.readAllBytes(path);
是的。不要试图一次将整个文件读入内存......
如果您真的需要内存中的整个文件,您可能会更幸运地为每一行分配动态内存并将这些行存储在列表中。(您可能可以获得一堆较小的内存块,但不是一大块)
在不知道我们无法分辨的上下文的情况下,通常您会将文件解析为数据结构,而不是将整个文件存储在内存中。
不要尝试将完整的文件读入内存。而是打开一个流并逐行处理文件(它是文本文件)还是部分处理。如何完成取决于您要解决的问题。
编辑:你说你想上传一个文件,所以请检查这个问题。您不需要将完整的文件保存在内存中。