它们之间的区别是什么?我只是学习Java ATM,但似乎我可以通过两种方式写入文件,即(我没有在这里复制try-catch块。)
FileWriter file = new FileWriter("foo.txt");
file.write("foobar");
file.close();
和
FileWriter file = new FileWriter("foo.txt");
BufferedWriter bf = new BufferedWriter(file);
bf.write("foobar");
bf.close();
我理解首先缓冲数据的概念,这是否意味着第一个示例逐个写入字符,第二个示例首先将其缓冲到内存并写入一次?
答案 0 :(得分:80)
如果你
,BufferedWriter会更有效率在您的示例中,您只有一次写入,因此BufferedWriter只会增加您不需要的开销。
这是否意味着第一个示例逐个写入字符,第二个示例首先将其缓冲到内存并将其写入一次
在这两种情况下,字符串都会立即写入。
如果你只使用FileWriter你的write(String)调用
public void write(String str, int off, int len)
// some code
str.getChars(off, (off + len), cbuf, 0);
write(cbuf, 0, len);
}
这对每次调用write(String)进行一次系统调用。
BufferedWriter提高效率的地方是多次小写。
for(int i = 0; i < 100; i++) {
writer.write("foorbar");
writer.write(NEW_LINE);
}
writer.close();
如果没有BufferedWriter,这可能会使200(2 * 100)次系统调用和写入磁盘效率低下。使用BufferedWriter,这些都可以缓冲在一起,并且默认缓冲区大小为8192个字符,这只是一个系统调用写入。
答案 1 :(得分:8)
你是对的。以下是write()
的{{1}}方法的外观:
BufferedWriter
正如您所看到的,它确实检查缓冲区是否已满(public void write(int c) throws IOException {
synchronized (lock) {
ensureOpen();
if (nextChar >= nChars)
flushBuffer();
cb[nextChar++] = (char) c;
}
}
)并刷新缓冲区。然后它将新字符添加到缓冲区(if (nextChar >= nChars)
)。
答案 2 :(得分:4)
BufferedWriter效率更高。如果内存正确地为我服务,它可以在一个较大的块中节省小的写入和写入。如果你做了很多小写,那么我会使用BufferedWriter。通常需要调用对OS的写入调用,这样写入速度很慢,因此编写尽可能少的写入。
答案 3 :(得分:0)
来自Java API规范:
用于编写字符文件的便捷类。此类的构造函数假定默认字符编码和默认字节缓冲区大小是可接受的。
将文本写入字符输出流,缓冲字符,以便有效地写入单个字符,数组和字符串。
答案 4 :(得分:0)
http://docs.oracle.com/javase/1.5.0/docs/api/java/io/BufferedWriter.html
通常,Writer会立即将其输出发送到基础字符或字节流。除非需要提示输出,否则建议将BufferedWriter包装在任何write()操作可能代价高昂的Writer周围,例如FileWriters和OutputStreamWriters。例如,
PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter(“foo.out”)));
会将PrintWriter的输出缓冲到文件中。如果没有缓冲,每次调用print()方法都会导致字符转换为字节,然后立即写入文件,这可能效率很低。
答案 5 :(得分:-1)
在无缓冲的输入/输出(FileWriter,FileReader)中,读取或写入请求由底层OS直接处理。 https://hajsoftutorial.com/java/wp-content/uploads/2018/04/Unbuffered.gif
这会使程序的效率降低,因为每个此类请求通常会触发磁盘访问,网络活动或其他相对昂贵的操作。为了减少这种开销,Java平台实现了缓冲的I / O流。 BufferedReader和BufferedWriter类提供内部字符缓冲区。写入缓冲写入器的文本存储在内部缓冲区中,只有在缓冲区填满或刷新时才写入底层编写器。 https://hajsoftutorial.com/java/wp-content/uploads/2018/04/bufferedoutput.gif