web-dev-qa-db-fra.com

Comment lire écrire ceci en utf-8?

Je recevais une erreur io.MalformedByteSequenceException: Invalid byte 2 of 2-byte UTF-8 sequence

La solution est de lire et d'écrire des fichiers en UTF-8.

Mon code est:

InputStream input = null;
OutputStream output = null;
OutputStreamWriter bufferedWriter = new OutputStreamWriter( output, "UTF8");
input = new URL(url).openStream();
output = new FileOutputStream("DirectionResponse.xml");
byte[] buffer = new byte[1024];
for (int length = 0; (length = input.read(buffer)) > 0;) {
   output.write(buffer, 0, length);
}
BufferedReader br = new BufferedReader(new FileReader("DirectionResponse.xml" ));
FileWriter fstream = new FileWriter("ppre_DirectionResponse.xml");
BufferedWriter out = new BufferedWriter(fstream);

Je lis une URL et je l'écris dans un fichier DirectionResponse.xml . Ensuite, lisez DirectionResponse.xml et écrivez la même chose que * ppre_DirecionResponse.xml * pour le traitement.

Comment puis-je changer cela pour que la lecture et l'écriture se fassent en UTF-8?

10
Gaurav Wadhwani

Tout d'abord, vous devez appeler output.close() (ou au moins appeler output.flush() avant de rouvrir le fichier pour entrée. C'est probablement la principale cause de vos problèmes.

Ensuite, vous ne devez pas utiliser FileReader ou FileWriter pour cela car il utilise toujours l'encodage par défaut de la plate-forme (qui n'est souvent pas UTF-8). De les documents pour FileReader :

Les constructeurs de cette classe supposent que l'encodage de caractères par défaut et la taille de tampon d'octets par défaut sont appropriés.

Vous rencontrez le même problème lorsque vous utilisez un FileWriter. Remplacez ceci:

BufferedReader br = new BufferedReader(new FileReader("DirectionResponse.xml" ));

avec quelque chose comme ça:

BufferedReader br = new BufferedReader(new InputStreamReader(
    new FileInputStream("DirectionResponse.xml"), "UTF-8"));

et de même pour fstream.

26
Ted Hopp

Lire et écrire un fichier UTF-8 en Java

Je vois que vous écrivez en utf-8 mais pas spécifiquement en utf-8. Suivez l'exemple que j'ai fourni dans le lien.

try {
   Reader reader =
      new InputStreamReader(
         new FileInputStream(args[0]),"UTF-8");
   BufferedReader fin = new BufferedReader(reader);
   Writer writer =
      new OutputStreamWriter(
         new FileOutputStream(args[1]), "UTF-8");
   BufferedWriter fout = new BufferedWriter(writer);
   String s;
   while ((s=fin.readLine())!=null) {
      fout.write(s);
      fout.newLine();
   }

            //Remember to call close. 
            //calling close on a BufferedReader/BufferedWriter 
            // will automatically call close on its underlying stream 
   fin.close();
   fout.close();
} catch (IOException e) {
   e.printStackTrace();
}
2
Aravind R. Yarram