0

当文件很大时,我的 android 程序在这条线上崩溃。有什么办法可以防止程序崩溃?

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

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

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

4 回答 4

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); 
}

希望这足够清楚,可以满足您的需求。

于 2013-06-17T06:11:00.007 回答
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);
于 2013-06-17T05:44:13.870 回答
0

是的。不要试图一次将整个文件读入内存......

如果您真的需要内存中的整个文件,您可能会更幸运地为每一行分配动态内存并将这些行存储在列表中。(您可能可以获得一堆较小的内存块,但不是一大块)

在不知道我们无法分辨的上下文的情况下,通常您会将文件解析为数据结构,而不是将整个文件存储在内存中。

于 2013-06-17T05:50:32.053 回答
0

不要尝试将完整的文件读入内存。而是打开一个流并逐行处理文件(它是文本文件)还是部分处理。如何完成取决于您要解决的问题。

编辑:你说你想上传一个文件,所以请检查这个问题。您不需要将完整的文件保存在内存中。

于 2013-06-17T05:51:51.700 回答