Java IO流

一、 核心定义与核心分类

  1. 核心定义:IO流是Java程序与外部设备(文件、网络、控制台)的数据传输通道,数据以有序序列单向流动,实现读写操作。

  2. 三大核心分类(核心考点)

按数据方向:输入流(程序读取外部数据)、输出流(程序向外写入数据)

按数据单位:字节流(以字节为单位,适配所有文件)、字符流(以字符为单位,仅适配文本文件)

按功能划分:节点流(直接操作数据源,底层基础流)、处理流(包装节点流,增强功能,不能单独使用)


二、 四大顶层抽象父类(所有IO流的根基)

  1. 字节流顶层(万能流,适配任意文件,核心基础)

输入字节流:InputStream,核心能力是读字节,必备方法为读数据、关闭流

输出字节流:OutputStream,核心能力是写字节,必备方法为写数据、刷新缓冲区、关闭流

  1. 字符流顶层(仅文本专用,无需手动转码,读写更便捷)

输入字符流:Reader,核心能力是读取字符,适配文本文件读取

输出字符流:Writer,核心能力是写入字符,支持直接写字符串,适配文本文件写入


三、 常用节点流(直接操作数据源,底层实用流)

  1. 字节节点流(高频使用,万能适配)

FileInputStream:专门读取文件数据的字节输入流

FileOutputStream:专门向文件写入数据的字节输出流,默认覆盖文件内容,开启追加模式可保留原内容

  1. 字符节点流(文本专属)

FileReader:读取文本文件,自动适配编码转换字符,无需手动处理编码

FileWriter:写入文本文件,可直接写入字符串,操作文本比字节流更简洁


四、 常用处理流(包装节点流,增强核心能力)

  1. 缓冲流(提升读写速度,最常用处理流)

◦ 字节缓冲流:BufferedInputStream、BufferedOutputStream,包装字节节点流,减少IO交互次数,大幅提速

字符缓冲流:BufferedReader、BufferedWriter,包装字符节点流,新增按行读、跨平台换行专属功能,文本读写首选

  1. 转换流(解决中文乱码核心流,字节流与字符流的桥梁)

InputStreamReader:字节输入流转字符输入流,可手动指定编码,避免文本读取乱码

OutputStreamWriter:字节输出流转字符输出流,指定编码写入,保障文本输出无乱码

  1. 其他实用处理流

数据流(DataInputStream/DataOutputStream):支持直接读写Java基本数据类型,无需手动转换字节

对象流(ObjectInputStream/ObjectOutputStream):实现对象序列化与反序列化,被序列化的类需实现Serializable接口


五、 使用规范(避坑关键)

  1. 关流规则:流使用后必须关闭,避免资源占用;遵循"先开后关、后开先关",关闭处理流会自动关闭其包装的节点流

  2. 资源释放方式:优先用JDK7+的自动关流方式,无需手动操作;传统方式需在指定代码块中手动关流,防止异常导致流未关闭

  3. 中文乱码解决:读取/写入文本时,用转换流指定统一编码;字节流读文本需按指定编码转字符串,避免乱码

  4. 输出流必做:写入数据后需刷新缓冲区,避免数据滞留,确保数据完整写入目标设备


六、 注意事项

  1. 字节流可处理所有类型文件,字符流仅处理文本文件,用字符流操作图片、视频等非文本文件会导致文件损坏

  2. 对象序列化需显式声明serialVersionUID,避免类结构修改后无法正常反序列化

  3. 控制台交互专用流:System.in是控制台输入字节流,System.out是控制台输出字节流

  4. 简化操作工具: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();
            }
        }
    }
}
相关推荐
JIngJaneIL2 小时前
基于java+ vue家庭理财管理系统(源码+数据库+文档)
java·开发语言·前端·数据库·vue.js·spring boot
hakesashou2 小时前
python 随机函数可以生成字符串吗
开发语言·python
FakeOccupational2 小时前
【经济学】 基本面数据(Fundamental Data)之 美国劳动力报告&非农就业NFP + ADP + 美国劳动力参与率LFPR
开发语言·人工智能·python
huluang2 小时前
Word文档批注智能克隆系统的设计与实现
开发语言·c#·word
superman超哥2 小时前
仓颉设计哲学核心:零成本抽象的实现原理与深度实践
开发语言·仓颉编程语言·仓颉·零成本抽象·仓颉设计
山上三树3 小时前
柔性数组(C语言)
c语言·开发语言·柔性数组
不要em0啦3 小时前
从0开始学python:简单的练习题3
开发语言·前端·python
老华带你飞3 小时前
电商系统|基于java + vue电商系统(源码+数据库+文档)
java·开发语言·前端·数据库·vue.js·spring boot·后端