2013-06-24 18 views
5

Mam plik tekstowy z jednej liczby całkowitej na wiersz -Jak odczytać BufferedReader dwa lub więcej razy?

10 
20 
50 

Chcę przeczytać i wydrukować te numery dwukrotnie, a może nawet kilka razy. Próbowałem kodu i nie udało się. Jak zmienić kod, aby wydrukować listę dwukrotnie?

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

Albo zapisać je w postaci listy lub uruchom bufor/ –

+0

Jeśli „Pamięć nie jest problem” można przechowywać całą wejścia jako 'byte []' następnie utworzyć 'ByteArrayInpuStream' ile potrzeba. –

+1

Przechowywanie ich na liście byłoby idealne. –

Odpowiedz

4

Teraz można drukować wielokrotnie.

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

tak ma sens. Ponowne wczytanie pliku wymagałoby dwukrotności IO. –

+0

Proszę nie używać DataInputStream do czytania tekstu, należy również usunąć go z przykładu i ten zły pomysł jest często kopiowany. http://vanillajava.blogspot.co.uk/2012/08/java-memes-which-refuse-to-die.html –

+0

@PeterLawrey - dzięki za dane wejściowe. –

3

Można użyć mark() i reset() lub po prostu otworzyć plik ponownie. W zależności od zastosowania, być może chcesz przechowywać dane w pamięci?

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

+0

Czy możesz pokazać mi, jak używać oznaczania i resetowania tutaj? Ponadto, jak mogę ponownie otworzyć plik? Czy muszę użyć tego kodu, aby ponownie otworzyć plik - FileInputStream fstream2 = new FileInputStream ("c: /files/numbers.txt"); ? –

0

Czytając te same rzeczy wiele razy będzie prowadzić do słabych wyników ... Chyba że masz bardzo mocne podstawy, aby wczyta wielokrotność, przeczytaj na początku metody głównej i przechowywania danych w odpowiedniej struktury danych dla twoje wymagania.

1

Istnieje jeszcze jedna możliwość: dołączanie słuchaczy do 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(); 
     } 
    } 
} 

być używane tak:

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

Więc plik jest raz czytać, a może obsługiwać dużych plików, ponieważ zawartość pliku nie jest przechowywane w pamięci.

+0

Dzięki. Ale wydaje mi się to tak skomplikowane. Czy jest jakaś korzyść z zastosowania tej metody w strukturze danych? –

+0

@Użyj swojej głowy Może obsługiwać duże pliki. Podczas gdy struktura danych znajduje się w pamięci sterty, a jeśli masz duże pliki, możesz natknąć się na "OutOfMemoryError". Jeśli twoja aplikacja była wielowątkowa, problem ten może pojawić się jeszcze wcześniej. Jeśli korzystasz ze struktury danych, nałożyłeś limit rozmiaru pliku. – Beryllium

+0

Co do jego złożoności: Jest to ten sam wzorzec, jeśli dołączymy 'ActionListener' do' JButton' - to wywołanie zwrotne. Prawdopodobnie możesz użyć/znaleźć ten wzór w wielu miejscach. – 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 
Powiązane problemy