通过套接字发送时ByteArrayOutputStream内存不足错误

时间:2016-03-22 18:41:29

标签: android memory-leaks garbage-collection out-of-memory bytearrayoutputstream

我正在写一个基于Socket的应用程序传输文件。当我传输的文件少于10 mb时,无论发生什么。但是当我传输超过20mb的文件时,我就会出现Out of Memory错误并导致我的应用崩溃。

这是我的代码

RandomAccessFile aFile = new RandomAccessFile(path, "r");
FileChannel inChannel = aFile.getChannel();
ByteBuffer buffer = ByteBuffer.allocate(1024);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
int n;
while ((n = inChannel.read(buffer)) > 0) {
        buffer.flip();
        total_length += n;
        baos.write(buffer.array(), 0, n);
        byte[] aaa = baos.toByteArray();
        ObjectStream obstream = new ObjectStream("stream", aaa, session_request, total_length);
        aaa=null;
        outt.writeObject(obstream);
        obstream = null;
        baos.reset();
        buffer.clear(); // do something with the data and clear/compact it.
}
inChannel.close();
aFile.close();

这是错误:

FATAL EXCEPTION: Thread-177
java.lang.OutOfMemoryError
at java.io.ByteArrayOutputStream.toByteArray(ByteArrayOutputStream.java:122)
at com.jsc.Remote2Droid.Thread.ThreadClientData.run(ThreadClientData.java:705)

位置内存不足:

byte[] aaa = baos.toByteArray();

请帮我修改我的代码。谢谢。谢谢我的英语。

1 个答案:

答案 0 :(得分:0)

如果您在发送之前将这些大文件完全放入内存中,则会遇到麻烦。

所以你的方法是错误的。

你只需要一个小缓冲区。然后创建一个循环,在其中从缓冲区中的文件读取块,然后将该缓冲区中的字节写入输出流。

通过这种方式,文件的大小无关紧要。