2017-09-17 2 views
1

필자는 Java 프로그램을 작성하여 한 줄씩 txt 파일을 읽고 한 줄에 특정 값을 찾아 편집하고 모든 파일을 새 파일에 기록합니다. 예컨대 :자바 힙 공간 프로그램 성능

Input: 
4563,9876,abc545 

Output: 
4563,9876_1,abc545 

내 명령 프롬프트에서 프로그램을 실행하고, 나는 100 만 개 기록을 치료할 수 있어요. 그러나 조금 더 치료하면 아래 오류가 발생합니다.

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(); 
    } 
} 

답변

1
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(); 
    } 
} 
+0

수정 사항을 설명해 주시겠습니까? –

+0

@ 존도 물론,하지만 먼저 ** 라인을 교체하거나 ** 추출하고 ** 라인을 대체하고 싶다면 먼저 확인하십시오. – Ben

+0

각 줄의 값만 편집/바꾸기를 원합니다. –

0

전체 파일을 해당 StringBuilder로 한 번에 읽으므로 메모리가 부족합니다. 대신 while 루프에서 입력 파일의 라인을 읽는 동안 출력 파일에 추가 할 수 있습니까?

0

while 루프 내부 StringBuilder을 만들고 모든 루프에서 파일로 작성하고 while 루프 후 BufferedWriter out에 대한 연결을 닫습니다.

StringBuilder 개체는 루핑하는 동안 파일의 모든 데이터를 저장하기 때문에 발생합니다. Here 비슷한 질문에 대한 답을 얻었습니다. 그것도 봐.

관련 문제