Why would this program output "java.io.BufferedReader@Number"?

This is a quick one that stumps me. I've got a Java Program with the following code:

public static void main(String[] args) throws IOException {
        // TODO Auto-generated method stub

        String file1 = args[0];
        String file2 = args[1];
        String output = args[2];

        Writer writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(output), "utf-8"));

        // Get the file
        BufferedReader br1 = new BufferedReader(new FileReader(file1));

        ArrayList<String> masterRBT = new ArrayList<String>();

        // Read the files
        while(br1.readLine() != null) {
            masterRBT.add(br1.toString());
            System.out.println(br1.toString());
        }

Read the file (in this case, a .csv), and output it to the command line.

I use the command line to run the program, plus three parameters, using so (it only really uses the first one):

java -jar csvdiff.jar mainfile.csv subfile.csv output.csv

But then, it returns this:

java.io.BufferedReader@17dfafd1

Repeatedly, as if on loop. I tried putting in a Try/Catch error, but it still does the same - no errors. I've opened the .csv files, and verified its contents.

The CSV files are located in the same directory as the .jar file.

What am I missing?

Jon Skeet
people
quotationmark

You're printing out br1.toString() - you're calling toString() on the BufferedReader itself. BufferedReader doesn't override toString(), so you're getting the implementation from Object, as documented:

The toString method for class Object returns a string consisting of the name of the class of which the object is an instance, the at-sign character @, and the unsigned hexadecimal representation of the hash code of the object. In other words, this method returns a string equal to the value of:

getClass().getName() + '@' + Integer.toHexString(hashCode())

That's not what you want. Presumably you actually want to print out the line that you've just read - but you've thrown that away by now. You want:

String line;
while((line = br1.readLine()) != null) {
    masterRBT.add(line);
    System.out.println(line);
}

Or as a for loop:

for (String line = br1.readLine(); line != null; line = br1.readLine()) {
    masterRBT.add(line);
    System.out.println(line);
}

As a general matter, if you start seeing ClassName@Number in output, that's almost certainly a similar problem of calling toString() on an object which doesn't override it.

people

See more on this question at Stackoverflow