FileWriter追加ファイル書き込みで遭遇したピット、デフォルトはISO-8859-1またはUS-ACCI符号化

2329 ワード

1人の同僚が1つの帳簿ファイルをフィルタリングし、第三者にプッシュする必要がある.興味深い問題は、この第三者が各行のファイルに固定長さを要求し、gbkに従って符号化しなければならないことを明確に要求し、毎日の帳簿ファイルがどんなに大きくても、できるだけ1つのtxtファイルにフィルタリングして制御し、圧縮転送を行うことだ.もともと簡単なことだったが、符号化問題に遭遇した.第三者は私たちの長さに問題があると言った.あの同僚は大丈夫だと言って、私は検査して、コードの中ですべてgbk符号化で、utf-8符号化を使っていないで、私は一目見て、検索して、確かにコードの中でutf-8符号化がなくて、しかしこれはまだ私の疑念を解消するのに十分ではありませんて、私はコードを追跡し続けます:
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);
			}
		}
	}
}