try-with-resources 优雅的关闭 I/O 流

try-with-resources 优雅的关闭 I/O 流

在 Java 中,关闭 I/O 流是一项重要的任务,它有助于释放系统资源,避免内存泄漏,并确保程序的正确性和健壮性。

1. 基础的关闭方式

最基础的关闭 I/O 流的方式是使用 close() 方法。在 Java 7 及以上版本,我们可以使用 try-with-resources 语句,它会在代码块结束时自动关闭资源。

public static void base(){// 测试使用绝对路径
    try (FileInputStream fis = new FileInputStream("example.txt");
         InputStreamReader isr = new InputStreamReader(fis);
         BufferedReader reader = new BufferedReader(isr)) {
        // 读取文件内容
        String line;
        while ((line = reader.readLine()) != null) {
            System.out.println(line);
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
}

编译后的方法如下

 public static void base() {
        try {
            FileInputStream fis = new FileInputStream("example.txt");
            Throwable var1 = null;

            try {
                InputStreamReader isr = new InputStreamReader(fis);
                Throwable var3 = null;

                try {
                    BufferedReader reader = new BufferedReader(isr);
                    Throwable var5 = null;

                    try {
                        String line;
                        try {
                            while((line = reader.readLine()) != null) {
                                System.out.println(line);
                            }
                        } catch (Throwable var52) {
                            var5 = var52;
                            throw var52;
                        }
                    } finally {
                        if (reader != null) {
                            if (var5 != null) {
                                try {
                                    reader.close();
                                } catch (Throwable var51) {
                                    var5.addSuppressed(var51);
                                }
                            } else {
                                reader.close();
                            }
                        }

                    }
                } catch (Throwable var54) {
                    var3 = var54;
                    throw var54;
                } finally {
                    if (isr != null) {
                        if (var3 != null) {
                            try {
                                isr.close();
                            } catch (Throwable var50) {
                                var3.addSuppressed(var50);
                            }
                        } else {
                            isr.close();
                        }
                    }

                }
            } catch (Throwable var56) {
                var1 = var56;
                throw var56;
            } finally {
                if (fis != null) {
                    if (var1 != null) {
                        try {
                            fis.close();
                        } catch (Throwable var49) {
                            var1.addSuppressed(var49);
                        }
                    } else {
                        fis.close();
                    }
                }

            }
        } catch (IOException var58) {
            var58.printStackTrace();
        }

    }

在上述demo中,FileInputStreamInputStreamReaderBufferedReader 都实现了 AutoCloseable 接口,因此它们可以在 try-with-resources 语句中被自动关闭。

在这里插入图片描述

在这里插入图片描述

2. 使用 try-catch-finally

在 Java 7 之前的版本,我们可以使用传统的 try-catch-finally 结构来关闭 I/O 流。在 finally 块中确保资源被关闭。

FileInputStream fis = null;
try {
    fis = new FileInputStream("example.txt");
    InputStreamReader isr = new InputStreamReader(fis);
    BufferedReader reader = new BufferedReader(isr);
    
    // 读取文件内容
    String line;
    while ((line = reader.readLine()) != null) {
        System.out.println(line);
    }
} catch (IOException e) {
    e.printStackTrace();
} finally {
    try {
        if (fis != null) {
            fis.close();
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
}

以上方法无论是否发生异常,资源都会被关闭。

3. 使用 try-with-resources 处理多个流

如果有多个需要关闭的流,可以在 try-with-resources 语句中使用多个资源。

try (FileInputStream fis = new FileInputStream("input.txt");
     FileOutputStream fos = new FileOutputStream("output.txt");
     BufferedReader reader = new BufferedReader(new InputStreamReader(fis));
     BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(fos))) {
    // 读取输入文件内容并写入输出文件
    String line;
    while ((line = reader.readLine()) != null) {
        writer.write(line);
        writer.newLine();
    }
} catch (IOException e) {
    e.printStackTrace();
}

在上述demo中,FileInputStreamFileOutputStreamBufferedReaderBufferedWriter 都在 try-with-resources 语句中,确保它们在使用完毕后被自动关闭。

4. 使用 Java NIO

Java NIO(New I/O)提供了一种更为灵活的 I/O 操作方式,其中的 java.nio.file 包提供了 Files 类,可以通过 Files.newBufferedReaderFiles.newBufferedWriter 等方法创建带有自动关闭功能的 BufferedReaderBufferedWriter

try (BufferedReader reader = Files.newBufferedReader(Paths.get("example.txt"));
     BufferedWriter writer = Files.newBufferedWriter(Paths.get("output.txt"))) {
    // 读取输入文件内容并写入输出文件
    String line;
    while ((line = reader.readLine()) != null) {
        writer.write(line);
        writer.newLine();
    }
} catch (IOException e) {
    e.printStackTrace();
}

使用 Files 类可以更加简洁地处理文件读写,并且它们也支持 try-with-resources。

5. 使用 Apache Commons IO 库

Apache Commons IO 库提供了 IOUtils 类,其中的 closeQuietly 方法可以方便地关闭流而无需手动处理异常。注意,这种方式不会抛出异常,因此适用于一些简单的场景。

FileInputStream fis = null;
try {
    fis = new FileInputStream("example.txt");
    // 处理文件输入流
} finally {
    IOUtils.closeQuietly(fis);
}

结论

,这种方式不会抛出异常,因此适用于一些简单的场景。

FileInputStream fis = null;
try {
    fis = new FileInputStream("example.txt");
    // 处理文件输入流
} finally {
    IOUtils.closeQuietly(fis);
}

结论

无论选择哪种方式,都应该在程序中妥善处理 I/O 流的关闭。使用 try-with-resources 语句是一种简洁且安全的方式,但要确保相关的类实现了 AutoCloseable 接口。在旧版 Java 中,传统的 try-catch-finally 结构也是一种可靠的方式。

  • 6
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

--土拨鼠--

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值