Java 缓冲写入程序优势

Java 缓冲写入程序优势,java,printwriter,bufferedwriter,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" +

我有以下方法:

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包装在任何write()操作可能代价高昂的写入程序周围,例如FileWriter和OutputStreamWriter。例如

 PrintWriter out    = new PrintWriter(new BufferedWriter(new 
     FileWriter("foo.out")));   
将把PrintWriter的输出缓冲到文件中。如果没有缓冲,每次调用print()方法都会导致字符转换为字节,然后立即写入文件,这可能非常低效


尤其是“一般来说,写入程序会立即将其输出发送到底层字符或字节流”部分。

如果使用+运算符连接,则实际上会创建许多字符串,直到得到最终结果: “a”+“b”+“c”+“d”表示首先有“ab”,然后要添加另一个字符以获得“abc”,最后还有另一个字符以获得“abcd”

第二种选择是克服这种低效的方法

编辑


我的回答通常是关于字符串连接的。正如boxed_ul在其评论中给出的参考中所提到的,在某些情况下,可能会进行优化,然后由StringBuilder进行连接(即使没有显式进行)。但是,也有一些情况(例如,在循环中进行连接),当它起作用时,编译器无法进行优化。

如果使用+运算符进行连接,则实际上会创建许多字符串,直到得到最终结果: “a”+“b”+“c”+“d”表示首先有“ab”,然后要添加另一个字符以获得“abc”,最后还有另一个字符以获得“abcd”

第二种选择是克服这种低效的方法

编辑


我的回答通常是关于字符串连接的。正如boxed_ul在其评论中给出的参考中所提到的,在某些情况下,可能会进行优化,然后由StringBuilder进行连接(即使没有显式进行)。但是,也有一些情况(例如,在循环中进行连接)使用
BufferedReader
BufferedWriter
的优点是减少了对磁盘的物理读写次数。它利用缓冲系统,一次完成读写操作。因此效率更高尝试在使用和不使用BufferedReader/BufferedWriter的情况下读取/写入一个大文件,并查看其区别。

使用
BufferedReader
BufferedWriter
的优点是减少了对磁盘的物理读取和写入次数。它利用缓冲系统,同时执行读取/写入操作一次。因此效率更高。您可以尝试使用和不使用BufferedReader/BufferedWriter读取/写入一个大文件,并查看其区别。

因为您只向写入器写入一个字符串,所以在这种情况下,缓冲是无用的

但是,真正需要解决的是异常处理和关闭写入程序的方式。如果写入或关闭未成功,则应使用异常警告调用方,而不是简单地记录错误并继续,就好像什么也没发生一样


并且应该在finally块中关闭writer,或者使用try with resources构造,以确保它始终处于关闭状态。

由于要向writer写入单个字符串,因此在这种情况下缓冲是无用的

但是,真正需要解决的是异常处理和关闭写入程序的方式。如果写入或关闭未成功,则应使用异常警告调用方,而不是简单地记录错误并继续,就好像什么也没发生一样


编写器应该在finally块中关闭,或者使用try with resources构造,以确保它始终处于关闭状态。

假设您是一条与操作系统对话的Java指令。如果没有缓冲,情况就像(非常简化):

如果您向一个文件中写入多个字符,则无需进行此通信-它们仍在谈论相同的字符,这是浪费时间!这就是我们使用缓冲区的原因。查看情况如何变化:

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

整个机器,所有的磁盘搜索等等,只被调用一次。

想象一下,你是一条与操作系统对话的Java指令。没有缓冲,情况就像(大大简化了):

如果您向一个文件中写入多个字符,则无需进行此通信-它们仍在谈论相同的字符,这是浪费时间!这就是我们使用缓冲区的原因。查看情况如何变化:

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

句号。整个机器,所有的磁盘搜索等等,只被调用一次。

我不太清楚你的意思。我在.txt文档的每一行都写了7个字符串。调用方应该如何得到警告,这有什么区别?我不太清楚finally块是什么,以及为什么writer应该在一行中关闭。不是吗当我刚写下“writer.close()时关闭;“?有一个对写入程序的写入调用:
writer.write(行);
。此调用后,写入程序立即关闭。因此缓冲是无用的。您可以直接将此行写入底层FileWriter。应通过使方法抛出IOException而不是捕获IOException来警告调用方。请阅读有关异常的教程。不同之处在于,调用方会知道出现了问题打开并可以告诉最终用户(通过显示对话框、打印消息