2011-10-29 17 views
2

私はJavaの初心者です。配列と2つのファイルの和集合

私は2つのファイルを読み込み、それらの和集合を取得しようとしています。私はサイズ100の配列を使用するべきです(配列は1つだけです)。

まず、file1からすべてのレコードを読み、出力に書きます。file3。そのために、私は一度に100レコードを読んで、繰り返しを使ってfile3に書き込みます。

その後、file1のように、今回は2番目のファイルを一度に100レコードずつ読み込み、配列memory[]に書き込みます。その後、私がfile2から読み取ったレコードがfile1にない場合は、共通のレコードを検索して、出力ファイルに書き込みます。私はreader2.readLine()nullになるまでこれを行い、各繰り返しでfile1を再オープンします。

これまで行ってきたことですが、ほとんど完了しましたが、NullPointerExceptionとなります。どんな助けもありがとう。

編集:これで例外はありませんが、別のレコードは見つからず、書き込めません。私は最後のループとブーリアンが動作しないと思います、なぜですか?助けてください...

import java.io.*; 

public class FileUnion 
{ 
private static long startTime, endTime; 

public static void main(String[] args) throws IOException 
{ 
    System.out.println("PROCESSING..."); 
    reset(); 
    startTimer(); 

    String[] memory = new String[100]; 
    int memorySize = memory.length; 

    File file1 = new File("stdlist1.txt"); 
    BufferedReader reader1 = new BufferedReader(new FileReader(file1)); 

    File file3 = new File("union.txt"); 
    BufferedWriter writer = new BufferedWriter(new FileWriter(file3)); 

    int numberOfLinesFile1 = 0; 
    String line1 = null; 
    String line11 = null; 


    while((line1 = reader1.readLine()) != null) 
    { 
     for (int i = 0; i < memorySize;) 
     { 
      memory[i] = line1; 
      i++; 

      if(i < memorySize) 
      { 
       line1 = reader1.readLine(); 
      } 
     } 

     for (int i = 0; i < memorySize; i++) 
     { 
      writer.write(memory[i]); 
      writer.newLine(); 
      numberOfLinesFile1++; 
     } 
    } 

    reader1.close(); 

    File file2 = new File("stdlist2.txt"); 
    BufferedReader reader2 = new BufferedReader(new FileReader(file2)); 

    String line2 = null; 
    while((line2 = reader2.readLine()) != null) 
    { 
     for (int i = 0; i < memorySize;) 
     { 
      memory[i] = line2; 
      i++; 

      if(i < memorySize) 
      { 
       line2 = reader2.readLine(); 
      } 
     } 

     for (int k = 0; k < memorySize; k++) 
     { 
      boolean found = false; 
      File f1 = new File("stdlist1.txt"); 
      BufferedReader buff1 = new BufferedReader(new FileReader(f1)); 

      for (int m = 0; m < numberOfLinesFile1; m++) 
      { 
       line11 = buff1.readLine(); 

       if (line11.equals(memory[k]) && found == false); 
       { 
        found = true; 
       } 

      } 
      buff1.close(); 

      if (found == false) 
      { 
       writer.write(memory[k]); 
       writer.newLine(); 
      } 


     }  
    } 

    reader2.close(); 
    writer.close(); 

    endTimer(); 
    long time = duration(); 
    System.out.println("PROCESS COMPLETED SUCCESSFULLY"); 
    System.out.println("Duration: " + time + " ms"); 

} 

public static void startTimer() 
{ 
    startTime = System.currentTimeMillis(); 
} 
public static void endTimer() 
{ 
    endTime = System.currentTimeMillis(); 
} 
public static long duration() 
{ 
    return endTime - startTime; 
} 
public static void reset() 
{ 
    startTime = 0; 
    endTime = 0; 
} 
} 

答えて

2

あなたはまだファイルの最後に達していないことを確認する必要があります。 lineX = readerX.readLine()があるすべてのループで、すぐにlineX == nullをチェックして、それがループしているかどうかを確認します。

コードがコメントにうまく表示されないため、自分の答えを編集します。

while(!line11.equals(memory[k])) 
    { 
     line11 = buff1.readLine(); 
    } 

これは(時には)nullです。ここではnullです。 memory[k]がファイル1にない場合、どうなりますか?

+0

メモリ[k]がfile1をしていない場合、彼らは同じ同じ、あるいはないことまで、それだけ読んで続けます。 if loopはfile1のすべてのレコードを調べ、見つからない場合は出力します。右?私のアプローチは大丈夫ですか?それとも単なるコードの問題ですか?助けてください。 – beetle

+0

f1にない場合、whileループの条件は決して偽ではないので、...まで読み取ることができます。 –

2

memory [k]がnullです。なぜこのヌルですか?

while((line2 = reader2.readLine()) != null) 
     { 
      for (int i = 0; i < 100; i++) 
      { 
       memory[i] = line1; 
       i++; 

       if(i < 100) 
       { 
        line2 = reader2.readLine(); 
       } 
      } 

あなたはLINE1がnullのときに終了ループの中で前にそれを使用しているためmemory[i] = line1;

LINE1が、しかし、常にnullであると言う:このコードであるため。

私はあなたが上記のコードで**memory[i] = line2;**を書くためのものと考えている:)

+0

はい。あなたが正しい。私はそれを意図した。私はそれを変更しましたが、同じ行にnullpointerexceptionを与えます。 :( – beetle

関連する問題