Problème de lecture de caractère spéciaux dans un fichier texte [Résolu/Fermé]

Signaler
Messages postés
45
Date d'inscription
dimanche 10 août 2014
Statut
Membre
Dernière intervention
1 juillet 2017
-
Messages postés
45
Date d'inscription
dimanche 10 août 2014
Statut
Membre
Dernière intervention
1 juillet 2017
-
Bonjour chers programmeur :D,
J'ai un programme qui prend ce qui est écrit dans un fichier, modifie les caractère, puis le remet dans un autre fichier (ce qui permet de "codé" un texte.
Mon programme est donc capable de "codé" ou de "décode" l'infos (il transforme chaque lettre de l'alphabet normale en caractère spéciaux et les majuscule en minuscule) :

abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ
donne en sortie :
îìÄÅÉæÆôöòûùÿÖÜø£Ø×fáíóúñÑ%abcdefghijklmnopqrstuvwxyz

Donc, il n'y a pas de problème dans la partie "codage" de l'infos : Il récupère les vraies lettres, les modifie, puis les enregistre dans un autre fichier :


Le problème vient de la partie "décodage" , quand mon programme va chercher le texte a "décodé" , il ne prend pas en compte les caractère spéciaux :


La sauvegarde s'effectue comme cela :
try
{
 FileWriter fw = new FileWriter("Output.txt", false);
  
 BufferedWriter output = new BufferedWriter(fw);
   
 output.write(text);
   
 output.flush();
   
 output.close();
   
        System.out.println("Fichier créé");
   
  System.exit(0);
   
}catch(IOException ioe)
{
 System.out.print("Erreur");
 ioe.printStackTrace();
}



L'importation s'effectue comme cela :
try
{
 System.setProperty( "file.encoding", "UTF-8" );
   
 InputStream ips = new FileInputStream("Input.txt"); 
 InputStreamReader ipsr = new InputStreamReader(ips);
 BufferedReader br = new BufferedReader(ipsr);
 String ligne;
 while ((ligne=br.readLine())!=null)
 {
  chaine+=ligne+"\n";
 }
 br.close(); 
   
}catch (Exception e)
{
 System.out.println("Erreur");
}


Conclusion : Je cherche donc un moyen d'importé ces satané de caractère spéciaux.
Si qqun avait une solution, je lui en serait reconnaissant, merci d'avance.

PS : je fait du java depuis pas longtemps, soyez indulgent ;)

1 réponse

Messages postés
16253
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
25 février 2021
2 798
Bonjour,

Quand je testes ton code, je n'ai pas de problème particulier.

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileInputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;

public class Test {

    public static void write(String outputFileName, String text) {
        try {
            FileWriter fw = new FileWriter(outputFileName, false);
            BufferedWriter output = new BufferedWriter(fw);
            output.write(text);
            output.flush();
            output.close();
            System.out.println("Fichier créé");
            // System.exit(0);
        } catch (IOException ioe) {
            System.out.print("Erreur");
            ioe.printStackTrace();
        }
    }

    public static String read(String inputFileName) {
        String chaine = "";
        try {
            System.setProperty("file.encoding", "UTF-8");
            InputStream ips = new FileInputStream(inputFileName);
            InputStreamReader ipsr = new InputStreamReader(ips);
            BufferedReader br = new BufferedReader(ipsr);
            String ligne;
            while ((ligne = br.readLine()) != null) {
                chaine += ligne + "\n";
            }
            br.close();
        } catch (Exception e) {
            System.out.println("Erreur");
        }
        return chaine;
    }

    public static void main(String[] args) {
        write("C:/test.txt","a%£^µ\r\n_`è|(}\r\n*-+");
        System.out.println(read("C:/test.txt"));
    }
}


Quelques remarques au passage :

Ne fais pas de System.exit(0); il vaut mieux contrôler le code et le laisser à aller jusqu'à la fin du main.

Inutile de faire un flush sur un fichier. Les flush c'est plutôt pour des flux infinis comme des affichages où il faut régulièrement faire des pauses.

Ne modifies pas les variables systèmes System.setProperty(file.encoding") cela peut créer des effets de bords sur le reste du programme.

Évites les concaténations de String dans des boucles chaine += ligne, parce que cela va créer un nouvel objet String à chaque concaténation ce qui pollue la mémoire.

Et pour les exceptions, printStackTrace c'est mieux que println("Erreur"); mais uniquement si le programme peut continuer malgré l'exception. Or ici si tu as une exception, laisse là faire planter le programme.

En prenant en compte mes remarques et en simplifiant un peu ça donne ça (mais je n'ai toujours pas d'erreur en testant...)

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Scanner;

public class Test {

    public static void write(String outputFileName, String text) throws IOException {
        FileWriter fw = new FileWriter(outputFileName);
        fw.write(text);
        fw.close();
    }

    public static String read(String inputFileName) throws FileNotFoundException {
        StringBuilder builder = new StringBuilder();
        Scanner sc = new Scanner(new File(inputFileName));
        while (sc.hasNextLine())
            builder.append(sc.nextLine()).append("\n");
        sc.close();
        return builder.toString();
    }

    public static void main(String[] args) throws IOException {
        write("C:/test.txt", "a%£^µ\r\n_`è|(}\r\n*-+");
        System.out.println(read("C:/test.txt"));
    }
}

La confiance n'exclut pas le contrôle
Messages postés
16253
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
25 février 2021
2 798
J'ai bien compris, cependant quand j'exécutes ton code, ça me créé bien le fichier, le lit, et l'affiche à l'identique de ce que je lui ai demandé et pourtant j'ai bien des caractères spéciaux...

Donc le problème ne semble pas venir de la partie de code que tu as donné, en tout cas ce n'est pas reproductible chez moi... peut-être que cela vient plutôt du reste de ton code.
Donc, toi quand tu l'exécute, ça ne fait pas la même chose que sur mon screen ?
Messages postés
16253
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
25 février 2021
2 798
Déjà on n'a pas le même code...
Moi je n'ai pas de saisie du genre "Importer de "Input.txt" (o/n)" j'ai juste les deux morceaux de codes qui font l'écriture et la lecture.

J'ai pris ces deux morceaux de code et je les ai mis dans une classe de Test et ça fonctionne très bien.
J'ai mis le code complet que j'ai utilisé (ici) tu peux le tester et voir si chez toi c'est pareil, mais pour moi ce code fonctionne...
La j'ai plus de co, je suis sur mon téléphone, donc je test demain, et je verrais, merci pour ton aide et peut être a demain je l'espère ;D
Messages postés
45
Date d'inscription
dimanche 10 août 2014
Statut
Membre
Dernière intervention
1 juillet 2017

Bah, j'ai modifié quelque truc et ça fonctionne tjr pas dans l'IDE (Eclipse) mais quand je l'export, tout fonctionne, donc, Merci !