尝试最后在释放资源时捕获内部

本文关键字:内部 释放资源 最后 | 更新日期: 2023-09-27 17:50:35

我想将String写入Unicode文件。我在Java中的代码是:

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);
        }
    }

或者甚至CCD_ 3的形式将是:

    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#和。网络世界。但是,这是将字符串写入文件的正确方法吗?对于这样简单的任务来说,代码太多了。在C#中,我只想说out.close();,仅此而已,但在finally语句中添加try..catch似乎有点奇怪。我添加了finally语句来关闭文件(资源(,无论发生什么情况。为了避免使用过多的资源。这是Java中正确的方法吗?如果是,为什么close抛出异常?

尝试最后在释放资源时捕获内部

你是正确的,你需要在finally块中调用close((,你还需要包装这是一个try/catch

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

另外,Java 7还增加了对try with resources的支持,这消除了手动关闭资源的需要http://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html

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

与using语句等价的Java是在Java 7:中添加的try-with-resources语句

public static void saveStringToFile(String fileName, String text) throws IOException {
    try (Writer w = new OutputStreamWriter(new FileOutputStream(fileName), "UTF-8")) {
        w.write(text);
    }
}

try-with-resources将自动关闭流(这意味着刷新它(,并抛出在这样做时遇到的任何异常

如果只进行一次写入调用,则不需要BufferedWriter(其目的是将对底层流的多次写入组合起来,以减少系统调用次数,从而提高性能(。

如果你坚持通过返回false来处理错误,你可以添加一个catch子句:

public static boolean saveStringToFile(String fileName, String text) {
    try (Writer w = new OutputStreamWriter(new FileOutputStream(fileName), "UTF-8")) {
        w.write(text);
        return true;
    } catch (IOException e) {
        return false;
    }
}

这样就可以了。如果您想管理具有复杂行为的异常,请创建StreamWriter

public static bool saveStringToFile(String fileName, String text) 
{
    try
    {
        File.WriteAllText(fileName, text, Encoding.UTF8);
    }
    catch (IOException exp)
    {
        return false;
    }
    return true;
}

那么,问题是什么?没有对错之分。关闭甚至可以引发IO异常吗?那你干什么?一般来说,我喜欢任何形式的不反思——一点也不。

问题是——你只是在关闭时吞下一个IO异常——很好。你能忍受这种吹风吗?如果不是,你有问题,如果是——没有错。

我从来没有这么做过,但是——再说一遍,这取决于你的商业案例。

arch = new File("path + name");
arch.createNewFile();
FileOutputStream fos = new FileOutputStream(arch);
fos.write("ur text");
fos.close();

我的方式。

避免这种情况的最佳方法是将out.close((放在out.flush((之后,如果关闭失败,则会自动处理该过程。或者使用这个更好(我正在使用的(:

File file = ...
   OutputStream out = null;
   try {
     out = new BufferedOutputStream(new FileOutputStream(file));
     ...
    finally {
     if (out != null) {
       out.close();
     }
   }
 }

如果您想要最少的代码,可以使用FileUtils.writeStringToFile

FileUtils.writeStringToFile(new File(fileName), text);

我不会使用布尔值,因为忽略发生错误的事实或异常消息中发生错误的原因是个好主意。使用选中的Exception可以确保调用方始终正确处理此类错误,并可以记录有意义的错误消息以说明原因。

使用特定的CharSet 保存文件

try {
    FileUtils.writeStringToFile(new File(fileName), text, "UTF-8");
} catch(IOException ioe) {
    Logger.getLogger(getClass()).log(Level.WARNING, "Failed to write to " + fileName, ioe);
}