5

何らかの理由で、私の String は PrintWriter によって部分的に書き込まれます。その結果、ファイルに部分的なテキストが表示されます。メソッドは次のとおりです。

    public void new_file_with_text(String text, String fname) {
        File f = null;
        try {
            f = new File(fname);
            f.createNewFile();
            System.out.println(text);           
            PrintWriter out = new PrintWriter(f, "UTF-8");
            out.print(text);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

テキストをコンソールに出力すると、データはすべてそこにあり、何も失われていないことがわかりますが、PrintWriter がジョブを実行するときにテキストの一部が失われているようです...私は無知です..

4

5 に答える 5

6

開いているストリームを破棄する前に、常にWriter#closeストリームを使用する必要があります。これにより、ファイル システム上のファイルを開くときに JVM が必要とするかなり高価なシステム リソースが解放されます。ストリームを閉じたくない場合は、 を使用できますWriter#flush。これにより、ストリームを閉じなくても、変更がファイル システムに表示されます。ストリームを閉じると、すべてのデータが暗黙的にフラッシュされます。

ストリームは、書き込むデータが十分にある場合にのみファイル システムに書き込むために、常にデータをバッファリングします。ストリームは、何らかの方法でデータを書き込む価値があると判断したときに、そのデータを時々自動的にフラッシュします。ファイル システムへの書き込みはコストのかかる操作 (時間とシステム リソースがかかる) であるため、本当に必要な場合にのみ実行する必要があります。したがって、すぐに書き込みたい場合は、ストリームのキャッシュを手動でフラッシュする必要があります。

一般に、ストリームはかなりのシステム リソースを使用するため、常にストリームを閉じていることを確認してください。Java にはガベージ コレクションでストリームを閉じるためのメカニズムがいくつかありますが、これらのメカニズムは最後の手段としてのみ使用する必要があります。try {} finally {}したがって、ストリームのオープン後に例外が発生した場合でも、ストリームがクローズされることを保証するために常に使用してください。これに注意を払わないと、IOException開いているファイルが多すぎるというシグナルが表示されます。

コードを次のように変更します。

public void new_file_with_text(String text, String fname) {
    File f = null;
    try {
        f = new File(fname);
        f.createNewFile();
        System.out.println(text);           
        PrintWriter out = new PrintWriter(f, "UTF-8");
        try {
            out.print(text);
        } finally {
            out.close();
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
}
于 2013-11-14T13:19:13.907 に答える
3

out.flush();行の直後に使用してみてくださいout.print(text);

ファイルに書き込む適切な方法は次のとおりです。

public void new_file_with_text(String text, String fname) {
    try (FileWriter f = new FileWriter(fname)) {
        f.write(text);
        f.flush();
    } catch (IOException e) {
       e.printStackTrace();
    }
}
于 2013-11-14T13:16:57.987 に答える
0

ファイルを閉じる必要があります。

PrintWriter out = new PrintWriter(f, "UTF-8");
try
{
        out.print(text);
}
finally
{
    try
    {
        out.close();
    }
    catch(Throwable t)
    {
        t.printStackTrace();
    }
}
于 2013-11-14T13:20:52.570 に答える
0

最終ブロックで、または Java 7 の try-with-resources 機能を使用して、常にストリームを閉じる必要があります (ストリームもフラッシュします)。

PrintWriter out = null;
try {
    ...
}
finally {
    if (out != null) {
        out.close();
    }
}

また

try (PrintWriter out = new PrintWriter(...)) {
    ...
}

ストリームを閉じないと、すべてがファイルにフラッシュされないだけでなく、ある時点で、OS が利用可能なファイル記述子を使い果たします。

于 2013-11-14T13:20:57.737 に答える