如何在StreamTokenizer中解决无输入问题

时间:2012-03-14 05:58:11

标签: java stream tokenize

我有以下几行代码:

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时,我无法处理“无输入文件”的情况。

它似乎永远存在。

1 个答案:

答案 0 :(得分:1)

如果您没有将任何内容重定向到stdin(System.in),例如示例命令行中的“input.txt”,那么您的程序将希望您在控制台窗口中键入数据。

也许你应该重构你的程序以期望命令行参数(例如通过检查“args.length >= 1”)并将其解释为要读取的文件的名称。如果没有给出文件名,则可以打印错误消息。此外,您可以将特殊的伪文件名“-”(单个超级)解释为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块中。