2017-09-17 9 views
1

Javaプログラムを作成して、行単位でtxtファイルを読み込み、行内の特定の値を見つけて編集し、すべての行を新しいファイルに書き込んでいます。 例えば:Javaヒープ・スペース・プログラムのパフォーマンス

Input: 
4563,9876,abc545 

Output: 
4563,9876_1,abc545 

私は、コマンドプロンプトからプログラムを実行している、と私は1万件のレコードを処理することができています。しかし、少しばかり扱うと、以下のエラーが表示されます。

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

@JohnDoe確かに、最初に**ラインを置き換えるか**抽出するか、**ラインを置き換えるかを明確にしてください。 – Ben

+0

私は各行の値を編集/置き換えたいだけです。 –

0

ファイル全体を一度に読み込んでいるため、メモリが不足しています。代わりに、whileループで入力ファイルの行を読み込んでいるときに、出力ファイルに追加することができますか?

0

whileループ内StringBuilderを作成し、すべてのループ内のファイルに書き込むとwhileループの後BufferedWriter outへの接続を閉じます。

この場合、StringBuilderオブジェクトには、ループ中にファイル内のすべてのデータが格納されているために発生しています。 Hereあなたも同様の質問に対する回答があります。それも見てください。

関連する問題