Java 为什么直接使用print()方法存储数据要比将数据存储在字符串中然后写入文件快? 让我们考虑一下这个场景:我正在读取一个文件,然后对每一行进行微调,然后将数据存储在一个新文件中。现在,我尝试了两种方法:
将数据存储在字符串中,然后在末尾将其写入目标文件,如下所示:Java 为什么直接使用print()方法存储数据要比将数据存储在字符串中然后写入文件快? 让我们考虑一下这个场景:我正在读取一个文件,然后对每一行进行微调,然后将数据存储在一个新文件中。现在,我尝试了两种方法:,java,file,file-writing,Java,File,File Writing,将数据存储在字符串中,然后在末尾将其写入目标文件,如下所示: InputStream ips = new FileInputStream(file); InputStreamReader ipsr = new InputStreamReader(ips); BufferedReader br = new BufferedReader(ipsr); PrintWriter desFile = new PrintWriter(targ
InputStream ips = new FileInputStream(file);
InputStreamReader ipsr = new InputStreamReader(ips);
BufferedReader br = new BufferedReader(ipsr);
PrintWriter desFile = new PrintWriter(targetFilePath);
String data = "";
while ((line = br.readLine()) != null) {
if (line.contains("_Stop_"))
continue;
String[] s = line.split(";");
String newLine = s[2];
for (int i = 3; i < s.length; i++) {
newLine += "," + s[i];
}
data+=newLine+"\n";
}
desFile.write(data);
desFile.close();
br.close();
在while循环中直接使用PrintWriter的println方法,如下所示:
while ((line = br.readLine()) != null) {
if (line.contains("_Stop_"))
continue;
String[] s = line.split(";");
String newLine = s[2];
for (int i = 3; i < s.length; i++) {
newLine += "," + s[i];
}
desFile.println(newLine);
}
desFile.close();
br.close();
第二个过程比第一个过程快得多。现在,我的问题是,这两个过程中发生了什么如此不同,以至于执行时间如此不同 首先,通过使用+=,添加字符串,创建了大量新的字符串对象。我想那肯定会让事情慢下来
尝试使用在循环外部声明的StringBuilder sb追加,然后调用desFile.writesb.toString;看看它是如何执行的。首先,通过使用+=,添加字符串,您正在创建大量新的字符串对象。我想那肯定会让事情慢下来
尝试使用在循环外部声明的StringBuilder sb追加,然后调用desFile.writesb.toString;首先,这两个进程不会产生相同的数据,因为调用println的进程在两行之间具有行分隔符,而将所有数据构建到缓冲区并一次性写入的进程则不会 但是性能差异的原因可能是您正在生成和丢弃的大量String和StringBuilder对象、需要分配的内存(用于在内存中保存完整的文件内容)以及垃圾收集器所花费的时间 如果要进行大量字符串连接,尤其是在循环中,最好在循环之前创建一个StringBuilder,并使用它在循环中累积结果
但是,如果您要处理大文件,最好是边写边输出。应用程序的内存需求将更低,而如果在内存中构建整个结果,所需的内存将等于输出文件的大小。首先,这两个进程产生的数据不同,因为调用println的程序将在两行之间使用行分隔符,而将所有数据构建到缓冲区并一次性写入的程序则不会 但是性能差异的原因可能是您正在生成和丢弃的大量String和StringBuilder对象、需要分配的内存(用于在内存中保存完整的文件内容)以及垃圾收集器所花费的时间 如果要进行大量字符串连接,尤其是在循环中,最好在循环之前创建一个StringBuilder,并使用它在循环中累积结果
但是,如果您要处理大文件,最好是边写边输出。应用程序的内存需求将更低,而如果在内存中构建整个结果,则所需的内存将等于输出文件的大小。附加到字符串后将: 为新字符串分配内存 复制以前复制的所有数据。 从新字符串复制数据。 您对每一行重复此过程,这意味着对于N行输出,您将在^2字节左右进行复制 同时,向您的PrintWriter写信将: 将数据复制到缓冲区。 偶尔刷新缓冲区。
这意味着对于N行输出,您只复制周围的字节 附加到字符串将: 为新字符串分配内存 复制以前复制的所有数据。 从新字符串复制数据。 您对每一行重复此过程,这意味着对于N行输出,您将在^2字节左右进行复制 同时,向您的PrintWriter写信将: 将数据复制到缓冲区。 偶尔刷新缓冲区。
这意味着对于N行输出,您只复制周围的字节 PrintWriterString@thatotherguy谢谢,我刚刚检查了源代码,意识到了同样的事情。编辑。非常感谢StringBuilder的建议!请记住:PrintWriterString@thatotherguy谢谢,我刚刚检查了源代码,意识到了同样的事情。编辑。非常感谢StringBuilder的建议!请记住:一切都好!这正是我想要的答案!谢谢一切安全!这正是我想要的答案!谢谢