Bonjour,
connaissez vous un moyen rapide de concaténer le contenu de x fichiers .txt dans un seul .txt ?
Ou peut-être existe-t-il une API faisant cela
Merci d'avance![]()
Bonjour,
connaissez vous un moyen rapide de concaténer le contenu de x fichiers .txt dans un seul .txt ?
Ou peut-être existe-t-il une API faisant cela
Merci d'avance![]()
Et bien :
ouvrir un fichier en ecriiture
pour chaque fichier a lire
ecrire son contenu dans le fichier en ecriture
C'est pas sorcier en fait
oui mais j'pense qu'il doit exister une API avec une methode prenant en argument une liste de fichier et le fichier destination, et qui ferait cela non?![]()
Comme dit plus haut ce n'est pas sorcier: En fait le seul point litigieux est (comme toujours) la gestion des erreurs. L'exemple ci-apres ignore simplement les fichiers non presents ( a la manière de 'cat' sous Unix). Un autre comportement serait de ne realiser la concatenation que si toutes les sources peuvent être effectivement lues. Dans ce cas ou pourrait soit utiliser un fichier temporaire (voir File API) ou constituer l'ouput Stream en memoire si on ne craint pas de "OutOfMemoryError" (voir ByteArrayOutputStream)
import java.io.FileInputStream ;
import java.io.FileOutputStream ;
import java.io.OutputStream ;
import java.io.InputStream ;
import java.io.IOException ;
import java.io.FileNotFoundException ;
public class Concatenation
{
public void concatenate(OutputStream outputs, String... sources) throws IOException
{
for ( String source : sources )
{
try
{
FileInputStream inputs = new FileInputStream(source) ;
try
{
while ( inputs.available() > 0 )
{
outputs.write(inputs.read()) ;
}
}
finally { inputs.close() ; }
}
catch (FileNotFoundException exception)
{
System.err.println("Concatenation:Cannot open Source File : "+source) ;
}
catch(IOException exception)
{
throw new IOException("Concatenation:Cannot process Source File '"
+source
+"' due to : "+exception.getMessage()) ;
}
}
return ;
}
public void concatenate(String path , String... sources) throws IOException
{
try
{
FileOutputStream outputs = new FileOutputStream(path) ;
try
{
this.concatenate(outputs,sources) ;
}
finally { outputs.close() ; }
}
catch (FileNotFoundException exception)
{
throw new IOException("Concatenation:Cannot open Output File : "+path) ;
}
return ;
}
public static void main(String... arguments) throws IOException
{
String path = System.getProperty("Concatenation.Output") ;
OutputStream outputs =
(path == null) ? System.out : new FileOutputStream(path) ;
new Concatenation().concatenate(outputs,arguments) ;
}
}
Utilise plutot la méthode transferTo de la classe java.nio.FileChannel : code réduit + traitement plus rapide. Pourquoi encore hésiter ?...
ouais j'connaissait pas c pas mal et facile a utilisé.
Par contre je veut copier tout le contenu du fichier sauf la 1ere ligne.
Il n'y a rien apparament pour sauter une ligne dans l'API non?
Tu parles de lignes (xxxxReader/Writer) alors que tu utilises les xxxxInput/Output/Stream qui sont utilisés pour les fichiers binaires!
Ton fichier il est binaire ou texte ?
S'il est text c'est du séquentiel ou séquentiel linéaire, mais surtout l'encodage est-il celui par défaut ?
S'il est binaire, c'est du fixe ou variable ?
Quelle est la taille moyenne de tes fichiers et de leur taille maximum estimée ?
C'est un fichier texte (encodage par default).
je ne sais pas si c'est séquentiel ou séquentiel linéaire (c'est un fichier texte tout bete).
taille moyenne actuel 20KO
Taille maxi inconnu mais je ne pense pas que cela depassera 10MO (meme 1MO)
Salut,
la methode 'transferTo(...)' n'a pas été retenue ici puisque a l'instar de 'cat' sous Unix, on donne ici la possibillite d'écrite le résultat sur la sortie standard (System.out) ce qui ne serait pas possible en utilisant les 'FileChannel'
Quant à la possibilité de sauter la première ligne, il suffit de rajouter une ligne du style :
for ( int character = inputs.read() ; character != -1 && character != (int)'\n' ; character = inputs.read() ) ;
devant la boucle 'while'
A+
ben pour l'instant j'ai choisi:
mais je voulais pouvoir faire de même avec le transferFrom qui me parait intéressant.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 BufferedReader reader = new BufferedReader(new FileReader(source)); reader.readLine();//saut de la 1ere ligne while (reader.ready()) { output.write(reader.read()); }
Si ton encodage de caractères est sur 1 octet (ex. UTF-8) cela est faisable facilement avec nio, un peu plus dur si ton encodage est sur plusieurs octets :
En prenant l'hypothèse que ton encodage est sur un octet :
Tu fait un mapping mémoire de ton fichier via FileChannel.map (traitements hyper rapides car optimisation directement au niveau de l'OS).
Cela te donne un ByteBuffer.
Tu parcours le ByteBuffer jusqu'à trouver le premier octet qui encode le séparateur de ligne (généralement \n).
Tu notes sa position.
Tu utilises la méthode transferFrom (ou To) de FileChannel en spécifiant :
position=index de l'octet que tu as trouvé précédament
count=monFichier.length()-position
Ca devrait marcher.
Partager