Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么直接使用print()方法存储数据要比将数据存储在字符串中然后写入文件快? 让我们考虑一下这个场景:我正在读取一个文件,然后对每一行进行微调,然后将数据存储在一个新文件中。现在,我尝试了两种方法:_Java_File_File Writing - Fatal编程技术网

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的建议!请记住:一切都好!这正是我想要的答案!谢谢一切安全!这正是我想要的答案!谢谢