我刚刚玩过Java文件系统API,并下载了以下功能,用于复制二进制文件.最初的来源是Web,但是我添加了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#有使用use关键字处理的Dispose模式.
我甚至知道更好的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中产生丑陋和膨胀的代码,以处理Buffered Stream的close()方法中的异常.
(请告诉我我在哪里错了…)
编辑:是我,还是更新这个页面,我看到这个问题和所有的答案在几分钟内下降了一点?有人在享受匿名的同时享受自己吗?
编辑3:在McDowell的链接之后,我向Java 7提出了一个类似C#的模式,使用模式:http://tech.puredanger.com/java7/#resourceblock.我的问题被明确描述.显然,即使使用Java 7,仍然存在问题.