Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Reading multiple files using BufferedReader

I want to read texts from two or more files using a single BufferedReader object.

This is how I did it in my code.

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

The code compiled and run correctly.

What is the standard way to deal with this problem? Is it possible to read two or more files using a single BufferedReader?

like image 505
Jane Foster Avatar asked Feb 10 '14 17:02

Jane Foster


2 Answers

SequenceInputStream

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

By the way, did you mean

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

for your inner loop? Your code stops at the first empty line, my suggested alternative skips empty lines. But I can only guess your real intention.

enter image description here

like image 124
Holger Avatar answered Oct 11 '22 11:10

Holger


In the code above, you did create a new BufferedReader to read from the second file. What you've done is perfectly fine, although it would make sense to put the repeated code into a method that takes the filename and the list of strings as arguments.

You've got one little glitch - if there's an empty line in the middle of either of your files, your program stops reading when it gets to it. I'm not sure if that's actually what you want.

like image 45
Dawood ibn Kareem Avatar answered Oct 11 '22 12:10

Dawood ibn Kareem