OutOfMemoryError avec gros fichier - Java - Programmation
Marsh Posté le 02-10-2006 à 16:58:33
faire ça de manière plus intelligente, en passant par un buffer ?
Marsh Posté le 02-10-2006 à 17:04:36
ben j'la trouve intelligente ma maniere
mais j'vais regarder avec un buffer, merci pour ton avis
Marsh Posté le 02-10-2006 à 17:25:00
avec les buffer j'ai la meme erreur:
j'ai fait:
BufferedInputStream is = new BufferedInputStream(myInputStream);
long l = is.available();
BufferedOutputStream out = new BufferedOutputStream(myOutputStream);
for(long i=0;i<l;i++) {
out.write(is.read());
}
out.flush();
out.close();
is.close();
où 'myInputStream' est l'inputStream de mon fichier source et 'myOutputStream' est l'outputStream de mon fichier cible.
Marsh Posté le 03-10-2006 à 09:01:03
donc maintenant tu vas regarder nio j'imagine ?
Code :
|
(je mets pas le code pour la gestion d'exception, le block finally tout ca hein )
Marsh Posté le 03-10-2006 à 10:01:27
En fait je vient de me rendre compte que ce n'est pas au moment de la copie de fichier que j'ai l'erreur OutOfMemoryError, c'est lorsque je recupere l'inputStream du fichier source:
Code :
InputStream in = file.getContent().getInputStream();
Comment faire autrement? (file est un FileObject de l'API commons-VFS)
Marsh Posté le 03-10-2006 à 10:26:49
zizou771 a écrit : |
bha, surement que ca lit le fichier ... te sers pas de cet objet .... utilise un FileInputStream direct ...
sinon, pour ceux qui veule un code compatible java < 1.4, vla une classe que j'ai souvent l'occasion de refourguer :
Code :
|
et ca s'utilise comme ça :
Code :
|
(avec une gestion d'exception qui va bien )
Marsh Posté le 03-10-2006 à 10:48:10
ReplyMarsh Posté le 03-10-2006 à 10:50:39
zizou771 a écrit : FileInputStream c'est pour du local... |
oui, ben ca marche aussi avec n'importe quel Inpustream que tu auras récupéré de n'importe quelle façon ...
Marsh Posté le 03-10-2006 à 11:53:14
mais c'est dès que je veux recuperer l'Inpustream que ca plante:
InputStream in = file.getContent().getInputStream();
Marsh Posté le 03-10-2006 à 12:00:07
j'ai pas trop le choix si je veux récupérer le contenu non?
Marsh Posté le 04-10-2006 à 10:28:55
je suis en train de tester avec RandomAccessContent (equivalent a RandomAccessFile) et j'ai OutofMemoryError des que je veut lire dans le fichier.
Code :
|
j'ai essayé de lire par tout les moyen j'ai toujours la meme erreur.
que ce soit avec:
Code :
|
ou encore
Code :
|
rien y fait je ne comprend pas!!
Marsh Posté le 04-10-2006 à 10:42:59
t'as été voir les sources de common-VFS ? histoire de voir comment il fait pour les fichiers distants ? parce que si ca se trouve il tente de faire un gros cache local ...
Marsh Posté le 04-10-2006 à 17:42:09
Citation : file est un FileObject de l'API commons-VFS |
Montre nous le code de construction de la variable file
Marsh Posté le 04-10-2006 à 17:50:54
en fait dans les sources il font un:
final InputStream instr = file.getContent().getInputStream();
pour récuperer le contenu du fichier source.
Et ca plante si le fichier est enorme!!
Marsh Posté le 04-10-2006 à 18:15:02
ton FileObject c'est quoi comme classe concrete ? (FileObject n'est qu'une interface)
Marsh Posté le 04-10-2006 à 18:17:17
ben regarde le code source de SftpFileObject et vois comment ce getContent est fait
comme ca tu verras ce qui merde dedans ! ou pas remarque
Marsh Posté le 05-10-2006 à 01:54:04
ben vu que ca fait un OutOfMemory c'est sûr qu'ils récupèrent le flux entier en mémoire => c'est une API de merde ...
Marsh Posté le 02-10-2006 à 16:52:24
Slt,
je veut copier le contenu d'un fichier (10G) dans un autre fichier, donc je fait comme ceci:
IOUtils.copy(is, out);
out.close();
is.close();
où 'is' est l'inputStream de mon fichier source et 'out' est l'outputStream de mon fichier cible.
Seulement voila, dès que mon fichier source commence à faire 1G ou plus j'ai l'erreur OutOfMemoryError.
Quelqu'un aurait une autre idée pour ne pas avoir cet erreur?
Merci d'avance pour votre aide.