Java 输入输出相关概念介绍(File、IO 流)(十八)(BufferedWriter)

142 阅读3分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第18天,点击查看活动详情

上一篇文章我们介绍了Writer 的实现类:CharArrayWriter,本篇文章我们会继续介绍Writer 的另一个实现类:BufferedWriter。

BufferedWriter 类的基本概念

根据名字我们可以看出,BufferedWriter 是缓冲字符输出流。

因为继承于Writer 的原因,所以它也具有Writer 的所有性质。

BufferedWriter 在使用过程中,需要和其他字符流配合,作用就是为其他字符输出流添加缓冲功能,从而提高效率。

本质上,可以认为BufferedWriter 一个很大的作用就是是给FileWriter 提高效率。

举例来说,当我们向磁盘中不断的写入字节时,如果不使用带缓冲功能的输出流,那么每写入一个字节就要打开一次到待写入磁盘的通道,这个结果是我们不希望看到的。

在当我们使用BufferedWriter 将底层字符输出流(比如FileWriter)进行包装之后,在我们的系统中就可以先将要处理的字符写入到BufferedWriter 的缓存空间中,当达到一定数量时,系统会一次性将数据写入FileWriter 流中,此时FileWriter 仅仅需要打开一次通道就可以将这个数据块写入到文件之中。

如果文件比较大,这样做虽然可能不会一次就将所有数据写入磁盘中,但是也会大大减少磁盘访问量,同时也大大提高了效率。

BufferedWriter 的方法

构造方法

// 创建BufferedWriter 实例,缓存数组默认大小8192
BufferedWriter(Writer out)
// 根据传入的参数确定缓存数组大小,然后创建BufferedWriter 实例
BufferedWriter(Writer out, int sz)

其他方法

// 关闭流,释放资源
void close()
// 刷新缓存,将BufferedWriter 实例中缓存的字符刷到底层的输出流中
void flushBuffer()
// 刷新流,同时刷新底层流
void flush()
// 向流中写入一个换行符
void newLine()
// 向BufferedWriter 实例的缓存数组中写入单个字符
void write(int c)
// 下面两个函数功能相近,根据参数内容,将前面数组或者字符串的一部分内容写入流中
void write(char cbuf[], int off, int len)
void write(String s, int off, int len)

使用举例

public static void main(String[] args) throws IOException {
  File file = new File("/abc/def/copy.txt");
  FileWriter fileWriter = new FileWriter(file, true);
  BufferedWriter bufferedWriter = new BufferedWriter(fileWriter);
  bufferedWriter.write("123456abcdefg");
  bufferedWriter.flush();
  bufferedWriter.close();
}

这个例子的使用过程也比较详细,首先找到目标文件,使用File 类做实例化。然后创建FileWriter 实例,建立出数据输出通道。FileWriter 的构造函数中的第二个参数true 代表在已有文件后追加内容而不是覆盖。接着实例化BufferedWriter 实例,建立缓冲输出流对象。在这之后就可以调用write 方法写出数据了。最后调用flush 方法和close 方法刷新并关闭流。

总结

BufferedWriter 在我们日常开发中经常会使用到,与FileWriter 配合,提高我们系统的效率。所以说BufferedWriter 的概念和使用方法我们要记清楚。接下来的文章我们继续介绍Writer 类的其他几个子类。