[java] dupliquer un fichier

Pivo

Membre actif
22 Avril 2002
178
2
45
Lausanne
www.didasko.ch
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...
 
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 />
 
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 ?
 
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
mad.gif
)