我正在编写一个非常简单的“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脚本时,第一行“aaaaaaaaa”被正确回显,然后脚本进入无限循环。好像java类一直在读取空字符串。
可能导致此行为的原因是什么?
答案 0 :(得分:1)
代码应修改如下, 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文件的内容。
这里读者将首先阅读内容,而而将遍历内容。
答案 1 :(得分:0)
您的Java类正在循环内为每一行输入创建InputStreamReader
。当你每次只读取输入行然后继续读取null时创建一个新的InputStreamReader
。
在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);
}