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

相关问题