这是一个让我感到困惑的快速问题。我有一个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
得到实现,如文档所示:
那不是你想要的。假设你真的想打印出你刚刚读过的那一行——但是你现在已经把它扔掉了。你想要的:类
值的字符串。Object
的toString
方法返回一个字符串,该字符串由该对象作为其实例的类名、@字符@
和该对象哈希码的无符号十六进制表示组成。换句话说,该方法返回一个等于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()来获取字符串