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(字节流):将输出的字符流转换为字节流
- 处理流-缓冲流:先缓存,再一次性写入,提高读写效率,BufferedReader的readLine()可以读取一行,读取到末尾返回null
- 按数据单位:字节流、字符流;字节流-处理二进制数据(图片、视频、字节文件),字符流-处理文本数据(字符编码)。
- 代码示例:
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() //关闭流 |
|
字节输出流、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() //关闭流 |
本文来自博客园,作者:Fēngwèi,转载请注明原文链接:https://www.cnblogs.com/fengwei-blogs/p/22301669

浙公网安备 33010602011771号