【问题标题】:Using readline() and split()使用 readline() 和 split()
【发布时间】:2012-11-05 23:41:13
【问题描述】:
下面的代码大部分是不言自明的。但是,我在两种情况下遇到了麻烦:
即使命令行留空,while 循环也不会退出。
-
如果输入是test t1,则key 变量应该是“测试”(使用System.out.println(key))这样做,但是由于某种原因它仍然没有进入if 条件。
String[] broken_text = null; String text = "";
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
while((text = reader.readLine()) != null) {
broken_text = text.split(" ");
String first_key = broken_text[0];
if (first_key == "test") {
//some statements
}
}
我不确定为什么会发生这种情况,我们将不胜感激任何有关此问题的帮助。
【问题讨论】:
标签:
java
split
bufferedreader
readline
【解决方案1】:
使用 equals() 来检查字符串是否相等。
if (first_key == "test") {
//some statements
}
should be
if (first_key.equals("test")) {
//some statements
}
您的 text 永远不会是 null,因为您将其声明为
String text = "";
因此你的while循环将是一个无限循环
改变
String text = "";
to
String text = null;
或者如果您想将 text="" 字符串保留为空字符串。
使用
while(!(text = reader.readLine()).isEmpty())
【解决方案2】:
循环没有结束,因为空行导致readLine() 返回一个空字符串,而不是null。
比较失败,因为字符串必须与equals()而不是==进行比较
【解决方案3】:
在这种情况下,String text 永远不会是 null。您可以使用:
while (!(text = reader.readLine()).isEmpty()) {
【解决方案4】:
这应该是您编辑的代码:
String[] broken_text = null;
String text = "";
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
while((text = reader.readLine()) != null && !text.isEmpty()) {
broken_text = text.split(" ");
String first_key = broken_text[0];
if ( "test".equals(first_key)) {
//some statements
}
}
之所以将(text = reader.readLine()) != null改成(text = reader.readLine()) != null && !text.isEmpty()是因为readLine()遇到文件结束符作为第一个字符时返回null,遇到第一个字符时返回“”(空字符串)是\r(回车)、\n(换行)或\r\n(回车后跟换行)。在检查isEmpty() 之前,您必须始终检查null。
在 unix / Linux 控制台文件结尾是 [ctrl][d] 而在 DOS 上是 [ctrl][z]
注意:如果您想从文件(您更有可能获得文件结尾)而不是控制台读取输入,那么您的 reader 将被初始化如下:
BufferedReader reader = new BufferedReader(new FileReader("d:\\a1.txt"));
(假设您的输入数据在文件中:"d:\a1.txt"。)