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();
            }
        }
    }
}
相关推荐
XXOOXRT6 小时前
基于SpringBoot的加法计算器
java·spring boot·后端·html5
阿崽meitoufa6 小时前
JVM虚拟机:垃圾收集器和判断对象是否存活的算法
java·jvm·算法
yugi9878387 小时前
基于遗传算法优化主动悬架模糊控制的Matlab实现
开发语言·matlab
我是苏苏7 小时前
C#高级:使用ConcurrentQueue做一个简易进程内通信的消息队列
java·windows·c#
moxiaoran57537 小时前
Go语言的错误处理
开发语言·后端·golang
yugi9878388 小时前
MATLAB的多层感知器(MLP)与极限学习机(ELM)实现
开发语言·matlab
heartbeat..8 小时前
数据库基础知识体系:概念、约束、范式与国产产品
java·数据库·学习笔记·国产数据库
Never_Satisfied8 小时前
C#获取汉字拼音字母方法总结
开发语言·c#
zh_xuan8 小时前
kotlin 密封类
开发语言·kotlin
PXM的算法星球8 小时前
【操作系统】哲学家就餐问题实现详解
java