21

StringをUnicode ファイルに書き込みたい。私のコードJavaは次のとおりです。

public static boolean saveStringToFile(String fileName, String text) {
    BufferedWriter out = null;
    boolean result = true;
    try {
        File f = new File(fileName);
        out = new BufferedWriter(new OutputStreamWriter(
                new FileOutputStream(f), "UTF-8"));
        out.write(text);
        out.flush();
    } catch (Exception ex) {
        result = false;
    } finally {
        if (out != null)
            try {
                out.close();
            } catch (IOException e) {
                // nothing to do! couldn't close
            }
    }

    return result;
}

アップデート

次に、C# と比較します。

    private static bool SaveStringToFile(string fileName, string text)
    {
        using (StreamWriter writer = new StreamWriter(fileName))
        {
            writer.Write(text);
        }
    }

またはtry..catchフォームは次のようになります。

    private static bool SaveStringToFile(string fileName, string text)
    {
        StreamWriter writer = new StreamWriter(fileName);
        try
        {
            writer.Write(text);
        }catch (Exception ex)
        {
            return false;
        }
        finally
        {
            if (writer != null)
                writer.Dispose();
        }
    }

多分それは、私が C# と .Net の世界の出身だからです。しかし、これは文字列をファイルに書き込む正しい方法ですか? このような単純なタスクにはコードが多すぎます。C# では、ちょうどと言うだけでしたが、ステートメントの中に aout.close();を追加するのは少し奇妙に思えます。何が起こってもファイル (リソース) を閉じるステートメントを追加しました。リソースの使いすぎを避けるため。これはJavaで正しい方法ですか?もしそうなら、なぜ例外をスローするのですか?try..catchfinallyfinallyclose

4

8 に答える 8

3

はい、java の finally() 内で Try catch については何もおかしなことはありません。close() はさまざまな理由で IoException をスローする可能性があるため、try catch ブロックで囲む必要があります。最新の Java SE 7 には、この問題に対する改善された解決策がありますリソースで試してください

于 2013-01-04T11:22:28.327 に答える
2

using ステートメントに相当する Java は、Java 7 で追加された try-with-resources ステートメントです。

public static void saveStringToFile(String fileName, String text) throws IOException {
    try (Writer w = new OutputStreamWriter(new FileOutputStream(fileName), "UTF-8")) {
        w.write(text);
    }
}

try-with-resources は自動的にストリームを閉じ (暗黙的にフラッシュします)、その際に発生した例外をスローします。

いずれにしても write を 1 回呼び出す場合は BufferedWriter は必要ありません (その目的は、基になるストリームへの複数の書き込みを組み合わせてシステム コールの数を減らし、それによってパフォーマンスを向上させることです)。

false を返すことでエラーを処理する必要がある場合は、catch 句を追加できます。

public static boolean saveStringToFile(String fileName, String text) {
    try (Writer w = new OutputStreamWriter(new FileOutputStream(fileName), "UTF-8")) {
        w.write(text);
        return true;
    } catch (IOException e) {
        return false;
    }
}
于 2013-01-04T15:46:05.977 に答える
0

最小限のコードが必要な場合は、FileUtils.writeStringToFileを使用できます

FileUtils.writeStringToFile(new File(fileName), text);

エラーが発生したという事実またはエラーが発生した理由のいずれかを無視することはめったにないので、ブール値は使用しません。これは例外のメッセージにあります。チェックされた例外を使用すると、呼び出し元は常にそのようなエラーを正しく処理し、その理由について意味のあるエラーメッセージをログに記録できます。

特定のCharSetを使用してファイルを保存するには

try {
    FileUtils.writeStringToFile(new File(fileName), text, "UTF-8");
} catch(IOException ioe) {
    Logger.getLogger(getClass()).log(Level.WARNING, "Failed to write to " + fileName, ioe);
}
于 2013-01-04T11:40:01.373 に答える
0

これを回避する最善の方法は、out.flush()の後にout.close()を配置することです。これにより、クローズが失敗した場合にプロセスが自動的に処理されます。または、これを使用する方が良いです(私が使用しているもの):

File file = ...
   OutputStream out = null;
   try {
     out = new BufferedOutputStream(new FileOutputStream(file));
     ...
    finally {
     if (out != null) {
       out.close();
     }
   }
 }
于 2013-01-04T11:26:27.313 に答える
0

それで、質問は何ですか?正しい方法も間違った方法もありません。IO Exception をスローすることさえできますか? だったらどうしようか?私は一般的に、あらゆる種類の非再スローがまったく好きではありません。

問題は、クローズ時に IO Exception を飲み込むだけであるということです。あなたはその吹き飛ばしで生きることができますか?そうでない場合は、問題があります。問題がある場合は、問題はありません。

私はそれをしたことはありませんが、繰り返しますが、それはあなたのビジネスケースに依存します.

于 2013-01-04T11:21:57.237 に答える