2016-09-13 51 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

有幾件事。

首先,你應該考慮使用緩衝區。嘗試用BufferedOutputStream包裝FileOutputStream。

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

相關問題