我正在编写一个非常简单的"here"shell文档,它为java类提供食物。这是java代码
public class input {
public static void main(String[] args)
{
try {
do {
InputStreamReader isr = new InputStreamReader(System.in);
BufferedReader br = new BufferedReader(isr);
System.out.print("cmd>");
String s = br.readLine();
if (s != null) {
System.out.println("cmd=" + s);
if (s.equals("quit")) return;
}
} while (true);
}
catch(Exception e) {
}
}
}
它只是读取输入并将其回显:)
在文件"readinput"中,我有一行来调用上面的java类
java input
这是 shell 脚本,用于一个接一个地调用上面的"readinput"参数
#!/bin/sh
./readinput << EOF1
aaaaaaaaaa
bbbbbbbb
quit
EOF1
当我运行这个 shell 脚本时,第一行"aaaaa"被正确回显,然后脚本进入无限循环。似乎 java 类一直在读取空字符串。
可能导致此行为的原因是什么?
代码应该修改如下,if循环应该修改。
public class input {
public static void main(String[] args)
{
try {
InputStreamReader isr = new InputStreamReader(System.in);
BufferedReader br = new BufferedReader(isr);
System.out.print("cmd>");
String s = null;
while ((s = br.readLine() )!= null) {
System.out.println("cmd=" + s);
if (s.equals("quit")) return;
}
}
catch(Exception e) {
}
}
}
虽然外部不需要循环,但循环应该仅用于读取 shell 文件的内容。
在这里,读者将首先阅读内容,While 将遍历内容。
您的 Java 类正在循环内为每行输入创建InputStreamReader
。当您每次创建新InputStreamReader
时,它只是第一次读取输入行,然后继续读取 null。
在do loop
之前移动它们以解决此问题。
try {
InputStreamReader isr = new InputStreamReader(System.in);
BufferedReader br = new BufferedReader(isr);
do {
System.out.println("<cmd>");
String s = br.readLine();
if (s != null) {
System.out.println("cmd=" + s);
if (s.equals("quit")) return;
}
} while (true);
isr.close();
}
catch(Exception e) {
System.err.println("Exception: " + e);
}