2016-09-13 13 views
0

私は次のコードを使ってディスクにファイルを書き込みます。FileOutputStream - 要求されたサービスを完了するのに十分なシステムリソースがありません

`try{ 
    FileOutputStream fileOutputStream = null;    
    fileOutputStream = new FileOutputStream(filePath); 
    fileOutputStream.write(fileData); 
    fileOutputStream.flush(); 
} 
finally{ 
    fileOutputStream.close(); 
} 
     ` 

問題は、私は断続的に、次のエラーを取得していますということです。

システムリソースが不足しているため、要求されたサービスを完了できません。

この問題が起こることができるとき、私はすでにページプールメモリの欠如のような、いくつかの例をチェックして、それらのどれも私の場合ではありません。私はWindows Server 2003 Server R2 SP2を使用しています。アーキテクチャx86。

小さいチャンクでファイルを書き込もうとしますか?それをする最善の方法は何ですか?

+0

ディスクがいっぱいですか?あなたのファイルが大き過ぎて、あなたのファイルシステムはFAT32ですか? – morgano

+0

私のディスクがいっぱいではない、最大のファイルは約20MBで、ファイルシステムはNTFSです。 – dinhokz

+0

Windows XPをお使いですか? – r3st0r3

答えて

1

いくつかあります。

まず、バッファの使用を検討する必要があります。 FileOutputStreamをBufferedOutputStreamでラップしてみてください。

try{ 
    BufferedOutputStream outputBuffer = null;    
    outputBuffer = new BufferedOutputStream (new FileOutputStream(filePath)); 
    outputBuffer.write(fileData); 
    outputBuffer.flush(); 
} 
finally{ 
    outputBuffer.close(); 
} 

次に、実際にハンドルが不足していないかどうかを確認してください。私はこれに関するリンクでコメントを残しました。

+0

ありがとうr3st0r3。 BufferedOutputStreamは保存する前にファイルを小さな塊で分割しますか? Javaプロセスでハンドルが多すぎる場合、私は何をしますか? – dinhokz

+0

BufferedOutputStreamを使用すると、IOの呼び出しはバッファを通過するため、各FileOutputは新しいIOハンドル、この場合はネイティブファイルハンドルを作成しません。 私はあなたのJavaプロセスが多すぎるハンドルを消費しているとは思わないが、それは誤ったドライバかもしれない。 Javaはかなり安定しており、問題が純粋にコードから出てくるとハンドルがなくなるまでには時間がかかります。アプリを実行する前にどれくらいの期間表示されますか? – r3st0r3

+0

このツールを使用して、開いているハンドルを確認します。 https://technet.microsoft.com/en-us/sysinternals/bb896655 書き込み中のコードがループの内側にある場合、これが問題になる可能性があります。 – r3st0r3

関連する問題