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来警告调用方。请阅读有关异常的教程。不同之处在于,调用方会知道出现了问题打开并可以告诉最终用户(通过显示对话框、打印消息