# [java] dupliquer un fichier



## Pivo (27 Janvier 2004)

Hello! Je me doute que ce que je demande paraît simple, mais je suis un peu à la bourre... Je cherche à faire l'équivalent  ou presque de commande-D en java:

J'ai un fichier fichier.xml dans le répertoire de travail de mon application java:

file = fTraduire.jFileChooser1.getSelectedFile();
dupliquer(file);

 et je veux créer une méthode dupliquer(fichier) qui me donnerait dans le même répertoire fichier.xml (sans changement) et fichier_traduit.xml qui serait juste une copie de fichier.xml

Et je maitrise pas trop les java.io etc :-( Je souhaite juste une méthode générale, après je me débrouille avec les try, catch et compagnie

Merci du fond du coeur, je dois rendre ce programme demain mercredi...


----------



## Sylvain_G (27 Janvier 2004)

Il n'y a pas de solution clef en main dans le JDK.
La seule solution est d'ouvrir le fichier source en lecture et lire octet par octet pour le recracher dans le fichier destination.
Ca a l'air un poil bourrin, mais c'est de toutes façon ce qui est fait par un cp du shell... alors pourquoi se priver.
J'ai un bout de code qui devrait d'aider, même si tu ne peux pas le reprendre tel-quel.

Cette méthode est utilisée pour ajouter un fichier dans un fichier zip. Remplace le ZipOutputStream par un FileOutputStream et l'affaire est conclue.
Les autres paramètres concernent le ZIP, donc ils te seront inutiles.

<font class="small">Code:</font><hr /><pre>  
    /** Add a file to the archive.
     */
    public static void addFile( 
        ZipOutputStream out,
        String          filePath,
        String          directory,
        String          comment
     )
    {
        try
        {
            File                inFile     = new File( filePath );
            FileInputStream     inStream   = new FileInputStream( inFile );
            BufferedInputStream inBuffered =
                new BufferedInputStream( inStream );

            // Add this file as an entry into the archive...
            ZipEntry zipEntry =
                new ZipEntry( 
                    directory + ProfileManager.getFileSeparator(  ) +
                    inFile.getName(  )
                 );
            out.putNextEntry( zipEntry );

            final int BLOCK_SIZE = 2048;
            byte[ ]   rawData = new byte[BLOCK_SIZE];
            int       count   = 0;

            try
            {
                while ( 
                    ( count = inBuffered.read( rawData, 0, BLOCK_SIZE ) ) &gt;= 0
                 )
                {
                    try
                    {
                        out.write( rawData, 0, count );
                    }
                    catch ( IOException e )
                    {
                        System.err.println( 
                            "[SupportPackager.addFile] ERROR while writing " +
                            e
                         );
                    }
                }
            }
            catch ( IOException e )
            {
                System.err.println( 
                    "[SupportPackager.addFile] ERROR while reading " + e
                 );
            }
        }
        catch ( FileNotFoundException e )
        {
            // File path do not exists !
            System.err.println( 
                "[SupportPackager.addFile] ERROR file not found at  " +
                filePath + ". " + e
             );
        }
        catch ( IOException e )
        {
            System.err.println( 
                "[SupportPackager.addFile] ERROR while adding a new entry into archive  " +
                e
             );
        }
    } </pre><hr />


----------



## mpergand (27 Janvier 2004)

J'utilise ce bout de code dans un de mes prog:

public boolean copieFichier(String source,String dest)
{
byte[ ] buffer =new byte[10000]; // taille du buffer
int length;

   try {

   FileInputStream  input=new FileInputStream(source);
   FileOutputStream output=new FileOutputStream(dest);

   while( (length=input.read(buffer))!=-1) {
      output.write(buffer,0,length);
   }

  output.close();
  input.close();
  }
catch(IOException ex) {  // erreur !
	return false;
 }

return true;

}


source et dest sont les noms des fichiers source et destination, la routine retourne false si une erreur survient. Je l'utilise dans un prog qui fait une recherche de fichiers possédant certaines extensions sur tout un volume et les copie dans un dossier. Ca marche bien mais le code semble trop simple, un expert java pourrait-il m'indiquer des failles éventuelles ?


----------



## Sylvain_G (27 Janvier 2004)

Bon le code m'a l'air très correct.
La seule remarque que je ferait concerne la non utilisation des stream avec buffer. C'est généralement conseillé pour les perf.


----------



## Pivo (27 Janvier 2004)

Ben oui d'accord, mais c'est où que je mets le nom du fichier? C'est "dest"

(oui je suis nul en buffers, je laissais chaque fois mon coéquipier faire ça  
	

	
	
		
		

		
			





 )


----------



## Pivo (27 Janvier 2004)

bon ok ça marche. Je vais peut-être pouvoir rendre un truc demain, chouette!


----------



## Pivo (27 Janvier 2004)

C'est bien gentil de votre part. Au fait, si y en a qui maîtrisent les jTree, jdom et les parsers xml en général, c'est pas de refus ;-)


----------

