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

Collection et Stream Java Discussion :

Tableau de caractères non affiché dans un fichier


Sujet :

Collection et Stream Java

  1. #1
    Membre expert

    Avatar de Songbird
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Juin 2015
    Messages
    493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2015
    Messages : 493
    Points : 3 872
    Points
    3 872
    Billets dans le blog
    8
    Par défaut Tableau de caractères non affiché dans un fichier
    Bonsoir,

    Je suis actuellement en train de créer un "grignoteur" d'espaces.
    Je souhaite donc lire dans un fichier, mettre son contenu dans un tableau de caractères, vérifier par le biais du code ascii du caractère actuel qu'il n'est ni un espace, ni une tabulation, ni un retour chariot ('\n'), et remettre les caractères qui restent dans un autre tableau.

    Jusqu'ici tout va bien, mais j'ai un gros problème pour l'écriture de ce tableau dans mon nouveau fichier, les caractères ne s'affichent pas... Auriez-vous une idée d'où provient mon erreur ?

    Voici ma classe de tests (ne faites pas attention au désordre donc):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    package fr.songbird.spaceDevourer;
     
    import java.io.File;
    import java.io.FileReader;
    import java.io.FileWriter;
     
    public class TestDirectory {
    	private FileWriter writer = null;
    	private FileReader reader = null;
    	private File fichier = new File(File.separator+"home"+File.separator+"songbird"+File.separator+"Documents"+File.separator+"unDossier"+File.separator+"machin");
    	private File newFile = new File(File.separator+"home"+File.separator+"songbird"+File.separator+"Documents"+File.separator+"unDossier"+File.separator+"machin_");
    	private char[] tab = null; //tableau utilisé pour la lecture
    	private char[] trucMuche = null; //tableau utilisé pour l'écriture
    	public TestDirectory(){
    		try{
    			int i = 0;
    			reader = new FileReader(fichier);
    			tab = new char[(int)fichier.length()];
    			trucMuche = new char[(int)fichier.length()];
    			System.out.println("la taille de tab vaut:  "+(int)fichier.length());
    			reader.read(tab);
    			for(Character character : tab)
    			{
    				if(character != (char)0x20 && character != '\n' && character != 0x9)
    				{
    					System.out.print(character);
    					trucMuche[i] = character;
    					i++;
    				}
    			}
    			newFile.createNewFile();
    			writer = new FileWriter(newFile, true);
    			writer.write(trucMuche);
     
    		}catch(Exception e)
    		{
    			e.printStackTrace();
    		}
                    finally
                    {
                          writer.flush();
     
                          writer.close();
                     }
    	}
     
     
     
    	public static void main(String[] args)
    	{
    		new TestDirectory();
    	}
    }

    Je vous remercie d'avance pour votre aide,

    Cordialement,

    Songbird.






    EDIT: Avec la méthode flush() ça marche mieux... Et dire que ça faisait 45 minutes que je me posais la question
    Avant de poster: FAQ Rust; FAQ Dart; FAQ Java; FAQ JavaFX.
    Vous souhaiteriez vous introduire au langage Rust ? C'est par ici ou ici !
    Une question à propos du langage ? N'hésitez pas à vous rendre sur le forum !


    Pour contribuer à la rubrique, vous pouvez me contacter par MP (Sorry, we're closed!) ou contacter directement la rédaction.

  2. #2
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Hello,

    Citation Envoyé par Songbird_ Voir le message
    EDIT: Avec la méthode flush() ça marche mieux... Et dire que ça faisait 45 minutes que je me posais la question
    En fait flush() n'est pas très utile puisqu'il est appelé par close() de toute façon. Mais close() est indispensable.

    Sinon, pour information :

    # reader.read(tab) ne cherche pas à lire le fichier entier.

    Ce sera probablement le cas si le fichier est tout petit, mais avec des fichiers plus gros il ne lira que le début.
    Pour traiter un fichier en entier, il faut appeler read(tab) en boucle, et vérifier à chaque fois combien de caractères ont été lus. Car non, il n'y a pas de raison que ce soit autant que la taille du tableau.

    # Le fichier que tu écris en sortie contient plusieurs octets illisibles à la fin. En fait, autant que de caractères que tu as effacés.

    C'est parce que tu écris le tableau trucMuche en entier, avec writer.write(trucMuche); alors que ce tableau est plus grand que le nombre de caractères que tu as mis dedans : il est aussi grand que le fichier de départ ! Du coup, à la fin il reste les cases que tu n'as pas affectées.

    ## Pour faire cela correctement, en fermant bien les fichiers, avec une boucle et sans caractères parasites à la fin, on ferait comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    try(FileReader reader = new FileReader(fichier); FileWriter writer = new FileWriter(newFile, true)) {
     
      tab = new char[1024];
      trucMuche = new char[1024];
     
      int nbRead = reader.read(tab);
      int nbWritten = 0;
      while(nbRead > 0) {
        for(int i = 0; i < nbRead; i++) {
          char character = tab[i];
          if(character != ' ' && character != '\n' && character != '\t') {
            System.out.print(character);
            trucMuche[nbWritten] = character;
            nbWritten++;
          }
        }
     
      writer.write(trucMuche, 0, nbWritten);
      nbWritten = 0;
    }
    On notera l'usage du try-with-resource pour déclarer reader et writer, ce qui pousse Java à appeler close() lui-même à la fin au lieu de devoir y penser nous-mêmes.

    ## Pour faire cela simplement, on pourrait utiliser :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    final Charset W1252 = Charset.forName("windows-1252");
    try(
      Reader reader = Files.newBufferedReader(path, W1252);
      Writer writer = Files.newBufferedWriter(newPath, W1252, StandardOpenOption.APPEND)
      ) {
     
      for(int ch = reader.read(); ch >= 0; ch = reader.read()) {
        if(ch != ' ' && ch != '\n' && ch != '\t') {
          writer.write(ch);
        }
      }
    }
    C'est là tout l'intérêt des BufferedReader/Writer : ils s'occupent déjà de traiter les caractères par tableaux et on n'a pas besoin de s'embêter avec ça.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 23/07/2015, 21h27
  2. Caractères non détectés dans un fichier CSV importé
    Par geckosystem dans le forum Langage
    Réponses: 1
    Dernier message: 29/05/2012, 13h27
  3. graphe et entete du tableau non affichée dans report
    Par sara_sihem dans le forum Reports
    Réponses: 1
    Dernier message: 07/02/2011, 11h09
  4. Réponses: 3
    Dernier message: 24/06/2009, 15h19
  5. [Spip] Tableau non affiché dans la partie "Articles les plus récents"
    Par Gigi95 dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 7
    Dernier message: 27/09/2007, 12h27

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