0

Je suis en train d'écrire un fichier de transfert d'application basé sur Socket.When je transfère le fichier moins de 10 mb, alors peu importe ce qui se passe.Mais quand je transfère le fichier sur 20mb, alors je sors Erreur de mémoire et crash mon application.ByteArrayOutputStream Erreur de mémoire insuffisante lors de l'envoi sur le socket

C'est mon 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(); 

Cette erreur est geted:

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) 

de mémoire à l'emplacement:

byte[] aaa = baos.toByteArray(); 

S'il vous plaît aider moi réparer mon code.Thank tout .Désolé pour mon anglais.

Répondre

0

Vous demandez des problèmes si vous placez ces gros fichiers complètement en mémoire avant de les envoyer.

Votre approche est donc erronée.

Vous avez seulement besoin d'un petit tampon. Faites ensuite une boucle où vous lisez les chuncks du fichier dans le tampon, puis écrivez les octets dans ce tampon dans le flux de sortie.

De cette façon, peu importe la taille du fichier.

+0

Je n'envoie qu'un petit buffer avec une taille de 1024. – user3625981

+0

En effet. Maintenant, je vois. Mais pourquoi si compliqué? Supprimez le ByteArrayOutputStream. Éliminez l'ObjectStream. Faire un tampon un tableau d'octets. Est-ce que outt le socket sortiestream? Laissez-le écrire les octets dans le tampon. – greenapps