14

エラーが発生していましたio.MalformedByteSequenceException: Invalid byte 2 of 2-byte UTF-8 sequence

解決策は、UTF-8 でファイルを読み書きすることです。

私のコードは次のとおりです。

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);

URL を読み取って、それをファイルDirectionResponse.xmlに書き込んでいます。次に、DirectionResponse.xmlを読み取り、*ppre_DirecionResponse.xml* と同じものを書き込んで処理します。

読み書きが UTF-8 で行われるようにするにはどうすればよいですか?

4

2 に答える 2

35

まず、呼び出す必要がありますoutput.close()(または、output.flush()入力のためにファイルを再度開く前に呼び出します。これがおそらく問題の主な原因です。

次に、これにはFileReaderorFileWriterを使用しないでください。これは、常にプラットフォームの既定のエンコーディング (UTF-8 ではないことが多い) を使用するためです。のドキュメントFileReaderから:

このクラスのコンストラクターは、既定の文字エンコーディングと既定のバイト バッファー サイズが適切であることを前提としています。

を使用する場合も同じ問題がありFileWriterます。これを置き換えます:

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

このようなもので:

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

についても同様ですfstream

于 2012-11-12T20:09:32.100 に答える
2

Java での UTF-8 ファイルの読み取りと書き込み

あなたは utf-8 で書いているようですが、特に utf-8 で読んでいるわけではありません。リンクで提供した例に従ってください。

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();
}
于 2012-11-12T20:06:31.107 に答える