写文件的例外实用

时间:2012-02-20 00:00:06

标签: java

我编写了一个将对象写入文件的方法。 我使用了泛型,所以也可以编写一个派生自Object的对象(我也可以接受一个Object类型的参数,但这个更清楚)。

public static <T extends Object> void write(T item,String path) 
throws FileNotFoundException,IOException
{
    ObjectOutputStream os;
    Object obj=item;
    os=new ObjectOutputStream(new FileOutputStream(path));
    os.writeObject(obj);
    os.close();
}

所以怀疑是关于实用的:在没有处理它们的情况下离开异常是正确的吗?因为我还编写了该方法的第二个版本:

public static <T extends Object> void nothrow_write(T item,String path) 
{
    ObjectOutputStream os;
    Object obj=item;
    try
    {
        os=new ObjectOutputStream(new FileOutputStream(path));
        os.writeObject(obj);
        os.close();
    }
    catch(FileNotFoundException e)
    {
        System.out.println(e);
    }
    catch(IOException e)
    {
        System.out.println(e);      
    }
}

哪种方法更实用? 第一个问题是,如果抛出异常,流仍然保持打开状态。

3 个答案:

答案 0 :(得分:2)

您可以使用finally块来确保关闭流,同时仍然抛出异常,如果您愿意:

public static <T extends Object> void myMethod(T item,String path) throws FileNotFoundException,IOException
{
    ObjectOutputStream os;
    Object obj=item;
    try
    {
        os=new ObjectOutputStream(new FileOutputStream(path));
        os.writeObject(obj);
    }
    catch(FileNotFoundException e)
    {
        throw e; // Perhaps log the error before throwing
    }
    catch(IOException e)
    {
        throw e; // Perhaps log the error before throwing
    }
    finally 
    {
         // Close stream here
    }

}

答案 1 :(得分:1)

第一个版本错了。如你所知,这是一个等待发生的资源泄漏:

public static  void write() throws Exception
{
    ObjectOutputStream os = new ObjectOutputStream(new FileOutputStream(path));
    os.writeObject(obj);
    os.close();
}

第二个版本是一个改进 - 至少你正在关闭()。

其他选项包括:

1)关闭文件并将异常重新抛回调用者

2)使用“finally”子句:

http://docs.oracle.com/javase/tutorial/essential/exceptions/finally.html

'希望有所帮助......

答案 2 :(得分:1)

public static void write(Object item, String path) 
  throws FileNotFoundException, IOException
{
  ObjectOutputStream os = new ObjectOutputStream(new FileOutputStream(path));
  try {
    os.writeObject(obj);
  } finally {
    os.close();
  }
}