end0tknr's kipple - 新web写経開発

http://d.hatena.ne.jp/end0tknr/ から移転しました

javaでfileをUTF-8で読み、別fileMS932で書く - InputStreamReader() , OutputStreamWriter() , PrintStream()

java 文字コード 変換」でグルると、 「new String("あ".getBytes("UTF-8"), "SJIS")」の方法を見かけますが、 これは誤りで、正しくは以下のように書くはず。

その他、SJISと MS932 の文字コード(文字セット)の違いを理解できていない人もよく見かけます。

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintStream;
import java.io.UnsupportedEncodingException;


public class TestConvEncode2 {
    
    public static void main(String[] args) {
        File fileIn = new File(args[0]);
        
        String newFilePath =
            fileIn.getAbsoluteFile().getParent() + "/NEW_FILE.TXT";
        File fileOut = new File(newFilePath);
        
        try {
            // javaで主に使用する文字コードは、UTF-8, SJIS, MS932
            FileInputStream input = new FileInputStream(fileIn);
            InputStreamReader streamIn = new InputStreamReader(input,"UTF-8");
            BufferedReader bufferR = new BufferedReader(streamIn);
            
            FileOutputStream output = new FileOutputStream(fileOut);
            OutputStreamWriter streamOut = new OutputStreamWriter(output,"MS932");
            BufferedWriter bufferOut = new BufferedWriter(streamOut);
            
            String str;
            while((str = bufferR.readLine()) != null){
                
                try {
                    // fileへ指定した文字コードで出力
                    bufferOut.write(str);

                    // 標準出力へ指定した文字コードで出力
                    PrintStream out_ms932 =
                        new PrintStream(System.out, true, "MS932");
                    out_ms932.println(str);
                } catch (UnsupportedEncodingException e) {
                    e.printStackTrace();
                }
            }
            bufferR.close();
            bufferOut.close();
            
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

↑こう書くと、↓こう実行できます

$ javac TestConvEncode2.java 
$ java TestConvEncode2 foo.txt