Java-I/O流和异常处理:字节流、字符流,try-catch

1、异常处理(Exception Handling)

异常处理体系是识别及处理错误的,让程序在出错时不崩溃、能优雅处理错误的机制。

  • Throwable类:所有异常的父类,有两个子类、Error和Exception
    • Error类:程序无法处理的错误,通常指JVM层面的严重问题(如内存溢出、栈溢出)。
    • Exception类:程序可以处理的异常情况
      • 受检异常(Checked Exception):编译时强制要求处理(如IOException、SQLException)。必须try-catch或在方法签名上用throws声明。
      • 非受检异常(Unchecked Exception):运行时异常(如NullPointerException、ArrayIndexOutOfBoundsException)。编译器不强制处理。
  • 自定义异常操作步骤:
    • 继承 Exception(受检)或 RuntimeException(非受检)。
    • 提供带参构造方法,调用父类的构造方法传递错误信息。
import java.io.*;

public class ExceptionDemo {
    // 声明可能抛出受检异常,throws关键字声明抛出的异常
    public static void readFile(String path) throws IOException {
        // 具体代码在I/O部分,throw关键字抛出对应异常
        throw new IOException("IO异常");
    }

    public static void main(String[] args) {
        // try代码块 包含可能出现异常的代码
        try {
            readFile("test.txt");
            // catch关键字捕获相关异常并进行处理
        } catch (IOException e) {
            System.err.println("文件读取失败: " + e.getMessage());
            // e.printStackTrace(); // 打印详细堆栈,包含异常类型以及在程序中的位置信息
        
        // finally代码块,最后执行,一般用于释放资源(finally代码块中的代码总会在方法返回结果之前被执行)
        // return在finally语句之后:执行完finally代码块,再执行return块返回结果
        // return在finally语句之前:先计算好retrun块中的返回值并暂存,然后转去执行finally块,最后再将暂存的值返回
        } finally {
            System.out.println("无论是否异常,我都执行。");
        }

        // 使用 try-with-resources (Java 7+):自动关闭资源
        try (FileReader reader = new FileReader("test.txt")) {
            // 读取操作
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

2、I/O流(I/O Streams)

流实际是传输的数据,根据流向的不同、分为输入(Input)流和输出(Output)流,

  • 输入:将数据从各种设备中读取到内存中,比如文件、键盘、网络等
  • 输出:将数据从内存写入到各种设备,比如文件、磁盘、网络等
  • 基本分类
    • 按数据单位:字节流、字符流;字节流-处理二进制数据(图片、视频、字节文件),字符流-处理文本数据(字符编码)。
    • 按方向:输入流、输出流
    • 按功能:节点流、包装流;节点流-直接连接数据源(文件、网络等),包装流-对节点流进行包装,增强功能(如缓冲)。
      • 处理流-缓冲流:先缓存,再一次性写入,提高读写效率,BufferedReader的readLine()可以读取一行,读取到末尾返回null
      • 处理流-转换流:可以在字节流和字符流之间转换
        • InputStreamReader(字节流):将输入的字节流转换为字符流
        • OutputStreamWriter(字节流):将输出的字符流转换为字节流
  • 代码示例:
import java.io.*;

public class CopyFile {
    public static void main(String[] args) {
        // 使用 try-with-resources 自动关闭多个流
        try (FileInputStream fis = new FileInputStream("source.jpg");
             FileOutputStream fos = new FileOutputStream("dest.jpg");
             //缓冲读取流
             BufferedInputStream bis = new BufferedInputStream(fis);  
            // 缓冲输出流
             BufferedOutputStream bos = new BufferedOutputStream(fos)) {
            
            byte[] buffer = new byte[1024]; // 1KB的缓冲区
            int length;

            // 读取bis输入流的全部内容写入到bos输出流中
            while ((length = bis.read(buffer)) != -1) {
                bos.write(buffer, 0, length);
            }
            System.out.println("文件复制成功!");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

字节输入流、InputStream抽象类

子类:FileInputStream、BufferedInputStream

常用方法

read() //读取一个字节,读到结尾返回 -1
read(byte[] b) //读取若干字节保存到字节数组中,读到结尾返回-1
close() //关闭流、必须操作,防止资源泄露

字符输入流、Reader抽象类

子类:FileReader、BufferedReader、InputStreamReader

常用方法

read() //读取一个字符,读到结尾返回 -1
read(char[] c) //读取若干字符保存到字符数组中,读到结尾返回-1
close() //关闭流

readLine() //读取一行返回,读取到末尾返回null

字节输出流、OutputStream抽象类

子类:FileOutputStream、BufferedOutputStream、PrintStream

--System.out就是一个PrintStream对象

常用方法

write() //将字节写入流 
write(byte[] b) //将字节数组写入流
flush() //刷新输出流,将缓冲区的内容写入输出流
close() //关闭流

字符输出流、Writer抽象类

子类:FileWriter、BufferedWriter、OutputStreamWriter

常用方法

write() //将字符写入流 
write(String str) //将字符串写入流
write(char[] c) //将字符数组写入流
flush() //刷新输出流,将缓冲区的内容写入输出流
close() //关闭流
posted @ 2026-08-07 10:24  Fēngwèi  阅读(3)  评论(0)    收藏  举报