2014-02-10 56 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

我只是好奇:)) –