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[] :
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();
	}
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

j'ai donc regardé du coté des FileChannel :
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;
et là ça passe sans soucis sur les gros fichier (~400mo) et la copie de fichiers en local fonctionne sans soucis.

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