IOException IO流异常
- 1. 概述
- 2. try...catch异常处理
- 2.1 基础做法
- 2.2 JDK7方案
- 2.3 JDK9方案
- 3. 注意事项
异常 概括
1. 概述
IOException(Input/Output Exception,输入/输出异常)
是 Java 编程中常见的异常类型之一。它是 java.io 包中定义的一个异常类,通常用于处理输入/输出操作时可能发生的异常情况。
IOException
表示在进行输入和输出操作时发生了异常,例如文件读写时遇到问题、网络通信中出现异常等。它是一个 checked 异常,意味着在编写代码时必须显式处理或抛出
该异常,以避免编译错误。
一些常见的
IOException
类型包括FileNotFoundException
(文件未找到异常)、EOFException
(意外到达文件结尾异常)、SocketException
(套接字异常)、SocketTimeoutException
(套接字超时异常)等。
2. try…catch异常处理
try-catch 异常处理机制是一种在 Java 编程中常用的处理异常的方式。它允许开发人员捕获和处理在 try 块中发生的异常,并采取相应的措施,以确保程序在出错时能够进行适当的处理而不会中断或崩溃。
详细信息,请看 异常
2.1 基础做法
try…catch异常处理
-
基本做法:try…catch…finally
-
利用try…catch…finally捕获拷贝文件中代码出现的异常
-
格式:
try {//可能出现异常的代码} catch () {//可能出现的异常} finally {//一定会执行的代码}
注意:被finally控制的语句一定会执行,除非JVM退出
-
代码示例
package text.IOStream.IOException;import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException;/* try...catch异常处理 基本做法:try...catch...finally 利用try...catch...finally捕获拷贝文件中代码出现的异常格式:try {//可能出现异常的代码} catch () {//可能出现的异常} finally {//一定会执行的代码}注意:被finally控制的语句一定会执行,除非JVM退出*/ public class IOException01 {public static void main(String[] args) {FileInputStream fis = null;FileOutputStream fos = null;try {//创建对象fis = new FileInputStream("D:\\JavaCode\\code\\codeText01\\src\\text\\IOStream\\FileInputStream\\FileInputStream03\\a.txt");fos = new FileOutputStream("D:\\JavaCode\\code\\codeText01\\src\\text\\IOStream\\FileInputStream\\FileInputStream03\\b.txt");//拷贝数据//核心思想:边读边写int b;while ((b = fis.read()) != -1) {fos.write(b);}} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();} finally {//释放资源//规则:先开的流最后关闭if (fos != null) { //判断直接输出流对象是否为空,为空则不需要释放资源(表示内存-->程序的通道没搭建上)try {fos.close();} catch (IOException e) {e.printStackTrace();}}if (fis != null) { //判断字节输入流对象是否为空,为空则不需要释放资源(表示程序-->内存的通道没搭建上)try {fis.close();} catch (IOException e) {e.printStackTrace();}}}} }
-
输出结果
-
a.txt
-
b.txt
-
2.2 JDK7方案
JDK7方案
- 好处:资源用完自动释放
- 格式:
注意:不能把所有的创建流对象的类写在 (创建流对象1;创建流对象2) 中,只有实现了 AutoCloseable的类才能在小括号中创建对象try (创建流对象1;创建流对象2) { //创建流对象语句,如果多个,使用';'隔开//可能出现异常的代码} catch (异常类名 变量名) {//异常的处理代码}
- 代码示例
package text.IOStream.IOException;import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; /* try...catch异常处理 JDK7方案 - 好处:资源用完自动释放 - 格式: try (创建流对象1;创建流对象2) { //创建流对象语句,如果多个,使用';'隔开//可能出现异常的代码 } catch (异常类名 变量名) {//异常的处理代码 }注意:不能把所有的创建流对象的类写在 (创建流对象1;创建流对象2) 中,只有实现了 AutoCloseable的类才能在小括号中创建对象*/public class IOException02 {public static void main(String[] args) {try (FileInputStream fis = new FileInputStream("D:\\JavaCode\\code\\codeText01\\src\\text\\IOStream\\FileInputStream\\FileInputStream03\\a.txt");FileOutputStream fos = new FileOutputStream("D:\\JavaCode\\code\\codeText01\\src\\text\\IOStream\\FileInputStream\\FileInputStream03\\b.txt")) {//拷贝数据//核心思想:边读边写int b;while ((b = fis.read()) != -1) {fos.write(b);}} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}} }
- 输出结果
-
a.txt
-
b.txt
-
2.3 JDK9方案
JDK9方案
- 好处:资源用完自动释放
- 格式:
注意:不能把所有的创建流对象的类写在 (创建流对象1;创建流对象2) 中,只有实现了 AutoCloseable的类才能在小括号中创建对象创建流对象1;创建流对象2;try (流对象1;流对象2) {//可能出现异常的代码} catch (异常类名 变量名) {//异常的处理代码}
- 代码示例
package text.IOStream.IOException;import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException;/* try...catch异常处理 JDK9方案 - 好处:资源用完自动释放 - 格式: 创建流对象1; 创建流对象2; try (流对象1;流对象2) {//可能出现异常的代码 } catch (异常类名 变量名) {//异常的处理代码 } 注意:不能把所有的创建流对象的类写在 (创建流对象1;创建流对象2) 中,只有实现了 AutoCloseable的类才能在小括号中创建对象 */ public class IOException03 {public static void main(String[] args) throws FileNotFoundException {FileInputStream fis = new FileInputStream("D:\\JavaCode\\code\\codeText01\\src\\text\\IOStream\\FileInputStream\\FileInputStream03\\a.txt");FileOutputStream fos = new FileOutputStream("D:\\JavaCode\\code\\codeText01\\src\\text\\IOStream\\FileInputStream\\FileInputStream03\\b.txt");try (fis; fos) {//拷贝数据//核心思想:边读边写int b;while ((b = fis.read()) != -1) {fos.write(b);}} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}} }
- 输出结果
-
a.txt
-
b.txt
-
3. 注意事项
-
捕获异常:在进行输入/输出操作时一定要考虑可能出现的异常情况,并使用 try-catch 块来捕获可能抛出的 IOException。这样可以避免程序在出现异常时崩溃。
-
精准处理:在捕获 IOException 时要根据具体的情况做出相应的处理,可以选择重新尝试操作、关闭资源、记录日志或向用户报告错误信息等。
-
资源释放:在处理完 IO 操作后,及时关闭相关的输入流或输出流,以释放资源并避免内存泄漏。可以使用 try-with-resources(JDK 7及以上版本引入的自动资源管理)来简化资源管理代码。
-
谨慎处理:一些 IO 操作可能会引发其他类型的异常(如 FileNotFoundExcepion、SocketException 等),因此在处理 IOException 时要考虑可能产生的不同异常情况,并进行适当的处理。
-
合理抛出:在某些情况下,如果无法处理 IO 异常,可以选择将异常抛出给调用方或上层处理,以让调用方决定如何处理这些异常情况。