2013-06-24 148 views
5

我有每行一个整数的文本文件 -如何两次或多次读取BufferedReader?

10 
20 
50 

我想读,甚至多次打印这些数字的两倍或可能。我尝试了一些代码,但失败了。如何更改我的代码以两次打印列表?

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'重启缓存/ – 2013-06-24 06:38:03

+0

。 –

+1

将它们存储在列表中将是理想的。 –

回答

4

现在你可以打印多次。

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。 –

+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”); ? –

0

阅读同样的东西多次将导致性能不佳...... 除非你有一个非常强有力的理由来进行多次读取,在主方法开始读取和数据存储在一个合适的数据结构你的要求。

1

还有另一种可能性:将听众附加到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(); 
     } 
    } 
} 

使用这样的:

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

所以读取文件一次,并且它可以处理大文件,因为文件的内容不会保存在内存中。

+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