我正在写一个基于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();
请帮我修改我的代码。谢谢。谢谢我的英语。
答案 0 :(得分:0)
如果您在发送之前将这些大文件完全放入内存中,则会遇到麻烦。
所以你的方法是错误的。
你只需要一个小缓冲区。然后创建一个循环,在其中从缓冲区中的文件读取块,然后将该缓冲区中的字节写入输出流。
通过这种方式,文件的大小无关紧要。