1. ホーム
  2. ジャワ

java make FileWriter FileReaderはエンコード形式なし、OutputStreamWriter InputStreamReaderはエンコード形式を設定できる。

2022-03-18 21:02:51

JavaでFileWriter FileReaderを使用すると、ファイルのパスを渡して、単純にファイルの読み書きができます。



しかし、この実装は単純すぎるため、問題が発生する可能性があります。

このブログの記事内のファイルをダンプする私のコードのような単純なコード操作は、この2つのクラスを使って実装されています。

java の modify-renameTo() メソッドを使ってファイルをコピーしたりダンプしたりする例です。

上記のダンプコードをfindbugsで解析したところ、以下のようなヒントがありました。

詳細は以下の通りです。



デフォルトエンコーディングに依存することを発見: new java.io.FileWriter(String)



デフォルトエンコーディングへの依存



byteからString(またはStringからbyte)への変換を行うメソッドの呼び出しが見つかり、デフォルトのプラットフォームのエンコーディングが適切であると仮定しています。これは、アプリケーションの動作がプラットフォームによって異なる原因となります。別の API を使用し、文字セット名または Charset オブジェクトを明示的に指定してください。







そうすると、翻訳すると、次のような画像になります。





FileWriter FileReaderにエンコード形式がなく、本機のデフォルトエンコードを使用した場合、エンコードの問題でバグが発生します。







FileWriter FileReaderにエンコードフォーマットを持たせるにはどうしたらいいでしょうか?

または、ダンプファイルのコードを取って、それを修正してください。具体的な変更点は以下の通りです。

private static boolean copyFile(String src, String des) {  
    InputStreamReader fr = ;  
    OutputStreamWriter fw = ;  
    try {  
        fr = new InputStreamReader(new FileInputStream(src),"UTF-8");//read  
        fw = new OutputStreamWriter(new FileOutputStream(des), "UTF-8");//write  
        char[] buf = new char[1024];//buffer  
        int len;  
        while ((len = fr.read(buf)) ! = -1) {  
            fw.write(buf, 0, len);//read a few write a few  
        }  
        return true;  
    } catch (IOException e) {  
        LOG.error(e.getMessage());  
        return false;  
    } finally {  
        if (fr ! = ) { try {  
            try {  
                fr.close();  
            } catch (IOException e) {  
                LOG.error(e.getMessage());  
            }  
        }  
        if (fw ! = ) {  
            try {  
                fw.flush();  
                fw.close();  
            } catch (IOException e) {  
                LOG.error(e.getMessage());  
            }  
        }  
    }  
}  





を入れるのがポイントです。

FileWriter FileReaderをOutputStreamWriter InputStreamReaderに置き換えたものです。 







new InputStreamReader(new FileInputStream(src), "UTF-8");//read
new OutputStreamWriter(new FileOutputStream(des), "UTF-8");//write





これにより、エンコード形式が表示されます。