Java IO流之BufferedOutputStream类,让Java文件操作更高效!

2023-11-17 11:35:56 浏览数 (1)


theme: healer-readable

highlight: a11y-dark


哈喽,各位小伙伴们,你们好,我是喵手。

  今天我要给大家分享一些自己日常学习到的一些知识点,并以文字的形式跟大家一起交流学习,互相学习,一群人方能走的更远。

  我是一名Java开发,所以日常接触到最多的就是java啦,所以我趁自己有空,就来好好回忆,把自己学到的会的,进行输出,不图什么有回报,只想能帮助到更多的小伙伴,就好。

小伙伴们在批阅的过程中,如果觉得文章不错,欢迎点赞、收藏、关注哦。三连即是对作者我写作道路上最好的鼓励与支持!

前言

  在Java开发语言中,IO流是非常常见的操作。在IO流中,BufferedOutputStream类是一个非常重要的类。BufferedOutputStream类继承自OutputStream类,是一个带缓冲区的输出流,可以提高输出效率和减少IO次数。在本篇文章中,我们将对BufferedOutputStream类进行深入的研究和分析。

摘要

  本篇文章主要针对Java中的BufferedOutputStream类进行讲解,包括其简介,源代码解析,应用场景案例,优缺点分析,以及类代码方法介绍和测试用例等方面,旨在帮助读者更好地掌握此类的使用方法及其相关知识。

BufferedOutputStream类

简介

  BufferedOutputStream类是一个带缓冲区的输出流,其主要作用是用于提高输出效率和减少IO次数。在使用BufferedOutputStream类时,可以使用write()方法进行写操作,该方法会将数据写入到缓冲区中,当缓冲区满时,缓冲区中的数据会被一次性写出。此外,还可以使用flush()方法将缓冲区中的数据强制写出。BufferedOutputStream类的构造方法如下:

代码语言:java复制
public BufferedOutputStream(OutputStream out, int size)

  其中第一个参数out是输出流对象,第二个参数size是缓冲区的大小。如果不指定缓冲区的大小,默认为8192字节。

源代码解析

BufferedOutputStream类的源代码如下:

代码语言:java复制
public class BufferedOutputStream extends FilterOutputStream {
    protected byte buf[];
    protected int count;

    public BufferedOutputStream(OutputStream out, int size) {
        super(out);
        if (size <= 0) {
            throw new IllegalArgumentException("Buffer size <= 0");
        }
        buf = new byte[size];
    }

    public BufferedOutputStream(OutputStream out) {
        this(out, 8192);
    }

    private void flushBuffer() throws IOException {
        if (count > 0) {
            out.write(buf, 0, count);
            count = 0;
        }
    }

    public synchronized void write(int b) throws IOException {
        if (count >= buf.length) {
            flushBuffer();
        }
        buf[count  ] = (byte) b;
    }

    public synchronized void write(byte b[], int off, int len) throws IOException {
        if (len >= buf.length) {
            flushBuffer();
            out.write(b, off, len);
            return;
        }
        if (len > buf.length - count) {
            flushBuffer();
        }
        System.arraycopy(b, off, buf, count, len);
        count  = len;
    }

    public synchronized void flush() throws IOException {
        flushBuffer();
        out.flush();
    }
}

  从源代码中可以看出,BufferedOutputStream类继承自FilterOutputStream类,并重写了write()flush()write(byte[], int, int)方法。

部分源码如下:

在这里插入图片描述在这里插入图片描述

  想更深入的学习可以自行去参考源码学习。

应用场景案例

  BufferedOutputStream常用于网络编程和文件处理中。在网络编程中,为了提高网络传输效率,一般都会使用缓冲区。在文件处理中,使用BufferedOutputStream可以避免频繁写入硬盘,从而提高文件读写效率。

案例代码

以下是一个使用BufferedOutputStream类处理文件读写的案例:

代码语言:java复制
package com.example.javase.io.fileProject;

import java.io.*;

/**
 * @author 喵手
 * @version 1.0
 * @date 2023/10/20 17:35
 */
public class BufferedOutputStreamTest {

    //处理文件读写
    public static void test_1() throws IOException {
            String content = "Hello, BufferedOutputStream!";
            byte[] bytes = content.getBytes();

            File file = new File("testDoc.txt");

            OutputStream outputStream = new FileOutputStream(file);
            BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(outputStream);

            bufferedOutputStream.write(bytes);
            bufferedOutputStream.flush();

            bufferedOutputStream.close();

            InputStream inputStream = new FileInputStream(file);
            BufferedInputStream bufferedInputStream = new BufferedInputStream(inputStream);

            byte[] readBytes = new byte[1024];
            int len;
            while ((len = bufferedInputStream.read(readBytes)) != -1) {
                System.out.println(new String(readBytes, 0, len));
            }

            bufferedInputStream.close();
    }

    public static void main(String[] args) throws IOException {
        test_1();
    }
}

案例代码结果

根据如上案例代码,本地测试演示结果如下:

在这里插入图片描述在这里插入图片描述

案例代码分析:

  本段代码演示了使用BufferedOutputStream和BufferedInputStream完成文件的写入和读取的过程。

  在方法test_1()中,首先将字符串转换为字节数组,接着创建文件对象file,并使用FileOutputStream将其包装成OutputStream对象outputStream。然后将outputStream包装成BufferedOutputStream对象bufferedOutputStream,输入字节数组并刷新缓冲区,最后关闭输出流。

  接着使用FileInputStream将file包装成InputStream对象inputStream,然后将inputStream包装成BufferedInputStream对象bufferedInputStream,并定义一个字节数组readBytes和int型变量len。使用while循环每次读取流中的数据到readBytes中,并根据实际读取的字节数len转换为String类型打印到控制台。最后关闭输入流。

  最后呢,在main方法中调用了test_1()方法即可。

优缺点分析

  BufferedOutputStream类的优点是可以减少IO次数,提高写入效率。另外,该类还可以设置缓冲区大小,以便更好地适应不同的场景。缺点是如果缓冲区过大,会占用过多内存资源,从而导致程序的运行效率降低。

类代码方法介绍

  BufferedOutputStream类中常用的方法有write()、flush()和close()方法。

  • write()方法:向缓冲区中写入字节,当缓冲区满了之后,会将缓冲区中的数据一次性写出。
  • flush()方法:刷新缓冲区,将缓冲区中的数据强制写出。
  • close()方法:关闭输出流,释放资源。

测试用例

  为了验证BufferedOutputStream类的正确性和效率,我们可以编写如下的测试用例:

测试代码

代码语言:java复制
    public static void test_2() throws IOException {
        File file = new File("testDoc.txt");
        OutputStream outputStream = new FileOutputStream(file);
        BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(outputStream, BUFFER_SIZE);

        String content = "Hello, BufferedOutputStream!";
        byte[] bytes = content.getBytes();

        bufferedOutputStream.write(bytes);
        bufferedOutputStream.flush();
        bufferedOutputStream.close();

        InputStream inputStream = new FileInputStream(file);
        byte[] readBytes = new byte[BUFFER_SIZE];
        int len = inputStream.read(readBytes);
        System.out.println("len:" len);
    }


    public static void main(String[] args) throws IOException {
        test_2();
    }

  该测试用例首先使用BufferedOutputStream类将字符串“Hello, World!”写入到文件output.txt中,然后再使用FileInputStream类读取该文件,并将读取到的内容转化为字符串与原始字符串进行比较,以验证BufferedOutputStream类的正确性和效率。

测试结果

根据如上测试用例,测试结果如下:

在这里插入图片描述在这里插入图片描述

代码分析

如上测试用例代码演示了如何使用Java的BufferedOutputStream类来写入和读取文件。

  1. 首先创建一个文件对象,指定文件名为"testDoc.txt"。
  2. 然后创建一个输出流对象 outputStream,并把文件对象作为参数传入 FileOutputStream 构造方法中,用于将数据写入文件。
  3. 接着创建一个 BufferedOutputStream 对象 bufferedOutputStream,并传入 outputStream 和 BUFFER_SIZE 作为参数,BUFFER_SIZE 表示缓冲区大小。
  4. 定义一个字符串 content,将其转换为字节数组 bytes。
  5. 使用 bufferedOutputStream 的 write() 方法将字节数组写入缓冲区,使用 flush() 方法刷新缓冲区并将数据写入文件,最后使用 close() 方法关闭缓冲区和输出流。
  6. 创建一个输入流对象 inputStream,将文件对象作为参数传入 FileInputStream 构造方法中,用于读取文件数据。
  7. 创建一个字节数组 readBytes,用于存储从文件中读取的数据。使用输入流的 read() 方法读取数据,并将其存储在 readBytes 数组中。
  8. 最后打印读取的字节数 len。

全文小结

  本篇文章详细介绍了Java中的BufferedOutputStream类,包括其简介、源代码解析、应用场景案例、优缺点分析、类代码方法介绍和测试用例等方面。通过对BufferedOutputStream类的深入研究,我们可以更好地掌握该类的使用方法及其相关知识。

总结

  BufferedOutputStream类是一个非常重要的带缓冲区的输出流类,可以提高输出效率和减少IO次数。在实际开发中,我们应该根据具体的需求和场景选择合适的缓冲区大小,以便更好地适应不同的场景。同时,我们也需要注意缓冲区过大会占用过多内存资源,从而导致程序的运行效率降低。

... ...

文末

好啦,以上就是我这期的全部内容,如果有任何疑问,欢迎下方留言哦,咱们下期见。

... ...

学习不分先后,知识不分多少;事无巨细,当以虚心求教;三人行,必有我师焉!!!

wished for you successed !!!


⭐️若喜欢我,就请关注我叭。

⭐️若对您有用,就请点赞叭。

⭐️若有疑问,就请评论留言告诉我叭。

我正在参与2023腾讯技术创作特训营第三期有奖征文,组队打卡瓜分大奖!

0 人点赞