0

0

如何处理Java中的IO流异常_输入输出操作安全建议

P粉602998670

P粉602998670

发布时间:2026-03-10 09:02:04

|

103人浏览过

|

来源于php中文网

原创

如何处理java中的io流异常_输入输出操作安全建议

Java中IOException必须捕获或声明,不能忽略

Java的IO流操作(如FileInputStreamBufferedReader)抛出的是受检异常(checked exception),编译器强制你处理它。不处理会直接编译失败,不是运行时才暴露的问题。

常见错误现象:Unhandled exception type IOException;有人用空catch块“吞掉”异常,结果读文件失败却静默返回null或默认值,后续NPE或逻辑错乱。

  • 要么用try-catch捕获并做有意义的处理(比如记录日志、提示用户、提供默认数据)
  • 要么在方法签名加throws IOException,把责任上抛——但注意,上层也得接住,不能一路甩到main还不管
  • 别用catch (Exception e)笼统捕获,会掩盖NullPointerException等真正该修复的bug

try-with-resources自动关闭流,避免资源泄漏

手动调用close()容易遗漏:比如read()中途抛异常,finally里没判空就调close()可能NPE;或者忘了写finally,流一直占着文件句柄或socket连接。

使用场景:所有实现了AutoCloseable的IO类(FileInputStreamOutputStreamWriterScanner等)都适用。

立即学习Java免费学习笔记(深入)”;

微软爱写作
微软爱写作

微软出品的免费英文写作/辅助/批改/评分工具

下载
  • 语法是try (ResourceType resource = new ResourceType()) { ... },括号内声明的资源会在try结束时自动close()
  • 多个资源用分号隔开:try (var in = new FileInputStream(...); var out = new FileOutputStream(...))
  • 即使try块中抛出异常,close()仍会执行;如果close()本身也抛异常,它会被抑制(suppressed),可通过getSuppressed()获取,不影响主异常传播
try (var reader = new BufferedReader(new FileReader("data.txt"))) {
    String line = reader.readLine();
    System.out.println(line);
} // reader.close() 自动在此调用

Files工具类比传统File更安全、更简洁

老式File类的delete()mkdirs()等方法失败只返回false,不告诉你为什么;路径拼接靠字符串+,容易出../../绕过校验或Windows/Linux路径分隔符问题。

java.nio.file.Files是Java 7引入的现代替代方案,所有操作都抛IOException或子类(如NoSuchFileException),错误信息明确。

  • 创建目录用Files.createDirectories(path),失败直接抛异常,不用自己检查返回值
  • 读取整个文件用Files.readString(path)(Java 11+)或Files.readAllBytes(path),一行代码搞定,不用手动开流、缓冲、关流
  • 复制/移动用Files.copy(source, target, StandardCopyOption.REPLACE_EXISTING),选项语义清晰,不会意外覆盖或静默失败
  • 路径拼接统一用Paths.get("a", "b", "c.txt"),自动适配系统分隔符

字符编码不指定就踩坑,尤其跨平台或含中文时

很多IO操作默认用平台编码(Windows是GBK,Linux/macOS通常是UTF-8),同一段代码在不同机器上读写中文文件,可能乱码或抛MalformedInputException

典型错误:用new FileReader("text.txt")new FileWriter("out.txt")——它们不接受编码参数,只能用平台默认编码。

  • 读文本优先用Files.newBufferedReader(path, StandardCharsets.UTF_8)
  • 写文本用Files.newBufferedWriter(path, StandardCharsets.UTF_8)
  • 如果必须用InputStreamReader,务必显式传入StandardCharsets.UTF_8,别依赖new InputStreamReader(in)的无参构造
  • 网络传输或配置文件中,UTF-8是事实标准,除非明确要求兼容旧系统,否则不要用GBK/ISO-8859-1

最常被忽略的是:Files.readString()Files.write()这些便捷方法,默认就是UTF-8,但FileReader/FileWriter不是。混用这两套API,一个读一个写,中文就丢一半。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

253

2023.09.22

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

1089

2024.03.01

resource是什么文件
resource是什么文件

Resource文件是一种特殊类型的文件,它通常用于存储应用程序或操作系统中的各种资源信息。它们在应用程序开发中起着关键作用,并在跨平台开发和国际化方面提供支持。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

179

2023.12.20

resource是什么文件
resource是什么文件

Resource文件是一种特殊类型的文件,它通常用于存储应用程序或操作系统中的各种资源信息。它们在应用程序开发中起着关键作用,并在跨平台开发和国际化方面提供支持。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

179

2023.12.20

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

739

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

220

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1564

2023.10.24

字符串介绍
字符串介绍

字符串是一种数据类型,它可以是任何文本,包括字母、数字、符号等。字符串可以由不同的字符组成,例如空格、标点符号、数字等。在编程中,字符串通常用引号括起来,如单引号、双引号或反引号。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

649

2023.11.24

Go高并发任务调度与Goroutine池化实践
Go高并发任务调度与Goroutine池化实践

本专题围绕 Go 语言在高并发任务处理场景中的实践展开,系统讲解 Goroutine 调度模型、Channel 通信机制以及并发控制策略。内容包括任务队列设计、Goroutine 池化管理、资源限制控制以及并发任务的性能优化方法。通过实际案例演示,帮助开发者构建稳定高效的 Go 并发任务处理系统,提高系统在高负载环境下的处理能力与稳定性。

4

2026.03.10

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Kotlin 教程
Kotlin 教程

共23课时 | 4.2万人学习

C# 教程
C# 教程

共94课时 | 11万人学习

Java 教程
Java 教程

共578课时 | 79.3万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号