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 异常,可以选择将异常抛出给调用方或上层处理,以让调用方决定如何处理这些异常情况。