IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Entrée/Sortie Java Discussion :

JAVA - Regroupement contenu fichiers


Sujet :

Entrée/Sortie Java

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    197
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 197
    Par défaut JAVA - Regroupement contenu fichiers
    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

  2. #2
    Membre Expert Avatar de willoi
    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2006
    Messages
    1 355
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 355
    Par défaut
    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

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    197
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 197
    Par défaut
    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?

  4. #4
    Futur Membre du Club
    Inscrit en
    Novembre 2007
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 5
    Par défaut
    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) ;
    }
    }

  5. #5
    Membre Expert
    Profil pro
    Fabrication GED
    Inscrit en
    Octobre 2005
    Messages
    1 405
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Fabrication GED

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 405
    Par défaut
    Utilise plutot la méthode transferTo de la classe java.nio.FileChannel : code réduit + traitement plus rapide. Pourquoi encore hésiter ?...

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    197
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 197
    Par défaut
    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?

  7. #7
    Membre Expert
    Profil pro
    Fabrication GED
    Inscrit en
    Octobre 2005
    Messages
    1 405
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Fabrication GED

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 405
    Par défaut
    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 ?

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    197
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 197
    Par défaut
    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)

  9. #9
    Futur Membre du Club
    Inscrit en
    Novembre 2007
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 5
    Par défaut
    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+

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    197
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 197
    Par défaut
    ben pour l'instant j'ai choisi:

    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());
    }
    mais je voulais pouvoir faire de même avec le transferFrom qui me parait intéressant.

  11. #11
    Membre Expert
    Profil pro
    Fabrication GED
    Inscrit en
    Octobre 2005
    Messages
    1 405
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Fabrication GED

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 405
    Par défaut
    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.

  12. #12
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    197
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 197
    Par défaut
    ok je testerai, merci pour l'info

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. java -modifier contenu fichier word
    Par iliasdu76 dans le forum Général Java
    Réponses: 2
    Dernier message: 23/04/2012, 11h58
  2. [XML][Java] parser plusieurs fichiers en un seul arbre DOM ?
    Par mrlenul dans le forum XML/XSL et SOAP
    Réponses: 2
    Dernier message: 29/11/2005, 11h09
  3. Réponses: 3
    Dernier message: 02/10/2005, 12h30
  4. [XML/Java] Serialiser un fichier XML
    Par P4dre dans le forum Format d'échange (XML, JSON...)
    Réponses: 1
    Dernier message: 03/08/2005, 14h41
  5. Regrouper des fichiers sous un même nom
    Par Azharis dans le forum C++
    Réponses: 7
    Dernier message: 22/06/2005, 12h05

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo