2016-05-10 5 views
-2

私は、try-with-resourcesステートメントの内部にあるFiles.newOutputStreamを使用して書き込み用のファイルを開くjavaプロセスコードを持っています。私はファイルを書き終えた後(すべて同じ方法で書かれています)、閉じました。それらは、ファイルがその内部にあるフォルダとともに削除されます。(削除された)lsofでファイル記述子を開く

私はlsofをして(私はCentOSのを実行している)私は(削除)としてこれらのファイル(および20Kまたは30Kがあるかもしれませんが)に示されていることがわかりlsofの中で見ていると、彼らことを意味しています
String folder = "folder" 
    try(OutputStream out = Files.newOutputStream(Paths.get(folder + '/' + fileName), StandardOpenOption.CREATE, StandardOpenOption.WRITE)) { 
     //... 
     out.write(buffer); 
     //... 
    } catch(IOException excp) { 
     excp.printStackTrace(); 
    } 
    FileUtils.forceDelete(new File(folder)); 

しかし、開いている。 クローズされたファイルがどのように開いたままになっているのか理解できず、結局オープンファイル記述子が多すぎます。だから私は限界を上げることができると知っているが、私は限界を上げるのではなく、適切に閉じたり、ファイルを閉じたりしたい。

ありがとうございました!

+1

... {}最後に{}のtry {}キャッチ外OutputStreamを移動するために忘れました。つまり、これらのファイルを作成し、それらに書き込み、それらを削除するコードです。 – Kenster

+0

@SlavaG、FileUtilsとは何ですか? apache commons io? – lincolnadym

+0

@lincolnadym FileUtils.forceDeleteはApache FileUtilsです。 – SlavaG

答えて

-2

私はあなたが実際にファイルを閉じているわけではないと思う...それは閉じられていないファイルハンドルです。

たぶんあなたのコードに最終的には{}ブロックを追加:

OutputStream out = null 
try { 
    out = Files.newOutputStream(Paths.get(folder + '/' + fileName), StandardOpenOption.CREATE, StandardOpenOption.WRITE)) { 
    //... 
    out.write(buffer); 
    //... 
} catch(IOException excp) { 
    excp.printStackTrace(); 
} 
finally { 
    if (out != null) { out.close(); } 
} 
FileUtils.forceDelete(new File(folder)); 

あなたがしようと接近するとき、それ以外の場合は、NullPointerExceptionがスローされます、あなたがnullでないためにアウトをテストしていることを確認します。

EDIT: は、Javaプログラムから、関連するソースコードが含まれるようにあなたの質問を編集してください

+0

try {Outputstream}パターンの仕組みは、スコープから外れると自動的にファイルを閉じるべきですか? FileUtilsの呼び出しがファイル上に実際に新しいファイルハンドルを作成しているのだろうかと思います。 – lordoku

+0

Hmmm、What's new File(フォルダ)新しいFileUtils.forceDelete内に作成するコードは「単一の」新しいFileハンドルを示唆しますが、フォルダが100個のファイルでいっぱいになると、FileUtilsは100個の新しいFile()ハンドルを作成しますか? – lincolnadym

+0

@lincolnadym 'ファイルハンドル'のようなものはありません。それらは単なるオブジェクトであり、ファイルシステムには接続されていません。 @lincolnadym FileUtils。 – EJP

関連する問題