Java堆空间程序性能

Java堆空间程序性能,java,Java,我编写了一个Java程序,逐行读取txt文件,在一行中找到某个值,编辑它,然后将所有行写入一个新文件。 e、 g: 我在命令提示符下运行程序,可以处理一百万条记录。但如果我再多处理一点,我会得到以下错误: Exception in thread "main" java.lang.OutOfMemoryError: Java heap space 我试图解决它,但没有成功。 下面是我的Java类,我可以得到一些关于如何改进代码以处理更多记录的建议吗 import java.io.Buffered

我编写了一个Java程序,逐行读取txt文件,在一行中找到某个值,编辑它,然后将所有行写入一个新文件。 e、 g:

我在命令提示符下运行程序,可以处理一百万条记录。但如果我再多处理一点,我会得到以下错误:

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
我试图解决它,但没有成功。 下面是我的Java类,我可以得到一些关于如何改进代码以处理更多记录的建议吗

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;

 class RecordTreatment {
    public static void main(String args[]) throws IOException
    {
                // Open the file
                File file = new File("C:\\Users\\tolen\\Desktop\\test.txt"); 
                FileInputStream fstream = new FileInputStream(file);
                BufferedReader br = new BufferedReader(new InputStreamReader(fstream));
                StringBuilder fileContent = new StringBuilder();
                String strLine;
                int counter=1;
                //Read File Line By Line
                while ((strLine = br.readLine()) != null)   {
                    String tokens[] = strLine.split(",");
                    if (tokens.length > 0) {
                            String tokens1[] = tokens[16].split("\"");
                            tokens[16] ="\""+tokens1[1] + "_"+counter+++"\"";
                            for (int i = 0; i < tokens.length; i++) {
                                if ( tokens[i].equals(tokens[tokens.length-1])) {
                                    fileContent.append(tokens[i]);
                                }else{
                                    fileContent.append(tokens[i]+",");
                                  }
                                }
                            fileContent.append("\n");
                    }
                }
                FileWriter fstreamWrite = new FileWriter("C:\\Users\\tolen\\Desktop\\test1.txt");
                BufferedWriter out = new BufferedWriter(fstreamWrite);
                out.write(fileContent.toString());
                out.close();
                //Close the input stream
                br.close();
    }
}
导入java.io.BufferedReader;
导入java.io.BufferedWriter;
导入java.io.File;
导入java.io.FileInputStream;
导入java.io.FileWriter;
导入java.io.IOException;
导入java.io.InputStreamReader;
导入java.util.array;
等级记录处理{
公共静态void main(字符串args[])引发IOException
{
//打开文件
File File=新文件(“C:\\Users\\tolen\\Desktop\\test.txt”);
FileInputStream fstream=新的FileInputStream(文件);
BufferedReader br=新的BufferedReader(新的InputStreamReader(fstream));
StringBuilder fileContent=新的StringBuilder();
弦斯特林;
int计数器=1;
//逐行读取文件
而((strLine=br.readLine())!=null){
字符串标记[]=strLine.split(“,”);
如果(tokens.length>0){
字符串标记1[]=标记[16]。拆分(“\”);
令牌[16]=“\”+令牌1[1]+“\”+计数器+++“\”;
for(int i=0;i
您的内存不足,因为您正在将整个文件一次读入该StringBuilder。相反,您是否可以尝试在读取while循环中输入文件的行时将其追加到输出文件?

while
循环中创建
StringBuilder
内部
并将其写入每个循环中的文件,然后重试在
while
循环之后,关闭与
缓冲写入输出的连接


之所以会发生这种情况,是因为您拥有的
StringBuilder
对象在循环过程中存储了文件中的所有数据。您也有一个类似问题的答案。请看一看。

您能解释一下您的修改吗?@JohnDoe当然,但如果您想替换一行,请先清除,或者提取然后替换一行。@JohnDoe my fa检查新代码。只需读取一行代码,处理它,编写它,并释放空间。不要存储多行代码。
class RecordTreatment {
    public static void main(String args[]) throws IOException
    {
        // Open the file
        File file = new File("C:\\Users\\tolen\\Desktop\\test.txt"); 
        FileInputStream fstream = new FileInputStream(file);
        BufferedReader br = new BufferedReader(new InputStreamReader(fstream));
        FileWriter fstreamWrite = new FileWriter("C:\\Users\\tolen\\Desktop\\test1.txt");
        BufferedWriter out = new BufferedWriter(fstreamWrite);

        String strLine;
        int counter=1;
        //Read File Line By Line
        while ((strLine = br.readLine()) != null)   {
            String tokens[] = strLine.split(",");
            if (tokens.length > 0) {
                String sub_tokens[] = tokens[16].split("\"");
                tokens[16] = String.format("\"{}_{}",sub_tokens[1],counter);
                out.write(String.join(",",tokens));
                out.write("\n");
            }
        }

        out.close();
        br.close();
    }
}
class RecordTreatment {
    public static void main(String args[]) throws IOException
    {
        // Open the file
        File file = new File("C:\\Users\\tolen\\Desktop\\test.txt"); 
        FileInputStream fstream = new FileInputStream(file);
        BufferedReader br = new BufferedReader(new InputStreamReader(fstream));
        FileWriter fstreamWrite = new FileWriter("C:\\Users\\tolen\\Desktop\\test1.txt");
        BufferedWriter out = new BufferedWriter(fstreamWrite);

        String strLine;
        int counter=1;
        //Read File Line By Line
        while ((strLine = br.readLine()) != null)   {
            String tokens[] = strLine.split(",");
            if (tokens.length > 0) {
                String sub_tokens[] = tokens[16].split("\"");
                tokens[16] = String.format("\"{}_{}",sub_tokens[1],counter);
                out.write(String.join(",",tokens));
                out.write("\n");
            }
        }

        out.close();
        br.close();
    }
}