0

Ich schreibe eine App-Transfer-Datei-basierte Socket.Wenn ich Datei weniger als 10 MB übertragen, dann egal was passiert.Aber wenn ich Datei über 20mb, dann bekomme ich aus Speicherfehler und crash meine App.ByteArrayOutputStream Out of Memory Fehler beim Senden über Socket

Dies ist mein Code

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

Dieser Fehler ist, die tierten:

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) 

an der Stelle aus dem Speicher:

byte[] aaa = baos.toByteArray(); 

Bitte helfen Sie mir meine code.Thank zu beheben alle .Entschuldigung für mein Englisch.

Antwort

0

Sie fragen nach Problemen, wenn Sie solche großen Dateien vollständig im Speicher ablegen, bevor Sie sie senden.

Ihr Ansatz ist also falsch.

Sie benötigen nur einen kleinen Puffer. Dann machen Sie eine Schleife, in der Sie Chuncks aus der Datei im Puffer lesen und dann die Bytes in diesem Puffer in den Ausgabestrom schreiben.

Auf diese Weise ist es egal, wie groß die Datei ist.

+0

Ich sende nur einen kleinen Puffer mit der Größe ist 1024. – user3625981

+0

In der Tat. Jetzt sehe ich. Aber warum so kompliziert? Entfernen Sie den ByteArrayOutputStream. Weg mit dem ObjectStream. Machen Sie einen Puffer zu einem Byte-Array. Ist outt der Socket-Ausgangsstrom? Lassen Sie es die Bytes im Puffer schreiben. – greenapps