我有以下几行代码:
public static void main(String[] args) {
InputStreamReader inputStreamReader = new InputStreamReader(System.in);
StreamTokenizer t = new StreamTokenizer(inputStreamReader);
while (t.nextToken() != StreamTolenizer.TT_EOF) {
// process here
}
}
所以,当我运行时,我调用:java example.java < input.txt
但是,当我调用:java example
时,我无法处理"没有输入文件"的情况。
它似乎永远都在运行。
如果您在示例命令行中没有将任何内容重定向到stdin(System.in),例如"input.txt",那么您的程序将期望您在控制台窗口中键入数据。
也许你应该重构你的程序,以期待一个命令行参数(例如,通过检查"args.length >= 1
"),并将其解释为要读取的文件的名称。如果没有指定文件名,则可以打印错误消息。此外,您可以将特殊的伪文件名"-
"(单个hypen)解释为stdin,这样您仍然可以重定向数据。
例如:
public static void main(String[] args) {
if (args.length < 1) throw new IllegalArgumentException("no filename given");
InputStream in = ("-".equals(args[0])) ? System.in : new FileInputStream(args[0]);
InputStreamReader inputStreamReader = new InputStreamReader(in);
StreamTokenizer t = new StreamTokenizer(inputStreamReader);
while(t.nextToken() != StreamTolenizer.TT_EOF) {
// ...
但是,不要忘记关闭FileInputStream,例如在finally
块中。