我有一个非常简单的解析器分割字符串:
import java.io.*;
import java.util.ArrayList;
import java.util.List;
public class Parser {
public static void main(String args[]){
String newLog = new String();
try {
BufferedReader reader = new BufferedReader(new FileReader("/Users/John/IdeaProjects/tomcatParser/src/log.log"));
try {
while ((newLog = reader.readLine()) != null){
System.out.println(newLog.split("\\s"));
//System.out.println(newLog.split(" "));
break;
}
//reader.close();
} catch (IOException e) {
e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
}
} catch (FileNotFoundException e) {
e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
}
}
}
正如你所看到的,我有完全简单的代码,但结果我看到了:
[Ljava.lang.String;@1aa8c488
我做错了什么?
答案 0 :(得分:4)
您尝试打印数组对象:这不会打印数组成员,而是打印数组引用。
一种解决方案:使用Arrays.asList()
环绕,即:
System.out.println(Arrays.asList(newLog.split("\\s")));
(更好的解决方案:根据其他答案的建议使用Arrays.toString()
。您每天都会学到新东西。)
答案 1 :(得分:3)
当您尝试直接打印数组时,这就是您所获得的。它使用toString
类的Object
方法,该方法打印出类的名称,符号字符和对象哈希码的无符号十六进制表示。你获得数组的“身份”,而不是其内容的文本表示。
相反,请使用:
System.out.println(Arrays.toString(newLog.split("\\s")));
答案 2 :(得分:1)
System.out.println
适用于字符串。当您传递非字符串的对象时,会自动调用方法toString()
,并且您会看到此调用的结果。
您正在使用数组参数调用System.out.println
,这就是数组toString()
的工作方式。要查看更好的输出使用
System.out.println(Arrays.toString(newLog.split("\\s")))
答案 3 :(得分:1)
方法String.split(String regEx)
返回字符串数组(String[]
)。
当您在Java中尝试System.out.println
任何Object
时,它会调用此对象toString()
方法。您看到的数组返回的toString()
方法就是您所看到的。
改为使用System.out.println(Arrays.toString(newLog.split("\\s")));
。
答案 4 :(得分:0)
而不是:
while ((newLog = reader.readLine()) != null){
System.out.println(newLog.split("\\s"));
//System.out.println(newLog.split(" "));
break;
}
你的代码应该是:
while ((newLog = reader.readLine()) != null){
String [] columns = newLog.split("\\s");
for (String result : columns) {
System.out.print(result);
}
break;
}