Java BufferedWriter
Java BufferedWriter类java.io.BufferedWriter提供对Writer实例的缓冲。缓冲可以大大提高IO的速度。而不是一次将一个字符写入网络或者磁盘,BufferedWriter
一次写入一个更大的块。这通常要快得多,尤其是对于磁盘访问和更大的数据量而言。
JavaBufferedWriter
是Java Writer的子类,因此可以在需要Writer
的任何地方使用。
Java BufferedWriter示例
要向" Writer"添加缓冲,只需将其包装在Java" BufferedWriter"中即可。看起来是这样的:
BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter("c:\data\output-file.txt"));
这个例子创建了一个" BufferedWriter",它将字符写入" FileWriter"。很简单,不是吗?
BufferedWriter缓冲区大小
我们可以设置缓冲区大小以供JavaBufferedWriter
内部使用。我们将size作为构造函数参数提供,如下所示:
int bufferSize = 8 * 1024; BufferedWriter bufferedWriter = new BufferedWriter( new FileWriter("c:\data\output-file.txt"), bufferSize);
本示例将" BufferedWriter"的内部缓冲区设置为8 KB。最好使用1024个字节的倍数的缓冲区大小。这与硬盘等大多数内置缓冲一起使用时效果最佳。
除了为输入流添加缓冲外," BufferedWriter"的行为与" Writer"的行为非常相似。尽管如此," BufferedWriter"还是增加了一个额外的方法:" newLine()"方法可以将换行符写入底层的" Writer"。另外,如果我们需要绝对确保到现在为止写入的字符已从缓冲区刷新到网络或者磁盘上,则可能需要调用flush()
。
write(int)
Java的BufferedWriter的write(int)方法将int的低16位作为单个字符写入其内部缓冲区。这是将单个字符写入JavaBufferedWriter
的示例:
bufferedWriter.write('A');
write(char [])
Java的BufferedWriter还具有一个write(char [])方法,该方法可以将一个字符数组写入其内部缓冲区。 write(char [])方法返回实际写入Writer的字符数。这是一个将字符数组写入JavaWriter
的示例:
char[] chars = new char[]{'A','B','C','D','E'}; bufferedWriter.write(chars);
写性能
向Java BufferedWriter中写入字符数组比一次写入一个字符要快。由于" BufferedWriter"会在将其内部写入的字符收集到缓冲区中之后再写入底层" Writer",因此提速速度不如其他" Writer"类(不使用缓冲)那样明显。但是,仍然有很小的提速。
flush()
Java" BufferedWriter"的" flush()"方法会将所有写入" BufferedWriter"的数据刷新到基础数据目标。通过调用flush()
,我们可以确保将所有缓冲的数据刷新(写入)到磁盘(或者网络,或者BufferedWriter
的目标位置)。这是一个通过调用Java的Flush()方法刷新写入Java BufferedWriter的数据的示例:
bufferedWriter.flush();
关闭一个BufferedWriter
完成向JavaBufferedWriter
中写入字符后,我们应该记住将其关闭。关闭BufferedWriter
也将关闭BufferedWriter
正在写入的Writer
实例。
关闭" BufferedWriter"是通过调用其" close()"方法完成的。这是关闭BufferedWriter
的样子:
bufferedWriter.close();
我们还可以使用Java 7中引入的try-with-resources构造。这是如何使用try-with-resources构造使用和关闭" BufferedWriter"外观的方法:
FileWriter output = new FileWriter("data/data.bin"); try(BufferedWriter bufferedWriter = new BufferedWriter(output)){ bufferedWriter.write("Hello World"); }
请注意,不再有任何显式的close()
方法调用。 try-with-resources构造可以解决这一问题。
还要注意,第一个FileWriter
实例不是在try-with-resources块内创建的。这意味着try-with-resources块不会自动关闭此FileWriter实例。但是,当关闭BufferedWriter时,它也会同时关闭写入的OutputStream实例,因此当关闭BufferedWriter时,FileWriter实例也将关闭。