Et RandomAccessFile, comme je t'ai dit plus haut, en parcourant petits bouts par petits bouts?
Et RandomAccessFile, comme je t'ai dit plus haut, en parcourant petits bouts par petits bouts?
justement je suis en train de regarder avec RandomAccessFile (ou plutot RandomAccessContent avec VFS) et j'essaye de comprendre comment ca marche. Apparement faut utilisé la méthode "seek" mais si tu peut m'éclairer sur l'utilisation j'te remercie d'avance
Je ne pense pas que le seek soit utile ( tout du moins avec RandomAccessFile ).
Le principe :
1- tu crées un tableau de byte. La taille de ce tableau sera la quantité d'octets lus et écrits à la fois on l'appellera X.
2- Tu fais un read(monTableau ) ainsi X octets du fichier seront stockés dans le tableau
3- Tu fais un write(monTableau ), le contenu est écrit dans le nouveau fichier.
4- retour au 2-. Tu n'as pas besoin de seek, car celui-ci est fait automatiquement après les méthodes read et write.
Je viens de voir un truc : le seek prend un long en paramètre et non un int qui lui est limité à 2Go, il me parait donc fort logique que RandomAccessFile soit conçu pour dépasser la barre mythique des 32bits d'adressage.
Enfin à tester, car en informatique, mieux vaut se méfier des choses qui paraissent trop logiques...
Ca me semble pas mal ( non testé, fait de suite ). A ça faut rajouter la gestion des exceptions.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 RandomAccessFile f1=new RandomAccessFile("fichierOriginal"); RandomAccessFile f2=new RandomAccessFile("fichierCopie"); int tailleBuffer=32000; byte [] tab=new byte[tailleBuffer]; int nbRead=0; while( (nbRead=f1.read(tab)) != -1 ){ f2.write(tab,0,nbRead); } f1.close(); f2.close();
merci mais par contre avec RandomAccessContent je ne peut pas faire de read(byte[])
c'est d'ailleurs étrange que cela n'existe pas alors que j'ai un write(byte[]) !!!
je suis en train de tester avec RandomAccessContent (equivalent a RandomAccessFile) et j'ai OutofMemoryError des que je veut lire dans le fichier.
j'ai essayé de lire par tout les moyen j'ai toujours la meme erreur.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 RandomAccessContent racIn = file.getContent().getRandomAccessContent(RandomAccessMode.READ); RandomAccessContent racOut = flow.getContent().getRandomAccessContent(RandomAccessMode.READ); int tailleBuffer=5; byte [] tab=new byte[tailleBuffer]; logger.info(racIn.length());//affiche 1418633216 logger.info("!!"+racIn.getFilePointer());//affiche 0 racIn.readByte();
que ce soit avec:
ou encore
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 byte [] tab=new byte[5]; racIn.readFully(tab,0,4);rien y fait je ne comprend pas!!
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 byte [] tab=new byte[5]; racIn.readFully(tab);
tu as essayé byte par byte avec readByte() ?
Pourquoi tu ne prends pas le code donné par iohack?
oui des le premier readByte() ca attend 4 minute et ca me met outofmemoryerror
Tu as regardé dans FileObject les méthodes
- copyFrom ?
- moveTo ?
copyfrom ca me fait pareil
moveto je ne l'ai pas tester puisque, a - que j'me trompe, elle va me virer mon fichier source (ce que je ne veux pas)
mais j'vais tester pour voir
Pourrais-je savoir :
- Où est le fichier source ?
- Où est le fichier destination ?
Il serait intéressant d'avoir un code minimal reproduisant ton problème.
D'où vient la classe IOUtil?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 FileSystemManager fsManager = VFS.getManager(); FileObject srcFile = fsManager.resolveFile( "/mySource" ); FileObject dstFile = fsManager.resolveFile( "/myDestination" ); FileUtil.copyContent(srcFile, dstFile);
Bien le bonjour chez vous
Jowo
le fichier source est sur un serveur ssh et le fichier destination sur un autre serveur ssh
jowo: je ne comprend ce que t'entend par "avoir un code minimal reproduisant ton problème" ?
La classe IOUtils vient de apache commons-io.
Mais FileUtil.copyContent(srcFile, dstFile); me semblait le + adapté mais j'ai l'erreur aussi...
est ce que tu peux reccupéré en local le fichier source ?
en local avec defaultFileReplicator? j'ai pas essayé...
t'as une idee derriere la tete?
Ben en gros si tu peux pas faire de copie directe d'un serveur ssh --> ssh
tu peux peut-être faire ssh-->local-->ssh (peut-être qui sais )
J'entendais que tu nous livres un code minimal du même genre que j'ai posté.
Mais je crains que la librairie tente de lire tout le contenu du fichier en mémoire avant de l'envoyer vers la destination.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 FileSystemManager fsManager = VFS.getManager(); FileObject srcFile = fsManager.resolveFile( "sftp://myusername1:mypassword1@srcHost/pub/downloads/bigfile.tmp" ); FileObject dstFile = fsManager.resolveFile( "sftp://myusername2:mypassword2@dstHost/pub/downloads/dstBigFile.tmp" ); FileUtil.copyContent(srcFile, dstFile); srcFile.close(); dstFile.close();
Bien le bonjour chez vous
Jowo
mon code est exactement similaire au tient
j'ai regarder les sources.
dans FileUtil.copyContent(srcFile, dstFile);
il faitdonc ca plante
Code : Sélectionner tout - Visualiser dans une fenêtre à part InputStream instr =srcFile.getContent().getInputStream();
Question un peu bête:
ça plante immédiatement ou tu remarques une certaine activité avant que l'erreur survienne?
Bien le bonjour chez vous
Jowo
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager