前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java IO流之BufferedOutputStream类,让Java文件操作更高效!

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

原创
作者头像
喵手
发布2023-11-17 11:35:56
4130
发布2023-11-17 11:35:56
举报
文章被收录于专栏:Java进阶实战Java进阶实战

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腾讯技术创作特训营第三期有奖征文,组队打卡瓜分大奖!

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

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

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
    • 摘要
    • BufferedOutputStream类
      • 简介
        • 源代码解析
          • 应用场景案例
            • 案例代码
            • 案例代码结果
            • 案例代码分析:
          • 优缺点分析
            • 类代码方法介绍
              • 测试用例
                • 测试代码
                • 测试结果
                • 代码分析
              • 全文小结
              • 总结
              • 文末
              相关产品与服务
              腾讯云代码分析
              腾讯云代码分析(内部代号CodeDog)是集众多代码分析工具的云原生、分布式、高性能的代码综合分析跟踪管理平台,其主要功能是持续跟踪分析代码,观测项目代码质量,支撑团队传承代码文化。
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档