2014-02-10 94 views
5

我想使用單個BufferedReader對象從兩個或多個文件中讀取文本。使用BufferedReader讀取多個文件

這就是我在代碼中做到的。

Charset charset = Charset.forName("UTF-8"); 
Path p1 = Paths.get("sum1.csv"); 

List<String> list = new ArrayList<String>(); 
BufferedReader reader = Files.newBufferedReader(p1, charset); 
try { 
    String line; 
    while((line = reader.readLine()) != null && !line.isEmpty()){ 
     list.add(line); 
    } 
} catch (IOException e) { 
    System.err.format("IOException: %s%n", e); 
    reader.close(); 
} 

Path p2 = Paths.get("sum2.csv"); 
reader = Files.newBufferedReader(p2, charset); 
try { 
    String line; 
    while((line = reader.readLine()) != null && !line.isEmpty()){ 
     list.add(line); 
    } 
} catch (IOException e) { 
    System.err.format("IOException: %s%n", e); 
    reader.close(); 
} 

代碼編譯並正確運行。

處理這個問題的標準方法是什麼?是否可以使用單個BufferedReader讀取兩個或更多文件?

回答

4
Charset charset = Charset.forName("UTF-8"); 
List<String> list = new ArrayList<String>(); 
try(
    FileInputStream is1=new FileInputStream("sum1.csv"); 
    FileInputStream is2=new FileInputStream("sum2.csv"); 
    SequenceInputStream is=new SequenceInputStream(is1, is2); 
    BufferedReader reader=new BufferedReader(new InputStreamReader(is, charset));) 
{ 
    try { 
     String line; 
     while((line = reader.readLine()) != null && !line.isEmpty()){ 
      list.add(line); 
     } 
    } catch (IOException e) { 
     System.err.format("IOException: %s%n", e); 
    } 
} 

順便說一句,您的意思是否

String line; 
while((line = reader.readLine()) != null) 
    if(!line.isEmpty()) list.add(line); 

你的內循環?你的代碼停在第一個空行,我建議的替代方案跳過空行。但我只能猜測你的真實意圖。

+0

我有點類似的情況。這只是我sum1 sumN,N是一個非常巨大的數字。我怎樣才能一次讀完所有的文件?我可以做一些像sum *的東西嗎? –

+0

@ tanmay2507:'SequenceInputStream'具有[構造函數,它接受一個'Enumeration'](https://docs.oracle.com/javase/8/docs/api/java/io/SequenceInputStream.html#SequenceInputStream-java.util .Enumeration-)。如果您努力爲此制定解決方案,請打開一個新問題。 – Holger

1

在上面的代碼中,你做了創建一個新的BufferedReader從第二個文件讀取。你所做的完全沒錯,儘管將重複的代碼放入一個將文件名和字符串列表作爲參數的方法是有意義的。

你有一個小故障 - 如果有一個在任一文件中間的空行,當它到達它的程序停止閱讀。我不確定這是否真的是你想要的。

+0

似乎沒有辦法避免創建一個新的BufferedReader從第二個文件讀取。你怎麼看? –

+0

我當然不知道有什麼辦法可以避免它。但我也不知道爲什麼你想避免它。有一個新的BufferedReader工作得很好。 –

+0

我只是好奇:)) –