2013-06-24 145 views
5

私は、行ごとに1つの整数のテキストファイルがある - 私は二回または多分これらの数字を読み、印刷したいBufferedReaderを2回または複数回読み取るにはどうすればよいですか?

10 
20 
50 

も、複数回。私はいくつかのコードを試して、それは失敗しました。リストを2回印刷するようにコードを変更するにはどうすればよいですか?

import java.io.BufferedReader; 
import java.io.DataInputStream; 
import java.io.FileInputStream; 
import java.io.InputStreamReader; 

public class DoubleBuffer { 

    public static void main(String[] args) { 

     try { 

      FileInputStream fstream = new FileInputStream("c:/files/numbers.txt"); 

      BufferedReader br = new BufferedReader(new InputStreamReader(fstream)); 
      String strLine; 

       // Read rows 
       while ((strLine = br.readLine()) != null) { 
        System.out.println(strLine); 
       } 

       // Read rows again 
       while ((strLine = br.readLine()) != null) { 
        System.out.println(strLine); 
       } 

      in.close(); 
     } catch (Exception e) { 
      System.err.println("Error: " + e.getMessage()); 
     }//try-catch 

    }// main 

}// class 
+0

リストに保存したり、必要に応じて ''そしてByteArrayInpuStream'を作成[] 'バイトとして入力全体を保存するかもしれない「メモリが問題ではない」の場合、バッファ/ –

+0

を再起動してどちらか。 –

+1

これをリストに格納するのが理想的です。 –

答えて

4

今、あなたは複数回を印刷することができます。

同じもの複数回使用すると、複数の読み取りにする非常に強力な理由がない限り、mainメソッドの最初に読み、適したデータ構造にデータを格納し、パフォーマンスの低下... につながる読書
BufferedReader br = new BufferedReader(new FileReader("D:/log_2071-04-31.txt")); 
String strLine; 
ArrayList<String> ans= new ArrayList<String>(); 

// Read rows 
while ((strLine = br.readLine()) != null) { 
    System.out.println(strLine); 
    ans.add(strLine); 
} 

// Read again 
for (String result: ans) { 
    System.out.println(result); 
} 
+0

はい意味があります。ファイルを読み直すには、IOの2倍が必要です。 –

+0

DataInputStreamをテキストの読み込みに使用しないでください。また、あなたの例から削除してください。この悪い考えは頻繁にコピーされます。 http://vanillajava.blogspot.co.uk/2012/08/java-memes-which-refuse-to-die.html –

+0

@PeterLawrey - 入力いただきありがとうございます。 –

3

あなたはmark()reset()を使用するか、単にファイルを再度開くことができます。あなたの用途に応じて、おそらくデータをメモリに保存したいのですか?

リファレンス - http://docs.oracle.com/javase/6/docs/api/java/io/BufferedReader.html#reset%28%29

+0

マークの使用方法とリセット方法を教えてもらえますか?また、ファイルを再び開くにはどうしたらいいですか?このコードを使用してファイルを再オープンする必要がありますか?FileInputStream fstream2 = new FileInputStream( "c:/files/numbers.txt"); ? –

1

別の可能性があります。MultiReaderにリスナーを接続します。

public class MultiBufferedReader { 
    public static void main(String[] args) throws IOException { 
     MultiReader mr = new MultiReader(); 

     mr.addListener(new Listener() { 
      @Override 
      public void read(String line) { 
       System.out.println("1: Got " + line); 
      } 
     }); 

     mr.addListener(new Listener() { 
      @Override 
      public void read(String line) { 
       System.out.println("2: Got " + line); 
      } 
     }); 

     mr.read(new File("/etc/hosts")); 
    } 

だから、ファイルが一度読み取られ、ファイルの内容をメモリに保持されていないので、それは、大きなファイルを扱うことができます。

interface Listener { 
    void read(String line); 
} 

class MultiReader { 
    final List<Listener> listeners = new ArrayList<Listener>(); 

    public void addListener(Listener l) { 
     this.listeners.add(l); 
    } 

    public void read(File file) throws IOException { 
     final BufferedReader br = new BufferedReader(new FileReader(file)); 
     try { 
     String line; 
      while ((line = br.readLine()) != null) { 
       for (Listener l : this.listeners) { 
        l.read(line); 
       } 
      } 
     } finally { 
      br.close(); 
     } 
    } 
} 

は、次のように使用します。

+0

ありがとうございます。しかし、それは私にはとても複雑に見えます。この方法をデータ構造に使用する利点はありますか? –

+0

@あなたの頭を使うそれは大きなファイルを扱うことができます。データ構造はヒープメモリ内にありますが、大きなファイルがある場合は、OutOfMemoryErrorを実行することができます。アプリケーションがマルチスレッド化されている場合、この問題はより早く発生する可能性があります。データ構造を使用する場合は、ファイルサイズに制限があります。 – Beryllium

+0

その複雑さについては: 'ActionListener'を' JButton'に付けるのと同じパターンです。これはコールバックです。多くの場所でこのパターンを使用/見つけることができるでしょう。 – Beryllium

1
import java.io.BufferedReader; 
import java.io.DataInputStream; 
import java.io.FileInputStream; 
import java.io.InputStreamReader; 

public class DoubleBuffer { 

public static void main(String[] args) { 

    try { 

     FileInputStream fstream = new FileInputStream("c:/files/numbers.txt"); 

     BufferedReader br = new BufferedReader(new InputStreamReader(fstream)); 
     String strLine; 

      // Read rows 
      while ((strLine = br.readLine()) != null) { 
       System.out.println(strLine); 
      } 
      // return stream to top of file 
      fstream.getChannel().position(0); 
      br=new BufferedReader(new InputStreamReader(fstream)); 


      // Read rows again 
      while ((strLine = br.readLine()) != null) { 
       System.out.println(strLine); 
      } 

     in.close(); 
    } catch (Exception e) { 
     System.err.println("Error: " + e.getMessage()); 
    }//try-catch 

}// main 

}// class 
関連する問題