我刚刚玩了 Java 文件系统 API,得到了以下函数,用于复制二进制文件。原始来源来自网络,但我添加了 try/catch/finally 子句以确保如果发生错误,缓冲流将在退出函数之前关闭(因此,我的操作系统资源被释放)。
我修剪了函数以显示模式:
public static void copyFile(FileOutputStream oDStream, FileInputStream oSStream) throw etc...
{
BufferedInputStream oSBuffer = new BufferedInputStream(oSStream, 4096);
BufferedOutputStream oDBuffer = new BufferedOutputStream(oDStream, 4096);
try
{
try
{
int c;
while((c = oSBuffer.read()) != -1) // could throw a IOException
{
oDBuffer.write(c); // could throw a IOException
}
}
finally
{
oDBuffer.close(); // could throw a IOException
}
}
finally
{
oSBuffer.close(); // could throw a IOException
}
}
据我了解,我不能将两者close()
放在 finally 子句中,因为第一个close()
可以很好地抛出,然后第二个不会被执行。
我知道 C# 有Dispose模式,可以用using
关键字处理这个问题。
我什至更清楚 C++ 代码应该类似于(使用类似 Java 的 API):
void copyFile(FileOutputStream & oDStream, FileInputStream & oSStream)
{
BufferedInputStream oSBuffer(oSStream, 4096);
BufferedOutputStream oDBuffer(oDStream, 4096);
int c;
while((c = oSBuffer.read()) != -1) // could throw a IOException
{
oDBuffer.write(c); // could throw a IOException
}
// I don't care about resources, as RAII handle them for me
}
我遗漏了一些东西,还是我真的必须在 Java 中生成丑陋和臃肿的代码才能处理close()
缓冲流方法中的异常?
(请告诉我我在某个地方错了......)
编辑:是我,还是在更新此页面时,我看到问题和所有答案在几分钟内都减少了一点?是否有人在匿名时太享受自己了?
编辑 2:McDowell提供了一个非常有趣的链接,我觉得我不得不在这里提到:http: //illegalargumentexception.blogspot.com/2008/10/java-how-not-to-make-mess-of-stream.html
编辑 3:在 McDowell 的链接之后,我偶然发现了一个 Java 7 的提案,该提案类似于使用模式的 C#:http: //tech.puredanger.com/java7/#resourceblock。我的问题已明确描述。显然,即使使用 Java 7 do
,问题仍然存在。