tohokuaikiのチラシの裏

技術的ネタとか。

Javaで文字コードを気にしつつファイルの読み込み・書き込み

文字コードを気にするときは、FileReader/FileWriterを使ってはいけないという話。

この場合、新しいものは文字化けする。
File file = new File("file_0");
BufferedReader b = new BufferedReader(new FileReader(file));
File file_w = new File("file_0_output");
FileWriter fw = new FileWriter(file_w);
String s;
while((s = b.readLine())!=null){
    fw.write(s+"\n");
}
fw.close();

文字コードを指定すると問題ない。

File file_w3 = new File("file_1");
BufferedReader b_reader = new BufferedReader(new InputStreamReader(new FileInputStream(file),"UTF-8"));
PrintWriter p_writer    = new PrintWriter(new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file_w3),"UTF-8")));
String s;
while((s = b_reader.readLine())!=null){
    p_writer.println(s);
}
p_writer.close();

これをSAXReaderにも応用する

dom4jのSAXReaderでUTF8の日本語XMLを読み込むとどうしても内部で文字化けしてるのかXMLをreadするときに例外が発生してた。

SAXReader reader  = new SAXReader(false);
reader.read(new File("C:\User\itoh\foo.xml")); // ここで例外発生

でエラー見てみると、タグ閉じができてないってそんなわけは無くって。。。。UTF8なんだけど、普通にFileReader使うと文字壊しちゃうのね。

そこで、上記のことを参考に、File(もしくは、Reader)を引数にすると文字コードが指定できないと思い、InputStreamReaderを使ってみるとうまく行った。

InputStreamReader ir = new InputStreamReader(new FileInputStream(file),"UTF-8");
document = reader.read(ir);

この2行を得たのが今日のお仕事。