FileWriter追加ファイル書き込みで遭遇したピット、デフォルトはISO-8859-1またはUS-ACCI符号化
2329 ワード
1人の同僚が1つの帳簿ファイルをフィルタリングし、第三者にプッシュする必要がある.興味深い問題は、この第三者が各行のファイルに固定長さを要求し、gbkに従って符号化しなければならないことを明確に要求し、毎日の帳簿ファイルがどんなに大きくても、できるだけ1つのtxtファイルにフィルタリングして制御し、圧縮転送を行うことだ.もともと簡単なことだったが、符号化問題に遭遇した.第三者は私たちの長さに問題があると言った.あの同僚は大丈夫だと言って、私は検査して、コードの中ですべてgbk符号化で、utf-8符号化を使っていないで、私は一目見て、検索して、確かにコードの中でutf-8符号化がなくて、しかしこれはまだ私の疑念を解消するのに十分ではありませんて、私はコードを追跡し続けます:
ファイルを読み取るには、確かにgbk方式を採用しています.出力も問題ありません.それから、私は彼に自分で生成したファイルを読み取らせて、長さチェックをして、上のコードを使って、ラインという場所をgbk符号化バイトにして、長さ計算をして出力して、彼はそのようにしました.その結果、中国語の長さの欄に問題があることがわかりました.
追跡を続けて、彼が追加して書いたコードを見つけて、使うのは意外にもFileWriterで、しかもネット上でコピーしてきたので、当然問題が発生します.JavaのFileWriterのデフォルトは(ISO-8859-1あるいはUS-ACSCII)西洋で符号化されています.そして、FileWriterクラスにはsetEncodingの方法がありません.そのため、この方法でファイルを追加して、符号化には間違いありません.
FileWriterをFileOutputStreamに変更することをお勧めします.問題は解決されました.
InputStreamReader inputReader = null;
BufferedReader bufferReader = null;
OutputStream outputStream = null;
try {
InputStream iStream = new FileInputStream(file);
inputReader = new InputStreamReader(iStream, "GBK");
bufferReader = new BufferedReader(inputReader);
//
String line = null;
while ((line = bufferReader.readLine()) != null) {
String[] st = line.split(";");
…………………………………………
ファイルを読み取るには、確かにgbk方式を採用しています.出力も問題ありません.それから、私は彼に自分で生成したファイルを読み取らせて、長さチェックをして、上のコードを使って、ラインという場所をgbk符号化バイトにして、長さ計算をして出力して、彼はそのようにしました.その結果、中国語の長さの欄に問題があることがわかりました.
while ((line = bufferReader.readLine()) != null) {
System.out.println("GBK ==" + line.getBytes("GBK").length);
System.out.println("UTF-8 ==" + line.getBytes("UTF-8").length);
}
追跡を続けて、彼が追加して書いたコードを見つけて、使うのは意外にもFileWriterで、しかもネット上でコピーしてきたので、当然問題が発生します.JavaのFileWriterのデフォルトは(ISO-8859-1あるいはUS-ACSCII)西洋で符号化されています.そして、FileWriterクラスにはsetEncodingの方法がありません.そのため、この方法でファイルを追加して、符号化には間違いありません.
//
public static void appendMethod(File fileName, String content) {
try {
// , true
FileWriter writer = new FileWriter(fileName, true);
writer.write(content + "
");
writer.close();
} catch (IOException e) {
System.err.println(" !");
}
}
FileWriterをFileOutputStreamに変更することをお勧めします.問題は解決されました.
public static void appendMethod(File file, String content, boolean addOr) {
FileOutputStream fileOutputStream = null;
try {
if (!file.exists()) {
file.createNewFile();
}
fileOutputStream = new FileOutputStream(file, true);
fileOutputStream.write(content.getBytes("gbk"));
} catch (IOException e) {
log.error(" !" + e);
} finally {
if (fileOutputStream != null) {
try {
fileOutputStream.flush();
fileOutputStream.close();
} catch (IOException e) {
log.error(" !" + e);
}
}
}
}