一、 核心定义与核心分类
-
核心定义:IO流是Java程序与外部设备(文件、网络、控制台)的数据传输通道,数据以有序序列单向流动,实现读写操作。
-
三大核心分类(核心考点)
按数据方向:输入流(程序读取外部数据)、输出流(程序向外写入数据)
按数据单位:字节流(以字节为单位,适配所有文件)、字符流(以字符为单位,仅适配文本文件)
按功能划分:节点流(直接操作数据源,底层基础流)、处理流(包装节点流,增强功能,不能单独使用)
二、 四大顶层抽象父类(所有IO流的根基)
- 字节流顶层(万能流,适配任意文件,核心基础)
输入字节流:InputStream,核心能力是读字节,必备方法为读数据、关闭流
输出字节流:OutputStream,核心能力是写字节,必备方法为写数据、刷新缓冲区、关闭流
- 字符流顶层(仅文本专用,无需手动转码,读写更便捷)
输入字符流:Reader,核心能力是读取字符,适配文本文件读取
输出字符流:Writer,核心能力是写入字符,支持直接写字符串,适配文本文件写入
三、 常用节点流(直接操作数据源,底层实用流)
- 字节节点流(高频使用,万能适配)
FileInputStream:专门读取文件数据的字节输入流
FileOutputStream:专门向文件写入数据的字节输出流,默认覆盖文件内容,开启追加模式可保留原内容
- 字符节点流(文本专属)
FileReader:读取文本文件,自动适配编码转换字符,无需手动处理编码
FileWriter:写入文本文件,可直接写入字符串,操作文本比字节流更简洁
四、 常用处理流(包装节点流,增强核心能力)
- 缓冲流(提升读写速度,最常用处理流)
◦ 字节缓冲流:BufferedInputStream、BufferedOutputStream,包装字节节点流,减少IO交互次数,大幅提速
字符缓冲流:BufferedReader、BufferedWriter,包装字符节点流,新增按行读、跨平台换行专属功能,文本读写首选
- 转换流(解决中文乱码核心流,字节流与字符流的桥梁)
InputStreamReader:字节输入流转字符输入流,可手动指定编码,避免文本读取乱码
OutputStreamWriter:字节输出流转字符输出流,指定编码写入,保障文本输出无乱码
- 其他实用处理流
数据流(DataInputStream/DataOutputStream):支持直接读写Java基本数据类型,无需手动转换字节
对象流(ObjectInputStream/ObjectOutputStream):实现对象序列化与反序列化,被序列化的类需实现Serializable接口
五、 使用规范(避坑关键)
-
关流规则:流使用后必须关闭,避免资源占用;遵循"先开后关、后开先关",关闭处理流会自动关闭其包装的节点流
-
资源释放方式:优先用JDK7+的自动关流方式,无需手动操作;传统方式需在指定代码块中手动关流,防止异常导致流未关闭
-
中文乱码解决:读取/写入文本时,用转换流指定统一编码;字节流读文本需按指定编码转字符串,避免乱码
-
输出流必做:写入数据后需刷新缓冲区,避免数据滞留,确保数据完整写入目标设备
六、 注意事项
-
字节流可处理所有类型文件,字符流仅处理文本文件,用字符流操作图片、视频等非文本文件会导致文件损坏
-
对象序列化需显式声明serialVersionUID,避免类结构修改后无法正常反序列化
-
控制台交互专用流:System.in是控制台输入字节流,System.out是控制台输出字节流
-
简化操作工具:JDK1.8后的Files工具类,底层基于IO流实现,可快速完成简单的文件读写操作
要不要我帮你提炼一份IO流高频考点清单,聚焦考试和面试常考的核心知识点?
七、代码
java
package textio;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
public class Test1 {
public static void main(String[] args) throws IOException {
//
//1.创建文件字节流输出对象
//参数代表写入的文件路径和文件名,如果指定的文件不存在,则系统自动创建
//如果指定的文件夹不存在,则运行报错
//绝对路径:盘符;/文件夹/文件名--》不通用
//相对路径:相对当前的项目去查找需要的文件,有直接用,没有新建
FileOutputStream fos =new FileOutputStream("file/a.txt");
//2.写操作
fos.write(67);
for(int c='A';c<='C';c++){
fos.write(c);
}
//3.关闭流
fos.close();
}
}
java
package textio;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
public class Test2 {
public static void main(String[] args) throws IOException {
//1.创建文件字节输入流对象
FileInputStream fis =new FileInputStream("file/a.txt");
//2.读文件
while(true){
int n=fis.read();
if(n==-1) break;
System.out.println(n+"-------"+(char)n);
}
//将文件内容全部读取并打印出来
//3.关闭流
fis.close();
}
}
java
package textio;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
public class Test3 {
public static void main(String[] args) throws IOException {
//利用IO流实现文件的拷贝;file/a。txt
//1.创建文件字节输入输出流对象去
FileInputStream fis=new FileInputStream("file/image_3.jpg");
FileOutputStream fos= new FileOutputStream("file/ab_copy.jpg");
//2.读写操作
while(true){
int n=fis.read();
if(n==-1) break;
fos.write(n);
}
//3.关闭流
fis.close();
fos.close();
}
}
java
package textio;
import java.io.*;
public class Test4 {
public static void main(String[] args) throws IOException, ClassNotFoundException {
//利用IO流将对象存储在文件中
Student s=new Student ("李锦川",19,99.0);
FileOutputStream fos=new FileOutputStream("file/stu.txt");
//2.包装过滤流
ObjectOutputStream oos=new ObjectOutputStream(fos);
//3.写操作-》写对象
oos.writeObject(s);
//4.关闭流,最外层
oos.close();
FileInputStream fis =new FileInputStream("file/stu.txt");
ObjectInputStream ois =new ObjectInputStream(fis);
Object obj=ois.readObject();
System.out.println(obj);
ois.close();
}
}
java
package textio;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
public class Test6 {
public static void main(String[] args){
FileReader fr=null;
try{
fr=new FileReader("file/f.txt");
while(true){
int n=fr.read();
if(n==-1) break;
System.out.println((char) n);
}
}catch(IOException e){
}finally{
try {
fr.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}