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

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

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

我是一名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 !!!


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

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

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

相关推荐
SomeB1oody3 分钟前
【Rust中级教程】2.7. API设计原则之灵活性(flexible) Pt.3:借用 vs. 拥有、`Cow`类型、可失败和阻塞的析构函数及解决办法
开发语言·后端·性能优化·rust
LUCIAZZZ5 分钟前
Https解决了Http的哪些问题
java·网络·网络协议·spring·http·rpc·https
larance12 分钟前
Flask 发送邮件
后端·python·flask
Aska_Lv17 分钟前
从零到一写组件库-日志组件库
后端
论迹26 分钟前
【JavaEE】-- 多线程(初阶)2
java·开发语言·java-ee
桃子是唯一的水果35 分钟前
java 单例模式(Lazy Initialization)实现遍历文件夹下所有excel文件且返回其运行时间
java·单例模式·maven
+72036 分钟前
如何在java中用httpclient实现rpc post 请求
java·开发语言·rpc
ybq1951334543138 分钟前
javaEE-SpringBoot日志
java·spring boot·后端
火烧屁屁啦42 分钟前
【JavaEE进阶】图书管理系统 - 贰
java·spring
xzzd_jokelin42 分钟前
Spring AI 接入 DeepSeek:开启智能应用的新篇章
java·人工智能·spring·ai·大模型·rag·deepseek