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类来写入和读取文件。
- 首先创建一个文件对象,指定文件名为"testDoc.txt"。
- 然后创建一个输出流对象 outputStream,并把文件对象作为参数传入 FileOutputStream 构造方法中,用于将数据写入文件。
- 接着创建一个 BufferedOutputStream 对象 bufferedOutputStream,并传入 outputStream 和 BUFFER_SIZE 作为参数,BUFFER_SIZE 表示缓冲区大小。
- 定义一个字符串 content,将其转换为字节数组 bytes。
- 使用 bufferedOutputStream 的 write() 方法将字节数组写入缓冲区,使用 flush() 方法刷新缓冲区并将数据写入文件,最后使用 close() 方法关闭缓冲区和输出流。
- 创建一个输入流对象 inputStream,将文件对象作为参数传入 FileInputStream 构造方法中,用于读取文件数据。
- 创建一个字节数组 readBytes,用于存储从文件中读取的数据。使用输入流的 read() 方法读取数据,并将其存储在 readBytes 数组中。
- 最后打印读取的字节数 len。
全文小结
本篇文章详细介绍了Java中的BufferedOutputStream类,包括其简介、源代码解析、应用场景案例、优缺点分析、类代码方法介绍和测试用例等方面。通过对BufferedOutputStream类的深入研究,我们可以更好地掌握该类的使用方法及其相关知识。
总结
BufferedOutputStream类是一个非常重要的带缓冲区的输出流类,可以提高输出效率和减少IO次数。在实际开发中,我们应该根据具体的需求和场景选择合适的缓冲区大小,以便更好地适应不同的场景。同时,我们也需要注意缓冲区过大会占用过多内存资源,从而导致程序的运行效率降低。
... ...
文末
好啦,以上就是我这期的全部内容,如果有任何疑问,欢迎下方留言哦,咱们下期见。
... ...
学习不分先后,知识不分多少;事无巨细,当以虚心求教;三人行,必有我师焉!!!
wished for you successed !!!
⭐️若喜欢我,就请关注我叭。
⭐️若对您有用,就请点赞叭。
⭐️若有疑问,就请评论留言告诉我叭。
我正在参与2023腾讯技术创作特训营第三期有奖征文,组队打卡瓜分大奖!