为什么这个程序会输出"java.io.BufferedReader@Number"?



这是一个让我感到困惑的快速问题。我有一个Java程序,代码如下:

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

读取文件(在本例中为.csv),并将其输出到命令行。

我使用命令行运行程序,加上三个参数,使用so(它实际上只使用第一个参数):

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

然后,它返回这个:

java.io.BufferedReader@17dfafd1

重复,就像循环一样。我试着放入一个Try/Catch错误,但它仍然做同样的-没有错误。我已经打开了。csv文件,并验证了其内容。

CSV文件与.jar文件位于同一目录。

我错过了什么?

因为您正在尝试打印BufferedReader的实例而不是从中读取的数据

改变
while(br1.readLine() != null) {
    masterRBT.add(br1.toString());
    System.out.println(br1.toString());
}

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

您正在打印br1.toString() -您在BufferedReader本身上调用toString() BufferedReader不覆盖toString(),所以你从Object得到实现,如文档所示:

ObjecttoString方法返回一个字符串,该字符串由该对象作为其实例的类名、@字符@和该对象哈希码的无符号十六进制表示组成。换句话说,该方法返回一个等于

值的字符串。
getClass().getName() + '@' + Integer.toHexString(hashCode())
那不是你想要的。假设你真的想打印出你刚刚读过的那一行——但是你现在已经把它扔掉了。你想要的:
String line;
while((line = br1.readLine()) != null) {
    masterRBT.add(line);
    System.out.println(line);
}

或者作为for循环:

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

一般来说,如果你开始在输出中看到ClassName@Number,那几乎是肯定是在一个对象上调用toString()而不覆盖它的类似问题。

您不是在打印行,而是阅读器本身,要打印行,请像这样更改代码:

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

用这个,

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

因为BufferedReader.toString()只返回对象的类名和哈希值。

使用BufferedReader.readLine()来获取字符串

相关内容

最新更新