Problème de lecture de caractère spéciaux dans un fichier texte

Résolu/Fermé
ElexXVII Messages postés 45 Date d'inscription dimanche 10 août 2014 Statut Membre Dernière intervention 1 juillet 2017 - Modifié par ElexXVII le 2/09/2015 à 22:26
ElexXVII Messages postés 45 Date d'inscription dimanche 10 août 2014 Statut Membre Dernière intervention 1 juillet 2017 - 3 sept. 2015 à 21:24
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 ;)
A voir également:

1 réponse

KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
Modifié par KX le 2/09/2015 à 23:13
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
0
Bonsoir, merci d'avoir repondu aussi vite.
Sache que je n'est aucune erreur de compilation ou autre, mon probleme ce situe dans la fonctionnalite du programme.
Quand j'importe les text codé dans le prgramme, il ne me renvoie pas les bons. Comme montrer dans la 2eme capture d'ecran, et c'est ça mon probleme ...
Au lieu de m'envoyer les caractere ressemblant a "fÉxf ...", il me renvoie des sorte de losange ....
0
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
2 sept. 2015 à 23:31
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.
0
Donc, toi quand tu l'exécute, ça ne fait pas la même chose que sur mon screen ?
0
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
2 sept. 2015 à 23:42
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...
0
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
0