我有以下方法:
public void writeToFile(
String id,
String no,
int systol,
int diastol,
int pulsDiff,
double speedAvg,
double spread
) {
String line =
id + "\t" + no + "\t" + systol + "/" + diastol + "\t" + pulsDiff
+ "\t" + speedAvg + "\t" + spread + "\r\n";
File fil = new File("resultat.txt");
BufferedWriter writer = null;
try {
writer = new BufferedWriter(new FileWriter(fil, true));
writer.write(line);
writer.close();
} catch (Exception e) {
System.err.println("Fejl: " + e.getMessage());
}
这可以用不同的方式完成吗?用一些不同的方法?这样做有什么好处?
我试图了解拥有bufferedWriter
的优势。我还在开始,我正试图理解这句话:“
通常,Writer会立即将其输出发送到基础字符或字节流。除非需要提示输出,否则建议将BufferedWriter包装在任何write()操作可能代价高昂的Writer周围,例如FileWriters和OutputStreamWriters。例如,
PrintWriter out = new PrintWriter(new BufferedWriter(new
FileWriter("foo.out")));
会将PrintWriter的输出缓冲到文件中。如果没有缓冲,每次调用print()方法都会导致字符转换为字节,然后立即写入文件,这可能效率很低。
特别是“通常,Writer会立即将其输出发送到基础字符或字节流”部分。
答案 0 :(得分:4)
由于您正在向编写器写入单个字符串,因此在这种情况下缓冲是无用的。
应该真正解决的是异常处理和关闭作者的方式。如果写入或关闭不成功,则应使用异常警告调用者,而不是简单地记录错误并继续,就像没有发生任何事情一样。
作者应该在finally块中关闭,或者使用try-with-resources构造,以确保它始终关闭。
答案 1 :(得分:1)
使用BufferedReader
或BufferedWriter
的好处是减少 物理读取和写入磁盘的数量。它利用缓冲系统并一次执行读/写操作。因此效率更高。您可以尝试使用和不使用BufferedReader / BufferedWriter读取/写入大文件,并查看差异。
答案 2 :(得分:1)
想象一下,你是一个与操作系统对话的Java指令。没有缓冲,情况就像(非常简化):
Java -> OS: Hello, operating system, I'd like to write character c to file F
OS -> HDD : Hello, disk, please append character c to file F
HDD -> OS after a few milliseconds : I'm done.
OS -> Java : Done
如果你在文件中写了很多字符,那么这种沟通就没有必要了 - 他们还在谈论同样的事情,这是浪费时间!这就是我们使用缓冲区的原因。看看情况如何变化:
Java -> OS: Hello, operating system, I'd like to write bunch of characters c[] to file F
OS -> HDD : Hello, disk, please append characters c[] to file F
HDD -> OS after a few tens of milliseconds : I'm done.
OS -> Java : Done
周期。整个机器,所有磁盘寻求等等,只被调用一次。
答案 3 :(得分:-1)
如果你使用+运算符连接,你可以创建多个字符串,直到得到最终结果: “a”+“b”+“c”+“d”表示你首先拥有“ab”,然后你想要添加另一个char以获得“abc”,最后你还有另外一个获得“abcd”。
第二种选择是克服这种低效率的方法。
修改强>
我的回答一般是关于字符串连接。正如boxed__l在他的评论中给出的引用中所提到的,在某些情况下可能会有优化,然后串联由StringBuilder完成(即使它没有明确地完成)。但是,有些情况(例如,在循环中完成串联时),当它很重要并且编译器无法进行优化时。