标签: resource-management

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
   }
}
Run Code Online (Sandbox Code Playgroud)

据我所知,我不能把这两个close()放在finally子句中,因为第一个close()可以抛出,然后,第二个不会被执行.

我知道C#有Dispose模式,可以使用using关键字来处理这个问题.

我甚至知道更好的C++代码(使用类似Java的API): …

java design-patterns raii resource-management

15
推荐指数
1
解决办法
4511
查看次数

我应该使用C++中的哪个包装类进行自动资源管理?

我是C++业余爱好者.我正在编写一些Win32 API代码,并且有句柄和奇怪的复合分配对象.所以我想知道 - 是否有一些包装类可以使资源管理更容易?

例如,当我想加载一些数据时,我打开一个文件CreateFile()并得到一个HANDLE.当我完成它之后,我应该呼吁CloseHandle()它.但是对于任何相当复杂的加载函数,将会有许多可能的退出点,更不用说例外了.

因此,如果我可以将句柄包装在某种类型的包装类中会很好,它会CloseHandle()在执行一次离开范围后自动调用.更好的是 - 它可以进行一些引用计数,因此我可以将其传入和传出其他函数,并且只有在最后一个引用离开范围时它才会释放资源.

这个概念很简单 - 但标准库中有类似的东西吗?顺便说一下,我正在使用Visual Studio 2008,而且我不想附加像Boost这样的第三方框架.

c++ raii resource-management

15
推荐指数
1
解决办法
5343
查看次数

在Java中处理IO异常

基本上,我想打开一个文件,读取一些字节,然后关闭该文件.这就是我想出的:

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中做到这一点,对吗?

java io exception-handling exception resource-management

14
推荐指数
1
解决办法
1万
查看次数

关闭嵌套的Reader

从文本文件中读取时,通常会创建一个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构造函数抛出异常时会发生什么?它是否关闭了嵌套的阅读器?还是保证不扔?

java file-io stream resource-management try-finally

13
推荐指数
1
解决办法
1882
查看次数

字符串资源文件命名方案和管理

也许是一个微不足道的问题,但我对答案很感兴趣.我目前正在重构一些非常大的单片字符串资源文件(每个项目一个dumpster资源文件,在大约30个项目中).我正在拆分它们,以便我们遵循文件的约定,并使编码时更容易查找和管理字符串.

通常我将文件拆分为这个方案:

  • ErrorMessages.resx
  • LogMessages.resx
  • ViewResources.resx
  • AppResources.resx

我对命名并不十分兴奋,我只是想知道其他人使用的是什么.例如,代替AppResources(应用程序内部使用的字符串),我已经看到很多演示项目使用StringResources,Internal(太糟糕了!)等.

关于管理资源或标准命名方案的想法/轶事/建议表示赞赏.

c# localization resx resource-management

12
推荐指数
1
解决办法
2521
查看次数

"打开连接"究竟意味着什么?

我试图向某人解释为什么数据库连接实现IDisposable,当我意识到我真的不知道"打开连接"实际意味着什么.
所以我的问题是 - 当它打开连接时,c#几乎可以做什么?

谢谢.

c# idisposable resource-management idbconnection

11
推荐指数
1
解决办法
2502
查看次数

为什么Enumerable.Range实现IDisposable?

只是想知道为什么Enumerable.Range实施IDisposable.

我理解为什么IEnumerator<T>,但IEnumerable<T>不要求它.


(我在玩我的.Memoise()实现时发现了这个,它的声明就像

if (enumerable is IDisposable)
    ((IDisposable)enumerable).Dispose();
Run Code Online (Sandbox Code Playgroud)

在它的"源完成"方法中,我因为好奇而放置了一个断点,并且是通过测试触发的.)

.net c# iterator idisposable resource-management

11
推荐指数
1
解决办法
283
查看次数

寻找"洗碗机在工作"的解决方案

我正在寻找一种适用于"洗碗机工作"问题的算法.

虽然能够将脏咖啡杯等放入其中是很棒的,但您很快就会遇到"菜肴状态如何?" 困境.如果你走到厨房,你可以从洗碗机中取出菜肴,因为它们很干净而且没有放好吗?你可以把一个肮脏的盘子放入洗碗机中,还是会使干净的盘子无效?

这似乎是一个必须具有编程等效的问题.您有一个异步触发的共享进程,并将对象从一个状态移动到另一个状态.您需要能够在任何给定时间知道对象的状态.可以应用哪些算法?

我的开始选择是在"干净"和"脏"的洗碗机上创建一个翻转标志.当洗碗机清空时,必须将其切换为"脏",当它运行时必须切换到"清洁".这个算法有问题吗?是否有更好/更少错误?

注意:没有使用轮询时间表的算法,请...

resource-management

9
推荐指数
2
解决办法
968
查看次数

如何在期货中使用Scala ARM?

我想实现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)

scala future resource-management

9
推荐指数
1
解决办法
865
查看次数

为什么Scala stdlib中没有ARM?

为什么with-openScala标准库中没有提供ARM(如Clojure )?

scala resource-management

7
推荐指数
1
解决办法
758
查看次数