[java] Copier des fichiers

Copier des fichiers [java] - Java - Programmation

Marsh Posté le 19-03-2004 à 10:36:54    

J'aimerai copier un ou plusieurs fichiers depuis un répertoire partagé sur un de mes serveurs sur mon disque local. Quelqu'un aurai un bout de code prêt à l'emploi ?
 
Je précise : je suis complètement nouveau au Java (merci de votre indulgence si je comprend rien), je connais pas mal Delphi mais je trouve pas de fonctions équivalentes à celles que j'utilisais en Delphi...

Reply

Marsh Posté le 19-03-2004 à 10:36:54   

Reply

Marsh Posté le 19-03-2004 à 10:41:30    

http://forum.hardware.fr/forum2.ph [...] 0&subcat=0
Même si le lien est pas évident à trouver, y a une fonction "Recherche avancée" en haut à droite de la page :o

Reply

Marsh Posté le 19-03-2004 à 10:47:26    

'faudrait dire à Joce (c'est bien lui qui développe le forum Présence PC, non ?) de faire comme sur JGuru. Une fonctionnalité génial j'trouve :
Quand tu postes un nouveau topic, avant de valider le topic, il te faire une recherche dans le forum sur les termes du sujet. Ensuite, si on a effectuvement rien trouvé, il faut confirmer le post.


---------------
Les Vers Solitaires, on aime ... ou pas !
Reply

Marsh Posté le 19-03-2004 à 10:48:32    

Ba surtout, faut éviter de rendre le lien vers la recherche encore plus invisible [:kiki] Avant c'était à peu près visible, y avait une image et tout ; maintenant c'est plus qu'un pôv lien de base tout caché...

Reply

Marsh Posté le 19-03-2004 à 10:56:28    

Merci quand même, j'avais trouvé ce post, mais c'est pas top comme solution, je pensais qu'il existait quelque chose de tout encapsulé dans une procedure.
 
 
    public static void copyFileBuffered(final String currentFile, final String newFile, final int bufferSize) throws FileNotFoundException, IOException {  
        final BufferedReader in = new BufferedReader(new FileReader(currentFile), bufferSize * 1024);  
        try {  
            final BufferedWriter out = new BufferedWriter(new FileWriter(newFile), bufferSize * 1024);  
            try {  
                int s = in.read();  
                while(s != -1) {  
                    out.write(s);  
                    s = in.read();  
                }//end while  
                out.flush();  
              } finally {  
                out.close();  
            }//end try  
          } finally {  
            in.close();  
        }//end try  
    }//end copyFileBuffered
 
 
J'arrive pas à faire tourner ce code, je des problème avec les exceptions.


Message édité par Titalium le 19-03-2004 à 10:57:29
Reply

Marsh Posté le 19-03-2004 à 10:58:37    

Titalium a écrit :

Merci quand même, j'avais trouvé ce post, mais c'est pas top comme solution, je pensais qu'il existait quelque chose de tout encapsulé dans une procedure.


Ba non y a pas ; c'est vrai que c'est un peu regrettable mais c'est comme ça [:spamafote]

Reply

Marsh Posté le 19-03-2004 à 11:02:11    

Titalium a écrit :

Merci quand même, j'avais trouvé ce post, mais c'est pas top comme solution, je pensais qu'il existait quelque chose de tout encapsulé dans une procedure.
 
 
    public static void copyFileBuffered(final String currentFile, final String newFile, final int bufferSize) throws FileNotFoundException, IOException {  
        final BufferedReader in = new BufferedReader(new FileReader(currentFile), bufferSize * 1024);  
        try {  
            final BufferedWriter out = new BufferedWriter(new FileWriter(newFile), bufferSize * 1024);  
            try {  
                int s = in.read();  
                while(s != -1) {  
                    out.write(s);  
                    s = in.read();  
                }//end while  
                out.flush();  
              } finally {  
                out.close();  
            }//end try  
          } finally {  
            in.close();  
        }//end try  
    }//end copyFileBuffered
 
 
J'arrive pas à faire tourner ce code, je des problème avec les exceptions.


Koi ??? Il ne te plait pas mon code ???  ;)


---------------
Light is right
Reply

Marsh Posté le 19-03-2004 à 11:05:23    

nerisson a écrit :


Koi ??? Il ne te plait pas mon code ???  ;)  


 
Si, si, ça vient petit à petit, comme je l'ai dit, je suis pas du tout rompu au Java, c'est pour ça que des choses toute simple me paraissent pas forcément claires... Là, j'ai réussi à importer les bonnes classes (je suis trop fort :D), mais quand j'appelle la fonction en question dans mon code, j'ai l'erreur de compilation suivante :
 
MainProgram.java [28:1] unreported exception java.io.FileNotFoundException; must be caught or declared to be thrown
            copyFileBuffered("kiki", "koko", 2048);
            ^
1 error
Errors compiling MainProgram.
 
Je sais plus comment on "catch" une exception, d'où mon souci... Je vous avais prévenu, je suis tout nouveau sur Java...;)

Reply

Marsh Posté le 19-03-2004 à 11:10:55    

C'est bon j'ai trouvé, je vais tester ma copie...
 
Au fait, pour effecer un fichier, on fait comment ? Ou au moins pour effacer tout son contenu ?

Reply

Marsh Posté le 19-03-2004 à 11:11:22    

File.delete()
Mate la javadoc hein, c'est utile :o

Reply

Marsh Posté le 19-03-2004 à 11:11:22   

Reply

Marsh Posté le 19-03-2004 à 11:33:05    

C'est bien ce que je fais, mais vous trouvez vraiment que c'est facile de trouver des choses dans la JavaDoc quand on sait pas par où chercher ?
 
En tout cas merci de me répondre, c'est sympa.

Reply

Marsh Posté le 19-03-2004 à 11:45:46    

Titalium a écrit :

C'est bien ce que je fais, mais vous trouvez vraiment que c'est facile de trouver des choses dans la JavaDoc quand on sait pas par où chercher ?


Ba les opérations sur les fichiers, j'trouve pas dur de penser à aller regarder dans java.io.File :o

Reply

Marsh Posté le 19-03-2004 à 12:02:45    

Quand on sait les choses, tout parait évident, c'est sur. Personnellement j'avais pris l'habitude de taper le mot que je cherchais dans mon éditeur de texte, de positionner mon curseur dessus puis d'appuyer sur F1, après c'était l'aide de Delphi qui faisait le travail et me proposait les correspondances.
 
Je sais qu'on peut pas demander la lune, mais je trouvais ça pratique, car pas besoin de connaitre tout sur le bout des doigts pour aller à l'information. Enfin, je vais m'y faire.
 
Du coup j'ose plus poser de questions, j'ai peur de me faire gronder, pourtant j'en ai encore une ou deux :D

Reply

Marsh Posté le 19-03-2004 à 12:07:14    

Titalium a écrit :


Du coup j'ose plus poser de questions, j'ai peur de me faire gronder, pourtant j'en ai encore une ou deux :D


Bin faut pas. Avant de poser la question, demande-toi :
* peux-tu trouver facilement un package de la Javadoc qui contienne éventuellement une classe qui fasse ce que tu cherches ? Par exemple, pour une connexion HTTP, c'est du réseau -> java.net. Système de fichiers, lecture/écriture, etc... -> java.io. Et ainsi de suite.
* la question se réfere-t-elle à des notions de base ? Si oui, il y a de très fortes chances qu'elle ait été discutée sur ce forum -> lien (bien caché il est vrai) Recherche avancée en haut à droite de la page. Sinon, Google avec les mots-clés bien renseignés te trouvera certainement ce que tu cherches.
 
Si rien de tout ce la ne peut t'aider, poste la question dans le forum. Le tout est de savoir se débrouiller tout seul, après ça roule nickel sans souci :o

Reply

Marsh Posté le 19-03-2004 à 13:16:11    

Je cherche encore un peu avant de poser quelques questions, mais voila ce que je peux répondre :
 
* le package à importer et dans lequel je vais trouver les choses, je cherche dans la JavaDoc, OK. Mais pour moi, java.io pour accéder aux fichiers, c'est pas forcément évident. Une fois qu'on sait quel package c'est forcément ça tombe sous le sens (io pour Input Output j'imagines, bon sang mais c'est bien sur ;)). Mais les noms de packages, même s'ils sont généralement bien choisis ne correspondent pas forcément aux mots clés qui viennent à l'esprit.
* pour ce quiest de la recherche, je suis un ancien du forum, je la connais bien, mais là encore, il suffit de ne pas se servir du bon mot clé et on ne trouveras jamais l'infos. La preuve que je connais la recherche, j'avais bien trouvé le topic de nerisson, mai je pensais qu'il existait une méthode plus simple, d'où mon topic.
* pour ce qui est de google, je peux pas m'en servir. Oui, là je suis au boulot, je développe (ou tout du moins j'essaie) un petit truc pour la première fois en Java, j'aimerai bien me servir du net. Or, je n'ai accès qu'à très peu de site en raison du proxy qui me bloque 99% des sites. J'ai accès au forum, c'est déjà très bien mais si je fais une recherche sur Google (auquel j'ai également accès), je ne pourrai accéder à aucune réponse car crac : page bloquée sur le proxy.
 
De tout cela, comprenez bien que je sais que je fais chier avec mes questions de débutant, mais j'ai pas trop le choix, parce que j'ai pas accès aux ressources les plus utiles quand on développe : les sites de prog !
 
Sur ce, je cherche encore un peu mon truc qui m'embête sur mon projet, et si je trouve pas je reviens poser timidement une question :D Au fait, j'ai installé Forte (je suis habitué à développé en RAD pour le graphique, c'est pour ça que je me suis pas mis sous Eclipse).

Reply

Marsh Posté le 19-03-2004 à 14:11:33    

Titalium a écrit :


* pour ce qui est de google, [...] je ne pourrai accéder à aucune réponse car crac : page bloquée sur le proxy.


Essaie de voir la page en cache, ça peut aider à contourner :D

Reply

Marsh Posté le 19-03-2004 à 15:40:23    

Je suis en train de chercher :
 
* Comment lancer un soft depuis mon appli. J'ai trouvé ce thread :
http://forum.hardware.fr/forum2.ph [...] subcat=390
Mais je comprend pas tout, ils parlent d'une classe Program, mais je trouve pas où elle est... et pourtant j'ai cherché dans la JavaDoc :D

Reply

Marsh Posté le 19-03-2004 à 15:48:12    

Bon, j'ai trouvé, je passe par :  
 
Runtime.getRuntime().exec("macommande" );
 
Pas facile tous les jours quand même :D

Reply

Marsh Posté le 19-03-2004 à 15:56:41    

Titalium a écrit :

Je suis en train de chercher :
 
* Comment lancer un soft depuis mon appli. J'ai trouvé ce thread :
http://forum.hardware.fr/forum2.ph [...] subcat=390
Mais je comprend pas tout, ils parlent d'une classe Program, mais je trouve pas où elle est... et pourtant j'ai cherché dans la JavaDoc :D


Ah yaisse :lol:
C'était le délire du moment ; y a une API pour faire des interfaces graphiques qui s'appelle SWT (c'est fait par les gars qui ont développé Eclipse). Et dans cette API, y a une classe qui s'appelle Program et qui permet de lancer des applis. Comme je cautionne l'utilisation de cette API face à la merde qu'est Swing (:o), j'ai fait mon relou ce jour-là [:ddr555]
Maintenant, pour faire ça, le plus simple est efectivement la méthode que t'as trouvée avec Runtime :D

Reply

Marsh Posté le 19-03-2004 à 16:04:12    

Bon alors là je pense que j'ai un vrai problème...
 
J'utilise le code de nerisson pour faire ma copie de fichier. Je vous explique pour quoi je m'en sers. Les postes de ma boite tournent sur Lotus Notes. On a un répertoire partagé qui contient un dossier correspondant à chaque User du domaine NT et qui contient les fichiers user.id, bookmark.nsf, desktop5.dsk et names.nsf de chaque utilisateur. C'est pour qu'on ai une sauvegarde de ces fichiers.
Le but de mon appli, qui fonctionne maintenant, est :
- à la connexion d'un User sur le domaine, l'appli se lance.
- elle récupère le nom de l'utilisateur
- elle supprime les fichiers cités plus haut en local
- elle recopie les fichiers du rep de sauvegarde en local
- elle lance Lotus
De cette manière, un User, quel que soit le poste sur lequel il se trouve, retrouve sa boite mail, son environnement Notes, etc...
 
Le pb est le suivant : l'application se comporte comme il faut (elle supprime les fichier si besoin, recopie ceux de sauvegarde en local et lance Notes), mais là quand Notes se lance, il m'indique des fichiers altérés et l'impossibilité de se lancer :/
J'ai essayé de faire une copie manuelle depuis l'explorateur Windows avec les même fichiers que ceux recopiés par l'application : Lotus se lance sans souci. C'est donc bien la copie de l'appli Java qui merde et pas les fichiers qui sont réellement altérés :cry:
 
Que faire ?

Reply

Marsh Posté le 19-03-2004 à 16:28:13    

Il fo utiliser autre chose qu'un FileReader/FileWriter.
Ces 2 classes servent a lire/ecrire des fichiers texte.


---------------
Light is right
Reply

Marsh Posté le 19-03-2004 à 16:38:42    

Salut, est-ce-que tu as regardé l'API suivante qui comporte des méthodes utilitaires orientées I/O ?
 
http://jakarta.apache.org/commons/io/
 
En particulier la classe FileUtils


Message édité par machinbidule1974 le 19-03-2004 à 16:39:23
Reply

Marsh Posté le 19-03-2004 à 18:18:12    

nerisson a écrit :

Il fo utiliser autre chose qu'un FileReader/FileWriter.
Ces 2 classes servent a lire/ecrire des fichiers texte.


 
Autre chose oui, mais quoi ?
 

machinbidule1974 a écrit :

Salut, est-ce-que tu as regardé l'API suivante qui comporte des méthodes utilitaires orientées I/O ?
 
http://jakarta.apache.org/commons/io/
 
En particulier la classe FileUtils


 
Je jette un oeil de suite, mais je pourrai rien tester avant Lundi, je suis en WE :) :D

Reply

Marsh Posté le 22-03-2004 à 09:59:24    

Bon, j'ai résolu mon pb avec un FileInputStream et un FileOutputStream de la manière suivante :
 

Code :
  1. public static void copyFileBuffered(final String currentFile, final String newFile) throws FileNotFoundException, IOException {
  2.         FileInputStream in = new FileInputStream(currentFile);
  3.         try {
  4.             FileOutputStream out = new FileOutputStream(newFile);
  5.             try {
  6.                 byte[] byteBuffer = new byte[in.available()];
  7.                 int s = in.read(byteBuffer);
  8.                 out.write(byteBuffer);
  9.                 out.flush();
  10.             } finally {
  11.                 out.close();
  12.             }
  13.         } finally {
  14.             in.close();
  15.         }
  16.     }


 
Ici, je pense que si je passe des fichiers trop gros ça va merder non ? En tout cas, là pour mes fichiers de Lotus, c'est nickel. Merci à tous pour votre aide, c'était super sympa. Vu que je me met petit à petit au Java, je pense qu'on aura l'occasion de se recroiser ;)

Reply

Marsh Posté le 22-03-2004 à 10:30:34    

Titalium a écrit :

Ici, je pense que si je passe des fichiers trop gros ça va merder non ?


ben oui ... elle est bizarre ta méthode : y  totu pour faire de la bufferisation, mais y en a pas.


---------------
ma vie, mon oeuvre - HomePlayer
Reply

Marsh Posté le 22-03-2004 à 10:35:30    

Titalium a écrit :

Code :
  1. public static void copyFileBuffered(final String currentFile, final String newFile) throws FileNotFoundException, IOException {
  2.         FileInputStream in = new FileInputStream(currentFile);
  3.         try {
  4.             FileOutputStream out = new FileOutputStream(newFile);
  5.             byte[] buffer = new byte[1024*4];
  6.             // ca peut être bien de rendre la taille du buffer paramétrable
  7.             int nbRead;
  8.             try {
  9.                while ((nbRead = in.read(buffer)) != -1) {
  10.                   out.write(buffer, 0, nbRead);
  11.                }
  12.             } finally {
  13.                 out.close();
  14.             }
  15.         } finally {
  16.             in.close();
  17.         }
  18.     }




---------------
ma vie, mon oeuvre - HomePlayer
Reply

Marsh Posté le 25-03-2004 à 10:12:07    

Merci beaucoup, c'est vrai que c'est mieux comme ça, faut avouer.
 
Maintenant, comment optimiser la vitesse de copie ? C'était plus rapide sans buffer, mais pas compatible avec tout les fichiers. Maintenant c'est compatibles avec tout type de fichiers, mais plus lent (pas beaucoup mais un peu). Comment optimiser ? Je pense que c'est en jouant sur la taille du buffer, mais je sais pas trop dans quel sens il faut aller... Buffer plus grand ? plus petit ?

Reply

Marsh Posté le 25-03-2004 à 17:50:59    

+ le buffer est gros, + le nb de lectures sur disques pour lire le contenu d'un fichier est petit.
 
Donc en augmentant la taille de ton buffer, tu es censé optimiser la copie vue qu'une opération de type I/O est assez lente...  
 
EN fait, tu dois faire un compromis entre espace mémoire (taille du buffer) / charge CPU (opérations de type I/O). Au pif, un buffer de 256Ko devraient suffire ?

Reply

Marsh Posté le 25-03-2004 à 17:57:36    

Au dela de quelques Ko de cache ca ne sert plus a rien.
16Ko devrait suffire.


---------------
Light is right
Reply

Marsh Posté le 25-03-2004 à 17:58:40    

ok, je le note  ;)


Message édité par machinbidule1974 le 25-03-2004 à 17:58:52
Reply

Marsh Posté le 25-03-2004 à 18:47:53    

Ce que je vois le plus fréquement c'est 1Ko ou 4Ko ...


---------------
ma vie, mon oeuvre - HomePlayer
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed