您好我正在编写我的第一个Java应用程序,并且我有一些测试用例(* .tc文件)我想通过此脚本直接访问该应用程序:
for f in `ls *.tc`; do
echo "Current Testcase: $f"
x=${f%.*}
java Main < $x.tc > $x.out
if diff "$x.out" "$x.should"; then
echo "passed testcase $f"
let PASSED=PASSED+1
else
echo "failed testcase $f"
let FAILED=FAILED+1
fi
done
问题是我无法弄清楚为什么只要tc file
包含多行,该应用程序就会疯狂。例如:quit.tc
包含
quit
并且就像我手动输入“quit”时一样,因此测试用例通过。 但是,当我写另一个包含
的tc:quit2.tc
时
lala
test
quit
应用程序在第一个命令之后退出(因为readString函数似乎在之后返回null)。 这是负责阅读的功能:
public String readString(){
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String answer = null;
try {
answer = br.readLine();
return answer;
}
catch(IOException ioe) {
System.out.println("IO Error");
}
return answer;
}
我不知道为什么或当我重定向到应用程序时此函数返回null,这似乎是问题。你可以帮忙,所以我可以让tc脚本工作吗? THX
答案 0 :(得分:3)
如果你是java新手,并且你仍然塑造自己的风格和做事方式,我会向你推荐2个提示:
1)使用Scanner来阅读您的输入。使用Scanner对象的nextLine()方法可能正是您所需要的。
2)设计您的代码,以便通过JUnit测试它。
仍然在您的readString()
方法中,从try块中删除return answer;
。
更新:尝试在您的函数中实现以下内容:
扫描程序实例hasNextLine()为true时a) - &gt;
b)调用扫描程序实例nextLine()方法 - &gt;
c)解析该行,看看它是否等于'退出' - &gt;
d)实施相应的逻辑if
案例。
答案 1 :(得分:0)
您的问题是BufferedReader
:它会立即读取整个文件(出于性能原因)。
由于每次调用BufferedReader
时都会创建一个新的readString()
,因此第一个读取器将吞下大部分文件(或全部文件),第二个读取器将触发文件结尾。
解决方案是将阅读器放入一个字段,创建一次,然后始终使用同一个阅读器来调用readLine()
另外,你永远不会关闭阅读器。
Java将忘记未使用的对象,但您必须正确关闭操作系统资源,如FileInputStream
s