程序在尝试打开文件时崩溃

时间:2013-06-17 05:36:54

标签: android

当文件大小非常大时,我的android程序在此行崩溃。有什么办法可以防止程序崩溃吗?

byte[] myByteArray      =   new byte[(int)mFile.length()];

其他详情: - 我正在尝试将文件发送到服务器。 错误日志 -

 E/dalvikvm-heap(29811): Out of memory on a 136309996-byte allocation.

4 个答案:

答案 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。您不需要在内存中包含完整的文件。