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

也许我被RAII宠坏了,但是一定有更好的方法可以在Java中做到这一点,对吧?


答案 1

如果您有相同的异常处理代码,则可以仅使用一个子句以更紧凑的方式重写示例:IOExceptionFileNotFoundExceptioncatch

try {
    InputStream input = new BufferedInputStream(new FileInputStream(file));
    try {
        // ...
        input.read(buffer);
        // ...
    }
    finally {
        input.close();
    }
}
catch (IOException e) {
    e.printStackTrace();
}

如果您可以传播异常,您甚至可以摆脱外部,这可能比手动打印堆栈跟踪更有意义。如果您在程序中没有发现一些异常,您将自动为您打印堆栈跟踪。try-catch

此外,手动关闭流的需要将在Java 7中通过自动资源管理得到解决。

通过自动资源管理和异常传播,代码将减少到以下内容:

try (InputStream input = new BufferedInputStream(new FileInputStream(file))) {
    // ...
    input.read(buffer);
    // ...
}

答案 2

通常,这些方法都包含在库中。除非您想在此级别进行编写,否则最好创建自己的帮助程序方法或使用现有的方法(如 FileUtils)。

String fileAsString = Fileutils.readFileToString(filename);
// OR
for(String line: FileUtils.readLines(filename)) {
    // do something with each line.
}

推荐