BufferedWriter的优点

时间:2014-01-05 10:54:13

标签: java printwriter bufferedwriter

我有以下方法:

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会立即将其输出发送到基础字符或字节流”部分。

4 个答案:

答案 0 :(得分:4)

由于您正在向编写器写入单个字符串,因此在这种情况下缓冲是无用的。

应该真正解决的是异常处理和关闭作者的方式。如果写入或关闭不成功,则应使用异常警告调用者,而不是简单地记录错误并继续,就像没有发生任何事情一样。

作者应该在finally块中关闭,或者使用try-with-resources构造,以确保它始终关闭。

答案 1 :(得分:1)

使用BufferedReaderBufferedWriter的好处是减少 物理读取和写入磁盘的数量。它利用缓冲系统并一次执行读/写操作。因此效率更高。您可以尝试使用和不使用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完成(即使它没有明确地完成)。但是,有些情况(例如,在循环中完成串联时),当它很重要并且编译器无法进行优化时。