c java RAII_Java中的RAII …资源处理总是如此丑陋?

我刚刚玩过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,仍然存在问题.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值