我刚刚玩了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
}
}
Run Code Online (Sandbox Code Playgroud)
据我所知,我不能把这两个close()放在finally子句中,因为第一个close()可以抛出,然后,第二个不会被执行.
我知道C#有Dispose模式,可以使用using关键字来处理这个问题.
我甚至知道更好的C++代码(使用类似Java的API): …
我是C++业余爱好者.我正在编写一些Win32 API代码,并且有句柄和奇怪的复合分配对象.所以我想知道 - 是否有一些包装类可以使资源管理更容易?
例如,当我想加载一些数据时,我打开一个文件CreateFile()并得到一个HANDLE.当我完成它之后,我应该呼吁CloseHandle()它.但是对于任何相当复杂的加载函数,将会有许多可能的退出点,更不用说例外了.
因此,如果我可以将句柄包装在某种类型的包装类中会很好,它会CloseHandle()在执行一次离开范围后自动调用.更好的是 - 它可以进行一些引用计数,因此我可以将其传入和传出其他函数,并且只有在最后一个引用离开范围时它才会释放资源.
这个概念很简单 - 但标准库中有类似的东西吗?顺便说一下,我正在使用Visual Studio 2008,而且我不想附加像Boost这样的第三方框架.
基本上,我想打开一个文件,读取一些字节,然后关闭该文件.这就是我想出的:
try
{
InputStream inputStream = new BufferedInputStream(new FileInputStream(file));
try
{
// ...
inputStream.read(buffer);
// ...
}
catch (IOException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
finally
{
try
{
inputStream.close();
}
catch (IOException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
catch (FileNotFoundException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
Run Code Online (Sandbox Code Playgroud)
也许我被RAII宠坏了,但是必须有更好的方法在Java中做到这一点,对吗?
从文本文件中读取时,通常会创建一个FileReader然后将其嵌入到文本文件中BufferedReader.我读完后应该关闭哪两个读者?有关系吗?
FileReader fr = null;
BufferedReader br = null;
try
{
fr = new FileReader(fileName);
br = new BufferedReader(fr);
// ...
}
finally
{
// should I close fr or br here?
}
Run Code Online (Sandbox Code Playgroud)
在涉及异常安全方面,我有点偏执.当BufferedReader构造函数抛出异常时会发生什么?它是否关闭了嵌套的阅读器?还是保证不扔?
也许是一个微不足道的问题,但我对答案很感兴趣.我目前正在重构一些非常大的单片字符串资源文件(每个项目一个dumpster资源文件,在大约30个项目中).我正在拆分它们,以便我们遵循文件的约定,并使编码时更容易查找和管理字符串.
通常我将文件拆分为这个方案:
我对命名并不十分兴奋,我只是想知道其他人使用的是什么.例如,代替AppResources(应用程序内部使用的字符串),我已经看到很多演示项目使用StringResources,Internal(太糟糕了!)等.
关于管理资源或标准命名方案的想法/轶事/建议表示赞赏.
我试图向某人解释为什么数据库连接实现IDisposable,当我意识到我真的不知道"打开连接"实际意味着什么.
所以我的问题是 - 当它打开连接时,c#几乎可以做什么?
谢谢.
只是想知道为什么Enumerable.Range实施IDisposable.
我理解为什么IEnumerator<T>,但IEnumerable<T>不要求它.
(我在玩我的.Memoise()实现时发现了这个,它的声明就像
if (enumerable is IDisposable)
((IDisposable)enumerable).Dispose();
Run Code Online (Sandbox Code Playgroud)
在它的"源完成"方法中,我因为好奇而放置了一个断点,并且是通过测试触发的.)
我正在寻找一种适用于"洗碗机工作"问题的算法.
虽然能够将脏咖啡杯等放入其中是很棒的,但您很快就会遇到"菜肴状态如何?" 困境.如果你走到厨房,你可以从洗碗机中取出菜肴,因为它们很干净而且没有放好吗?你可以把一个肮脏的盘子放入洗碗机中,还是会使干净的盘子无效?
这似乎是一个必须具有编程等效的问题.您有一个异步触发的共享进程,并将对象从一个状态移动到另一个状态.您需要能够在任何给定时间知道对象的状态.可以应用哪些算法?
我的开始选择是在"干净"和"脏"的洗碗机上创建一个翻转标志.当洗碗机清空时,必须将其切换为"脏",当它运行时必须切换到"清洁".这个算法有问题吗?是否有更好/更少错误?
注意:没有使用轮询时间表的算法,请...
我想实现ARM(自动资源管理)模式,其中资源是异步使用的.
假设我的资源看起来像:
class MyResource {
def foo() : Future[MyResource] = ???
// Other methods returning various futures
def close() : Unit = ???
}
object MyResource {
def open(name: String): Future[MyResource] = ???
}
Run Code Online (Sandbox Code Playgroud)
所需的使用模式是:
val r : Future[MyResource] = MyResource.open("name")
r flatMap (r => {
r.foo() /* map ... */ andThen {
case _ => r.close()
}
})
Run Code Online (Sandbox Code Playgroud)
省略的映射函数可能很复杂,涉及分支和链接期货,这些期货会重复调用r返回期货的方法.
我想确保r.close()在所有未来的延续完成(或失败)后调用.在每个呼叫站点手动执行此操作非常容易出错.这需要ARM解决方案.
scala-arm库通常是同步的.这段代码不会做正确的事情,因为在块内的期货完成之前会调用close():
for (r <- managed(MyResource.open("name"))) {
r map (_.foo()) // map …Run Code Online (Sandbox Code Playgroud) 为什么with-openScala标准库中没有提供ARM(如Clojure )?