2011-10-29 49 views
3

私はJavaで初心者です。ファイルから読み込み、Javaのファイルに書き込む

これは私のアプローチです:

私は2つのファイルを読み、それらの組合を取得しようとしています。私はfile1からすべてのレコードを読み、

まず(。、ちょうど1 array許可arrayListまたは他の構造が許可されていないか、行ずつ読み書き)サイズ100と配列を使用していますし、それらを書き込む必要があります出力、3番目のファイル。そのためには、一度に100レコードを読み込み、繰り返しを使用して3つ目のファイルに書き込みます。

その後、最初のファイルと同様に、今回は2回目のファイルを一度に100レコードずつ読み込み、memory[]に書き込みます。それから、私がFile2から読み込んだレコードがFile1にない場合は、出力ファイルに書きます。私はreader2.readLine()nullになるまでこれを行い、各繰り返しでfile1を再オープンします。

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

編集:これで例外はありませんが、別のレコードを見つけることができず、書き込めません。私は最後のループとブーリアンが動作しないと思います、なぜですか?私は本当に助けが必要です。お待ち頂きまして、ありがとうございます。

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

'stdlist1.txt'の長さが100行未満の場合はどうなりますか?正確に100行の倍数でない場合はどうなりますか? 'memory'に' String [] 'の代わりに' ArrayList 'を使用できますか?固定サイズの配列を使用するよりもかなり簡単になります。 – msandiford

+0

+1あなたの努力を分かち合うために! – SpeedBirdNine

+0

これは私の宿題プロジェクトです。100行未満の入力ファイルを保証しません。また、100行の倍数でなければ、memory []はいくつかのヌル値で埋められます。しかし、私はそれが問題ではないと思う。 – beetle

答えて

0

EDIT!やり直す

一度に100行を使用するには、nullをチェックする必要があります。それ以外の場合は、ファイルにnullを書き込もうとするとエラーが発生する可能性があります。

ファイルが一番最後にあるかどうかを確認してから、nullをチェックせずに99個以上の情報ピースを収集しています。

何この行が呼び出されたとき場合:

while((line2 = reader2.readLine()) != null) 

ファイルに残された唯一の1行がありますか?次に、メモリ配列に99個のnullのインスタンスが含まれ、ファイルにnullを99回書き込もうとします。それは悪いケースです。

宿題の手助けを探している人にどのくらいの助けが必要なのか分かりませんが、ほとんどのサイトではそれが許されていないことに慣れています。

ここでは、最初のファイルを書き込む方法の1つです。

String line1 = reader1.readLine(); 

boolean end_of_file1 = false; 
while(!end_of_file) 
{ 
    for (int i = 0; i < memorySize) 
    { 
     memory[i] = line1; 
     i++; 

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

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

reader1.close(); 

あなたは、簡単にコピーするためにチェックを行い、それ用のファイルをチェックするのpublic static boolean型を作るために、ことをしたら、あなたはそれを呼び出すことができ、それがコードクリーナーを行います。

public static boolean isUsed(String f1, String item, int dist) 
{ 
    BufferedReader buff1 = new BufferedReader(new FileReader(f1)); 

    for(int i = 0;i<dist;i++) 
    { 
     String line = buff1.readLine() 
     if(line == null){ 
      return false; 
     } 
     if(line.equals(item)) 
     { 
      return true; 
     } 
    } 
    return false; 
} 

だけかどうかを確認するために、各ラインチェックを書き込む前に、ファイル1を書き込むと同様の方法を使用します!isUsed()

boolean end_of_file2 = false; 
memory = new String[memorySize];// Reset the memory, erase old data from file1 
int numberOfLinesFile2=0; 
String line2 = reader2.readLine(); 
while(!end_of_file2) 
{ 
    for (int i = 0; i < memorySize;) 
    { 
     memory[i] = line2; 
     i++; 

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

    for (int i = 0; i < memorySize; i++) 
    { 
     if(!memory[i] == null) 
     { 
      //Check is current item was used in file 1. 
      if(!isUsed(file1, memory[i], numberOfLinesFile1)){//If not used already 
       writer.write(memory[i]); 
       writer.newLine(); 
       numberOfLinesFile2++; 
      } 
     } 
    } 
} 
reader2.close(); 
writer.close(); 

・ホープ、このことができます。コードを貼り付けるだけで、コピーと貼り付けを理解しないでコードを使用する可能性が高くなることがわかったので、完全なコードは提供していません。私はそれが役に立つと思う。

+0

非常にありがとう!配列を使用するのは時間がかかることは分かっていますが、それはプロジェクトの一種なので使用しなければなりません。サイズ100の配列だけが許されます。最初に100文字を書いてから、配列から出力するように書きます。だから、私はラインごとの読み書きとarrayListを使うことができません。なぜなら、それは固定サイズでなければならないからです。なぜそれが違うレコードを与えないのか理解する必要があるだけです。私はすべてを試しましたが、私はループとブールの問題を解決することはできません。 – beetle

+0

私は日食を使います。それはコンパイルしますが、例外はありません。しかし、最初のファイル全体を書き込むだけで、結合が見つからないことを意味します。 (File2ではレコードwhiceは見つかりませんが、File1では見つかりません)。あなたの答えをありがとう。 – beetle

+0

まあ。既存の方法を使用しますが、すでに使用されているかどうかを確認するために、すべての項目をリストに追加するだけです。そうすることで、2番目のファイルのすべての行について1番目のファイルを再スキャンしているわけではありません。 100行について。それが問題の原因となっています。読者がnullになるまで読んでいますが、statmentが呼び出されたときにファイルに残っているのはわずか15行だとしましょう。 100個のアイテムをスキャンしているヌルをチェックせずにループを使用すると、最後の85個はヌルになります。そして、それはNullPointerExceptionがあった場所です。行番号が100の倍数である場合にのみ動作します –

関連する問題