跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
Javajava

Java IO流:从字节流到字符流

综述由AI生成介绍了Java IO流的基本概念,详细讲解了字节流和字符流的使用方法,并通过示例演示了文件读写操作。涵盖了缓冲流、转换流及对象流的应用,最后展示了如何使用File类进行基本的文件操作。

CodeArtist发布于 2026/2/18更新于 2026/5/2623 浏览
Java IO流:从字节流到字符流

Java IO流:从字节流到字符流

IO流概述

学习目标与重点提示

  • 理解IO流的基本概念
  • 掌握字节流和字符流的使用方法
  • 了解缓冲流、转换流、对象流等高级流的应用场景
  • 掌握文件操作的方法

重点:

  • 字节流(FileInputStream、FileOutputStream)
  • 字符流(FileReader、FileWriter)
  • 缓冲流(BufferedInputStream、BufferedOutputStream、BufferedReader、BufferedWriter)

IO流的基本概念

IO流:用于处理输入和输出操作的流,分为字节流和字符流。

  • 字节流:以字节为单位读取和写入数据的流,适用于处理二进制文件,如图片、音频、视频等。
  • 字符流:以字符为单位读取和写入数据的流,适用于处理文本文件,如.txt、.java等。

IO流的分类:

  • 输入流:从数据源读取数据的流。
  • 输出流:向数据目的地写入数据的流。
  • 节点流:直接与数据源或数据目的地连接的流,如FileInputStream、FileOutputStream、FileReader、FileWriter等。
  • 处理流:对节点流进行包装的流,如缓冲流、转换流、对象流等。

字节流

字节流分为输入字节流和输出字节流。

输入字节流

输入字节流的基类是InputStream,常用的实现类包括FileInputStream、ByteArrayInputStream等。

FileInputStream

定义:FileInputStream是用于读取文件内容的输入字节流。

创建对象:

FileInputStream fis = new FileInputStream("文件路径");

示例:

import java.io.FileInputStream;
import java.io.IOException;

public class TestFileInputStream {
    public static void main(String[] args) {
        try (FileInputStream fis = new FileInputStream("test.txt")) {
            int data;
            while ((data = fis.read()) != -1) {
                System.out.print((char) data);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

输出结果:如果test.txt文件的内容是'Hello, Java!',则输出'Hello, Java!'。

输出字节流

输出字节流的基类是OutputStream,常用的实现类包括FileOutputStream、ByteArrayOutputStream等。

FileOutputStream

定义:FileOutputStream是用于写入文件内容的输出字节流。

创建对象:

FileOutputStream fos = new FileOutputStream("文件路径");

示例:

import java.io.FileOutputStream;
import java.io.IOException;

public class TestFileOutputStream {
    public static void main(String[] args) {
        try (FileOutputStream fos = new FileOutputStream("test.txt")) {
            String str = "Hello, Java!";
            fos.write(str.getBytes());
            System.out.println("文件写入成功!");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

输出结果:输出'文件写入成功!',并在test.txt文件中写入'Hello, Java!'。

字符流

字符流分为输入字符流和输出字符流。

输入字符流

输入字符流的基类是Reader,常用的实现类包括FileReader、CharArrayReader等。

FileReader

定义:FileReader是用于读取文本文件内容的输入字符流。

创建对象:

FileReader fr = new FileReader("文件路径");

示例:

import java.io.FileReader;
import java.io.IOException;

public class TestFileReader {
    public static void main(String[] args) {
        try (FileReader fr = new FileReader("test.txt")) {
            int data;
            while ((data = fr.read()) != -1) {
                System.out.print((char) data);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

输出结果:如果test.txt文件的内容是'Hello, Java!',则输出'Hello, Java!'。

输出字符流

输出字符流的基类是Writer,常用的实现类包括FileWriter、CharArrayWriter等。

FileWriter

定义:FileWriter是用于写入文本文件内容的输出字符流。

创建对象:

FileWriter fw = new FileWriter("文件路径");

示例:

import java.io.FileWriter;
import java.io.IOException;

public class TestFileWriter {
    public static void main(String[] args) {
        try (FileWriter fw = new FileWriter("test.txt")) {
            String str = "Hello, Java!";
            fw.write(str);
            System.out.println("文件写入成功!");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

输出结果:输出'文件写入成功!',并在test.txt文件中写入'Hello, Java!'。

处理流

处理流是对节点流进行包装的流,用于提高输入和输出效率。

缓冲流

缓冲流分为缓冲字节流和缓冲字符流,用于提高输入和输出效率。

缓冲字节流

定义:缓冲字节流是对字节流进行包装的流,包括BufferedInputStream和BufferedOutputStream。

创建对象:

BufferedInputStream bis = new BufferedInputStream(new FileInputStream("文件路径"));
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("文件路径"));

示例:

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class TestBufferedStream {
    public static void main(String[] args) {
        try (BufferedInputStream bis = new BufferedInputStream(new FileInputStream("test.txt"));
             BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("test_copy.txt"))) {
            int data;
            while ((data = bis.read()) != -1) {
                bos.write(data);
            }
            System.out.println("文件复制成功!");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

输出结果:输出'文件复制成功!',并在test_copy.txt文件中写入'Hello, Java!'。

缓冲字符流

定义:缓冲字符流是对字符流进行包装的流,包括BufferedReader和BufferedWriter。

创建对象:

BufferedReader br = new BufferedReader(new FileReader("文件路径"));
BufferedWriter bw = new BufferedWriter(new FileWriter("文件路径"));

示例:

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

public class TestBufferedReaderWriter {
    public static void main(String[] args) {
        try (BufferedReader br = new BufferedReader(new FileReader("test.txt"));
             BufferedWriter bw = new BufferedWriter(new FileWriter("test_copy.txt"))) {
            String line;
            while ((line = br.readLine()) != null) {
                bw.write(line);
                bw.newLine();
            }
            System.out.println("文件复制成功!");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

输出结果:输出'文件复制成功!',并在test_copy.txt文件中写入'Hello, Java!'。

✅ 结论:缓冲流可以提高输入和输出效率,建议在实际开发中使用缓冲流。

转换流

转换流分为InputStreamReader和OutputStreamWriter,用于在字节流和字符流之间进行转换。

InputStreamReader

定义:InputStreamReader是用于将字节流转换为字符流的流。

创建对象:

InputStreamReader isr = new InputStreamReader(new FileInputStream("文件路径"), "字符编码");

示例:

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;

public class TestInputStreamReader {
    public static void main(String[] args) {
        try (InputStreamReader isr = new InputStreamReader(new FileInputStream("test.txt"), "UTF-8")) {
            int data;
            while ((data = isr.read()) != -1) {
                System.out.print((char) data);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

输出结果:如果test.txt文件的内容是'Hello, Java!',则输出'Hello, Java!'。

OutputStreamWriter

定义:OutputStreamWriter是用于将字符流转换为字节流的流。

创建对象:

OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("文件路径"), "字符编码");

示例:

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;

public class TestOutputStreamWriter {
    public static void main(String[] args) {
        try (OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("test.txt"), "UTF-8")) {
            String str = "Hello, Java!";
            osw.write(str);
            System.out.println("文件写入成功!");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

输出结果:输出'文件写入成功!',并在test.txt文件中写入'Hello, Java!'。

对象流

对象流分为ObjectInputStream和ObjectOutputStream,用于将对象序列化和反序列化。

序列化

定义:序列化是将对象转换为字节流的过程。

示例:

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.io.Serializable;

class Person implements Serializable {
    private static final long serialVersionUID = 1L;
    private String name;
    private int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

public class TestObjectOutputStream {
    public static void main(String[] args) {
        try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("person.txt"))) {
            Person person = new Person("张三", 20);
            oos.writeObject(person);
            System.out.println("对象序列化成功!");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

输出结果:输出'对象序列化成功!',并在person.txt文件中写入序列化后的对象。

反序列化

定义:反序列化是将字节流转换为对象的过程。

示例:

import java.io.FileInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;

public class TestObjectInputStream {
    public static void main(String[] args) {
        try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream("person.txt"))) {
            Person person = (Person) ois.readObject();
            System.out.println("对象反序列化成功!");
            System.out.println(person);
        } catch (IOException | ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
}

输出结果:输出'对象反序列化成功!'和'Person{name='张三', age=20}'。

⚠️ 注意:要使对象可序列化,类必须实现Serializable接口。

文件操作

Java提供了File类,用于操作文件和目录。

File类的使用

示例:

import java.io.File;
import java.io.IOException;

public class TestFile {
    public static void main(String[] args) {
        // 创建文件对象
        File file = new File("test.txt");

        // 判断文件是否存在
        if (file.exists()) {
            System.out.println("文件已存在!");
        } else {
            System.out.println("文件不存在!");
            try {
                file.createNewFile();
                System.out.println("文件创建成功!");
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        // 判断是否是文件
        System.out.println("是否是文件:" + file.isFile());

        // 判断是否是目录
        System.out.println("是否是目录:" + file.isDirectory());

        // 获取文件的名称
        System.out.println("文件的名称:" + file.getName());

        // 获取文件的路径
        System.out.println("文件的路径:" + file.getPath());

        // 获取文件的绝对路径
        System.out.println("文件的绝对路径:" + file.getAbsolutePath());

        // 获取文件的大小
        System.out.println("文件的大小:" + file.length() + "字节");

        // 删除文件
        if (file.delete()) {
            System.out.println("文件删除成功!");
        } else {
            System.out.println("文件删除失败!");
        }
    }
}

输出结果:

文件不存在!
文件创建成功!
是否是文件:true
是否是目录:false
文件的名称:test.txt
文件的路径:test.txt
文件的绝对路径:C:\Users\Administrator\Desktop\test.txt
文件的大小:0字节
文件删除成功!

总结

本章我们学习了Java的IO流,包括字节流和字符流。其中,字节流(FileInputStream、FileOutputStream)、字符流(FileReader、FileWriter)、缓冲流(BufferedInputStream、BufferedOutputStream、BufferedReader、BufferedWriter)是本章的重点内容。

目录

  1. Java IO流:从字节流到字符流
  2. IO流概述
  3. 学习目标与重点提示
  4. IO流的基本概念
  5. 字节流
  6. 输入字节流
  7. FileInputStream
  8. 输出字节流
  9. FileOutputStream
  10. 字符流
  11. 输入字符流
  12. FileReader
  13. 输出字符流
  14. FileWriter
  15. 处理流
  16. 缓冲流
  17. 缓冲字节流
  18. 缓冲字符流
  19. 转换流
  20. InputStreamReader
  21. OutputStreamWriter
  22. 对象流
  23. 序列化
  24. 反序列化
  25. 文件操作
  26. File类的使用
  27. 总结
  • 💰 8折买阿里云服务器限时8折了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • 树莓派智能家居毕设:AI 辅助开发与边缘推理实践
  • Simplify 一键自动填充插件使用指南
  • Hunyuan-MT-7B 助力国际 NGO 在华项目多语本地化
  • DApp 开发全流程:从合约设计到前端交互落地
  • Whisper 语音识别库安装与配置指南
  • 2026 年 3 月 23 日 AI 产业要闻:脑机接口落地与算力竞赛
  • 算法空间复杂度详解:概念与常见计算实例
  • Gerrit 配置:Gitweb 集成
  • DCU BW1000 环境部署 llama.cpp 推理 Qwen3-Coder 模型实战复盘
  • llama.cpp 量化模型部署实战:从模型转换到 API 服务
  • Xilinx FPGA 实现 RISC-V 五级流水线 CPU 设计与实战
  • Flutter inappwebview_cookie_manager 适配鸿蒙 HarmonyOS 安全隔离实践
  • GitHub Copilot 使用体验与功能场景分析
  • NWPU VHR-10 遥感目标检测数据集:从数据解析到 YOLO 实战
  • Agent Native 取代 Copilot:智能体重塑公司架构与组织
  • Moon VR Video Player 评测:支持 8K/12K 多音轨与外挂字幕
  • 渐进式 AIGC 系统:多模态大模型与 Agent 智能体私有化部署方案
  • WorkBuddy 桌面智能体安装与实战指南
  • 纯 Java 手写多功能 AI Agent:从零实现类 Manus 智能体架构
  • 基于 Python+Django 的热门旅游景点推荐系统设计与实现

相关免费在线工具

  • Keycode 信息

    查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online

  • Escape 与 Native 编解码

    JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online

  • JavaScript / HTML 格式化

    使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online

  • JavaScript 压缩与混淆

    Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online