当文件大小非常大时,我的android程序在此行崩溃。有什么办法可以防止程序崩溃吗?
byte[] myByteArray = new byte[(int)mFile.length()];
其他详情: - 我正在尝试将文件发送到服务器。 错误日志 -
E/dalvikvm-heap(29811): Out of memory on a 136309996-byte allocation.
答案 0 :(得分:1)
阅读文件时应使用流。由于您已经提到过发送到服务器,因此您应该将该文件流式传输到服务器。
正如其他人所提到的,你应该考虑你的数据大小(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);
}
希望足够清楚,以满足您的需求。
答案 1 :(得分:0)
在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);
答案 2 :(得分:0)
是的。不要试图立即将整个文件读入内存......
如果你真的需要内存中的整个文件,你可能会为每一行分配动态内存并将这些行存储在一个列表中。 (你可能会得到一堆较小的内存但不是一大块)
在不知道我们无法分辨的上下文的情况下,通常您会将文件解析为数据结构,而不是仅将整个文件存储在内存中。
答案 3 :(得分:0)
不要尝试将完整的文件读入内存。而是打开流并逐行处理文件(是文本文件)还是部分处理。如何做到这一点取决于你试图解决的问题。
编辑:您说您要上传文件,请查看此question。您不需要在内存中包含完整的文件。