尝试。。。释放资源时终于在里面抓了?

2022-09-02 04:15:34

我想将 一个写入 Unicode 文件。我的代码是:StringJava

public static boolean saveStringToFile(String fileName, String text) {
    BufferedWriter out = null;
    boolean result = true;
    try {
        File f = new File(fileName);
        out = new BufferedWriter(new OutputStreamWriter(
                new FileOutputStream(f), "UTF-8"));
        out.write(text);
        out.flush();
    } catch (Exception ex) {
        result = false;
    } finally {
        if (out != null)
            try {
                out.close();
            } catch (IOException e) {
                // nothing to do! couldn't close
            }
    }

    return result;
}

更新

现在将其与 C# 进行比较:

    private static bool SaveStringToFile(string fileName, string text)
    {
        using (StreamWriter writer = new StreamWriter(fileName))
        {
            writer.Write(text);
        }
    }

甚至形式将是:try..catch

    private static bool SaveStringToFile(string fileName, string text)
    {
        StreamWriter writer = new StreamWriter(fileName);
        try
        {
            writer.Write(text);
        }catch (Exception ex)
        {
            return false;
        }
        finally
        {
            if (writer != null)
                writer.Dispose();
        }
    }

也许是因为我来自C#和.Net世界。但这是将字符串写入文件的正确方法吗?对于如此简单的任务来说,代码太多了。在C#中,我会说只是,就是这样,但是在语句中添加一个似乎有点奇怪。我添加了该语句以关闭文件(资源),无论发生什么情况。避免使用过多资源。这在Java中是正确的方式吗?如果是这样,为什么会引发异常?out.close();try..catchfinallyfinallyclose


答案 1

你是对的,因为你需要在 finally 块中调用 close(),你还需要包装这是一个 try/catch

通常,您将在项目中编写一个实用程序方法,或者使用来自 http://commons.apache.org/io/apidocs/org/apache/commons/io/IOUtils.html#closeQuietly(java.io.Closeable)等库中的实用程序方法来关闭Quietly.即忽略来自close()的任何抛出异常。

另外,Java 7 添加了对 try with resources 的支持,从而无需手动关闭资源 - http://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html


答案 2

是的,在java中,Try catch inside final()没有什么奇怪的。close() 可能会出于各种原因抛出 IoException,这就是为什么它必须被尝试捕获块包围的原因。有一个改进的解决方案,你的这个问题,在最新的java SE 7尝试使用资源