2013-06-24 34 views
5

Tôi có một tập tin văn bản với một số nguyên cho mỗi hàng -Làm thế nào để đọc một BufferedReader hai lần hoặc nhiều lần?

10 
20 
50 

Tôi muốn đọc và in những con số này gấp đôi hoặc thậm chí nhiều lần. Tôi đã thử một số mã và nó không thành công. Làm cách nào để thay đổi mã của tôi để in danh sách hai lần?

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

Hoặc lưu trữ chúng trong một danh sách hoặc khởi động lại đệm/ –

+0

Nếu 'bộ nhớ không phải là một vấn đề' bạn có thể lưu trữ toàn bộ đầu vào như một 'byte [] 'sau đó tạo ra một' ByteArrayInpuStream' khi cần thiết. –

+1

Lưu trữ chúng trên danh sách sẽ là lý tưởng. –

Trả lời

4

Bây giờ bạn có thể in nhiều lần.

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

có ý nghĩa. Đọc lại tập tin sẽ yêu cầu hai lần IO. –

+0

Vui lòng không sử dụng DataInputStream để đọc văn bản, cũng vui lòng xóa nó khỏi ví dụ của bạn và ý tưởng tồi này được sao chép thường xuyên. http://vanillajava.blogspot.co.uk/2012/08/java-memes-which-refuse-to-die.html –

+0

@PeterLawrey - cảm ơn cho đầu vào. –

3

Bạn có thể sử dụng mark()reset() hoặc chỉ cần mở tập tin một lần nữa. Tùy thuộc vào việc sử dụng của bạn, có lẽ bạn muốn lưu trữ dữ liệu trong bộ nhớ?

Tham chiếu - http://docs.oracle.com/javase/6/docs/api/java/io/BufferedReader.html#reset%28%29

+0

Bạn có thể chỉ cho tôi cách sử dụng nhãn hiệu và đặt lại tại đây không? Ngoài ra, làm cách nào để mở lại tệp? Tôi có phải sử dụng mã này để mở lại tệp không - FileInputStream fstream2 = new FileInputStream ("c: /files/numbers.txt"); ? –

0

Reading cùng thứ nhiều lần sẽ dẫn đến hiệu suất kém ... Trừ khi bạn có một lý do rất mạnh để làm cho nhiều đọc, đọc ở phần đầu của phương pháp chính và lưu trữ dữ liệu trong một cấu trúc dữ liệu thích hợp cho yêu cầu của bạn.

1

Có một khả năng khác: Đính kèm người nghe vào MultiReader.

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

sẽ được sử dụng như thế này:

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

Vì vậy, các tập tin được đọc một lần, và nó có thể xử lý các file lớn, bởi vì nội dung của tập tin không được tổ chức trong bộ nhớ.

+0

Cảm ơn. Nhưng nó trông rất phức tạp với tôi. Có lợi thế nào khi sử dụng phương thức này trên cấu trúc dữ liệu không? –

+0

@Sử dụng đầu của bạn Nó có thể xử lý các tệp lớn. Trong khi cấu trúc dữ liệu nằm trong bộ nhớ heap, và nếu bạn có các tệp lớn, bạn có thể chạy vào một 'OutOfMemoryError'. Nếu ứng dụng của bạn đa luồng, vấn đề này có thể xuất hiện sớm hơn. Nếu bạn sử dụng cấu trúc dữ liệu, bạn đã áp đặt giới hạn về kích thước tệp. – Beryllium

+0

Đối với sự phức tạp của nó: Đó là cùng một mẫu, nếu bạn đính kèm một 'ActionListener' vào một' JButton' - đó là một cuộc gọi lại. Có khả năng bạn có thể sử dụng/tìm mẫu này ở nhiều nơi. – 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 
Các vấn đề liên quan