【IO流系列】IOException IO流异常

本文介绍了Java中IOException的概述,以及如何使用try...catch处理IO异常,包括基础做法、JDK7的try-with-resources和JDK9的改进。还强调了注意事项,如异常捕获、精准处理、资源释放和异常传递的重要性。
摘要由CSDN通过智能技术生成

异常 概括

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方案

  • 好处:资源用完自动释放
  • 格式:
    	try (创建流对象1;创建流对象2) {    //创建流对象语句,如果多个,使用';'隔开
    		//可能出现异常的代码
    	} catch (异常类名 变量名) {
    	    //异常的处理代码
    	}
    
    注意:不能把所有的创建流对象的类写在 (创建流对象1;创建流对象2) 中,只有实现了 AutoCloseable的类才能在小括号中创建对象
  • 代码示例
    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;
       try (流对象1;流对象2) {
          //可能出现异常的代码
       } catch (异常类名 变量名) {
          //异常的处理代码
       }
    
    注意:不能把所有的创建流对象的类写在 (创建流对象1;创建流对象2) 中,只有实现了 AutoCloseable的类才能在小括号中创建对象
  • 代码示例
    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. 注意事项

  1. 捕获异常:在进行输入/输出操作时一定要考虑可能出现的异常情况,并使用 try-catch 块来捕获可能抛出的 IOException。这样可以避免程序在出现异常时崩溃。

  2. 精准处理:在捕获 IOException 时要根据具体的情况做出相应的处理,可以选择重新尝试操作、关闭资源、记录日志或向用户报告错误信息等。

  3. 资源释放:在处理完 IO 操作后,及时关闭相关的输入流或输出流,以释放资源并避免内存泄漏。可以使用 try-with-resources(JDK 7及以上版本引入的自动资源管理)来简化资源管理代码。

  4. 谨慎处理:一些 IO 操作可能会引发其他类型的异常(如 FileNotFoundExcepion、SocketException 等),因此在处理 IOException 时要考虑可能产生的不同异常情况,并进行适当的处理。

  5. 合理抛出:在某些情况下,如果无法处理 IO 异常,可以选择将异常抛出给调用方或上层处理,以让调用方决定如何处理这些异常情况。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

酷小洋

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

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

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

打赏作者

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

抵扣说明:

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

余额充值