首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【愚公系列】2023年10月 Java教学课程 061-IO流之字符缓冲流

【愚公系列】2023年10月 Java教学课程 061-IO流之字符缓冲流

作者头像
愚公搬代码
发布2025-05-28 15:09:40
发布2025-05-28 15:09:40
10700
代码可运行
举报
文章被收录于专栏:历史专栏历史专栏
运行总次数:0
代码可运行

🚀一、IO流

🔎1.IO流概述

Java中IO流(Input/Output stream)用于处理输入和输出数据的机制,它包括输入流和输出流两个部分。输入流用于从外部读取数据,输出流用于向外部写入数据。Java中的IO流可以让我们从文件、网络、控制台等地方读取数据和输出数据。

IO流主要分为字节流和字符流两类,字节流适用于处理二进制数据,而字符流适用于处理文本数据。Java中的IO流分层结构非常清晰,所有的输入流和输出流都是从抽象基类InputStream和OutputStream派生出来的。在字符流中,所有的输入流和输出流都是从Reader和Writer派生出来的。

Java还提供了一些特殊的流,如对象流、缓冲流等,可以满足不同的需求。对象流可以将对象序列化和反序列化,缓冲流可以提高IO的效率。

Java中的IO流使用方便、功能强大,是Java程序员非常常用的工具之一。

🔎2.IO流分类

Java中的IO流可以按照以下方式进行分类:

  1. 按照数据流向分类:输入流和输出流。
  • 输入流:从外部读取数据到程序中,如FileInputStream、BufferedInputStream等。
  • 输出流:将程序中的数据输出到外部,如FileOutputStream、BufferedOutputStream等。
  1. 按照操作单位分类:字节流和字符流。
  • 字节流:以字节为单位进行数据操作,如InputStream、OutputStream、FileInputStream等。
  • 字符流:以字符为单位进行数据操作,如Reader、Writer、FileReader等。
  1. 按照缓冲区分类:缓冲流和非缓冲流。
  • 缓冲流:利用缓存区提高读写效率,如BufferedReader、BufferedWriter等。
  • 非缓冲流:不使用缓存区读写数据,如FileInputStream、FileOutputStream等。
  1. 根据功能分类:节点流和处理流。
  • 节点流:直接连接数据源或目标的流,如FileInputStream、FileOutputStream等。
  • 处理流:对已有的流进行包装,提供额外的功能,如BufferedInputStream、BufferedOutputStream等。

Java中的IO流具有多种分类方式,每种分类方式都有其特点和适用场景。开发者需要根据具体需求选择合适的IO流进行读写操作。

🔎3.IO流的使用场景

在Java中,IO流是用于读取和写入数据的重要方式,IO流的使用场景如下:

  1. 文件操作:读取和写入文件是常见的IO操作,使用文件输入流和输出流可以实现。
  2. 网络传输:通过网络传输数据时,可以使用Socket套接字和相关的输入输出流。
  3. 数据库操作:连接到数据库并读写数据时,使用输入输出流进行传输。
  4. 序列化和反序列化:将对象序列化为二进制流并在网络上传输或存储到磁盘中,然后再反序列化回对象时,可以使用ObjectInputStream和ObjectOutputStream等流。
  5. 缓存操作:为了提高性能,在读取和写入数据时,可以使用缓存输入输出流。
  6. 控制台输入输出:读取和输出控制台输入输出时,使用System.in和System.out等流。
  7. 图片、音频和视频操作:读取和保存图片、音频和视频时,使用相关的输入输出流。

IO流的使用场景非常广泛,在实际开发中,需要根据具体需求选择不同的流进行操作。

🔎4.总结

总结流的四大类:

  • 字节输入流:以内存为基准,来自磁盘文件/网络中的数据以字节的形式读入到内存中去的流称为字节输入流。
  • 字节输出流:以内存为基准,把内存中的数据以字节写出到磁盘文件或者网络中去的流称为字节输出流。
  • 字符输入流:以内存为基准,来自磁盘文件/网络中的数据以字符的形式读入到内存中去的流称为字符输入流。
  • 字符输出流:以内存为基准,把内存中的数据以字符写出到磁盘文件或者网络介质中去的流称为字符输出流。

🚀二、字符缓冲流

🔎1.字符缓冲流概述

Java中字符缓冲流是为了提高字符输入/输出效率而设计的。在字符输入/输出时,每个字符都会被逐个读入或写出,这样的效率非常低下。为了解决这个问题,Java提供了字符缓冲流,它可以将一批字符进行缓存,然后一次性读取或写出,从而提高效率。

字符缓冲流有两种类型:BufferedReader和BufferedWriter。BufferedReader用于读取字符数据,而BufferedWriter用于写出字符数据。它们都是以Reader和Writer为基础进行的封装。在使用字符缓冲流时,需要通过创建Reader或Writer对象,再使用BufferedReader或BufferedWriter进行封装,才能实现缓存功能。

Java中的字符缓冲流不仅提高了字符输入/输出效率,还可以通过设置缓存区的大小来满足不同需求。

🔎2.字符缓冲流的使用

Java中字符缓冲流是一种高效的输入输出流,可以提高读写操作的效率。它实际上是通过在内存中先读取一定量的数据,然后在一次性写入或读取,减少了文件的I/O操作次数,从而提高了程序的效率。

在Java中,字符缓冲流一般分为BufferedReader和BufferedWriter两种。其中,BufferedReader用于读取文本文件,BufferedWriter则用于写入文本文件。下面分别介绍它们的使用方法。

  1. 使用BufferedReader读取文本文件
代码语言:javascript
代码运行次数:0
运行
复制
import java.io.*;

public class ReadFileDemo {
    public static void main(String[] args) throws IOException {
        FileReader fr = new FileReader("test.txt");
        BufferedReader br = new BufferedReader(fr);
        String line;
        while ((line = br.readLine()) != null) {
            System.out.println(line);
        }
        br.close();
        fr.close();
    }
}

上述代码中,首先我们通过FileReader将文件读入内存中,然后通过BufferedReader读取文件内容并输出到控制台上。需要注意的是,我们在使用完BufferedReader后一定要关闭它,以免出现资源泄漏的问题。

  1. 使用BufferedWriter写入文本文件
代码语言:javascript
代码运行次数:0
运行
复制
import java.io.*;

public class WriteFileDemo {
    public static void main(String[] args) throws IOException {
        FileWriter fw = new FileWriter("test.txt");
        BufferedWriter bw = new BufferedWriter(fw);
        bw.write("Hello, World!");
        bw.newLine(); // 新增一行
        bw.write("Java is awesome!");
        bw.close();
        fw.close();
    }
}

上述代码中,我们通过FileWriter将内容写入文件中,并通过BufferedWriter将数据缓存在内存中,然后一次性写入到文件中。需要注意的是,在写入完数据后,我们同样需要关闭BufferedWriter对象。

以上就是Java中字符缓冲流的使用方法。通过它们的使用,我们可以减少文件I/O操作的次数,从而提高程序的效率。

🔎3.字符缓冲流的性能分析

Java中的字符缓冲流在处理大量文本数据时能够提高读写性能。下面是对Java字符缓冲流性能的分析:

  1. 缓冲区大小影响性能:字符缓冲流在读取或写入数据时,使用了内部缓冲区,缓冲区大小的设置会影响其性能。需要根据具体情况选择合适的缓冲区大小,一般建议设置为4KB或8KB。
  2. 读写速度与底层流的性能有关:字符缓冲流的读写速度也受到底层流的性能影响。如果底层流的读写速度较慢,则字符缓冲流也会受到限制。
  3. 字符编码影响性能:字符缓冲流在读写文本时,会进行字符编码转换。如果转换的编码复杂度较高,则可能会影响字符缓冲流的性能。
  4. 使用缓冲区刷新方法:字符缓冲流提供了flush()方法,可用于强制刷新缓冲区,将缓冲区中的数据写入底层流中。在需要及时将数据写入底层流中的场景下,使用flush()方法能够提高性能。
  5. 合理使用自动刷新功能:字符缓冲流还提供了自动刷新的功能,当缓冲区满时会自动刷新缓冲区。使用自动刷新功能能够避免频繁使用flush()方法带来的性能损失。

总之,合理使用缓冲区大小、选择合适的底层流、控制编码复杂度、及时刷新缓冲区等措施,能够提高Java字符缓冲流的性能。

🔎4.案例

以下是一个将文件中的数据按照指定规则排序的示例代码:

代码语言:javascript
代码运行次数:0
运行
复制
public static void main(String[] args) {
    try(
            // 1、创建一个缓冲字符输入流管道与源文件接通
            BufferedReader br = new BufferedReader(new FileReader("io-app2\\src\\csb2.txt"));
            // 5、创建一个缓冲字符输出流管道通向目标文件
            BufferedWriter bw = new BufferedWriter(new FileWriter("io-app2/src/newcsb.txt"));
            ) {

        // 2、定义一个List集合存储每行数据
        List<String> data = new ArrayList<>();
        // 3、按照行读取每段文章
        String line;
        while ((line = br.readLine()) != null) {
            // 4、把这行数据存入到集合中去
            data.add(line);
        }
        System.out.println(data);
        // 4、对集合中的每段文章进行首字母排序(拓展)
        // 指定比较规则
        List<String> sizes = new ArrayList<>();
        Collections.addAll(sizes, "一","二","三","四","五","陆","柒","八","九","十","十一");
        Collections.sort(data, new Comparator<String>() {
            @Override
            public int compare(String o1, String o2) {
                // o1  三.侍中、侍郎郭攸之
                // o2 十一.新阿迪...
                return sizes.indexOf(o1.substring(0,o1.indexOf(".")))
                        - sizes.indexOf(o2.substring(0,o2.indexOf("."))) ;
            }
        });
        System.out.println(data);



        // 6、遍历data集合中的每行文章,写出去换行
        for (String ln : data) {
            bw.write(ln);
            bw.newLine(); // 换行
        }

    } catch (Exception e) {
        e.printStackTrace();
    }
}

以上示例中,我们使用了冒泡排序将读取到的数据按照字典序进行排序。排完序后,我们将数据写入一个临时文件,并将临时文件重命名为原文件名,实现了将文件中数据排序的功能。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-10-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 🚀一、IO流
    • 🔎1.IO流概述
    • 🔎2.IO流分类
    • 🔎3.IO流的使用场景
    • 🔎4.总结
  • 🚀二、字符缓冲流
    • 🔎1.字符缓冲流概述
    • 🔎2.字符缓冲流的使用
    • 🔎3.字符缓冲流的性能分析
    • 🔎4.案例
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档