bonjour à tous,
voilà, mon problème concerne l'envoi de gros fichiers via un Socket.
actuellement je lit le fichier local et je mets ça dans un byte[] :
pour les petits fichiers (< 20mo) aucun soucis mais les gros fichiers ne passent pas à cause d'une Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 public static byte[] read (File filePath) throws IOException { InputStream is = new BufferedInputStream(new FileInputStream(filePath)); byte[] bytesArray = new byte[(int) filePath.length()]; is.read(bytesArray, 0, bytesArray.length); ByteArrayOutputStream os = new ByteArrayOutputStream(bytesArray.length); os.write(bytesArray, 0, bytesArray.length); return os.toByteArray(); }
j'ai donc regardé du coté des FileChannel :
et là ça passe sans soucis sur les gros fichier (~400mo) et la copie de fichiers en local fonctionne sans soucis.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 FileChannel in = new RandomAccessFile(filePath, "rw").getChannel(); MappedByteBuffer map = null; try { map = in.map(MapMode.READ_WRITE, 0, in.size()); } finally { in.close(); } return map;
mais problème, si j'essai d'envoyer ça dans un ObjectInputStream (créer à partir de l'inputStream du socket) il me sort exception "not serializable" ce qui après coup ne m'étonne guère vu que le retour de mon read renvoie un MappedByteBuffer qui n'implèmente pas serializable.
Sachant qu'actuellement je communique d'un bout à l'autre du socket via des object(input/output)stream. il doit bien y avoir une solution du coté des channel mais je ne voit pas comment mettre ça en place![]()
Partager