1

質問に答えました。皆様のご協力とご支援をよろしくお願いいたします。

Writer output = null;
    File pdfFile = new File("MANIFEST.txt");//create text file
    try {
        output = new BufferedWriter(new FileWriter(pdfFile));
    } catch (IOException e) {
         //TODO Auto-generated catch block
        e.printStackTrace();
    }

    for(int i=0; i<files.length; i++){//create manifesto of pdfs in directory
        try {

            System.out.println(copy[i]);
            output.write(copy[i]);
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }           

copy は文字列の配列です。内容はコンソールに正しく出力されますが、ファイルには出力されません (ファイルは作成されます)。import java.util.zip.ZipOutputStream; を含めると、try キャッチに入れない限り、多くのものが例外をスローします (output.write が「未処理の例外タイプ IOEception」を返すなど)。

4

2 に答える 2

2

ライターを閉じることはありますか?

一般に、I/O リソース (リーダー/ライター/データベース接続など) を作成するときはいつでも、finally ブロックを使用して、次のように閉じていることを確認する必要があります。

Writer writer = new BufferedWriter(...);
try {
    // do something with the writer; may be many lines of code
}
finally {
    writer.close();
}

(注: Java 7 には、このパターンのより簡潔な構文である try-with-resources ブロックがあります。)

これはリソース管理にとって重要です (たとえば、接続/ファイルを閉じないと、最終的にプロセスはファイル ハンドルを使い果たし、それ以上開くことができなくなります)。

ただし、より関連性の高い問題もあります。基盤となるオペレーティング システムに一度に 1 文字ずつ書き込むことによるパフォーマンスの低下を避けるために、多くのライターはバッファリングされます。writeそれらを呼び出すと、そのデータはバッファーに保存され、実際には定期的にファイルに書き込まれます (それだけの価値がある「十分な大きさ」の場合)。これはflushingと呼ばれます。

ライターがデータをフラッシュする前に単純に破棄された場合、ファイルは更新されません。

手動で呼び出すこともできますがflush()、必要になることはめったにありclose()ません。ライターを呼び出すと、すべてのリソースが解放されるだけでなく、バ​​ッファーもフラッシュされます。したがって、try / finally上記のパターンを使用すると、プロセスが終了したときに、ブロック内に書き込むものはすべてファイルに書き込まれることが保証されます。try現在のコードでは、保証はなく、ライターの実装に依存します。

于 2012-05-15T08:15:14.490 に答える
0

i < files.lengthfor ループで as 条件を使用しますが、次にアクセスしますcopy[i]。次のようなものを使用したい場合があります。

for(int i = 0; i < copy.length; i++) {
    System.out.println(copy[i]);
    output.write(copy[i]);
}

またはさらに良いことに、foreach ループを使用します。

for(final String element : copy) {
    System.out.println(element);
    output.write(element);
}
于 2012-05-15T08:13:17.207 に答える