Jane Foster
Jane Foster

Reputation: 471

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?

Upvotes: 7

Views: 10583

Answers (2)

Holger
Holger

Reputation: 298153

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.

Upvotes: 6

Dawood ibn Kareem
Dawood ibn Kareem

Reputation: 79838

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.

Upvotes: 1

Related Questions