Как решить, нет ввода в StreamTokenizer - PullRequest
2 голосов
/ 14 марта 2012

У меня есть следующие строки кода:

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 Ответ

1 голос
/ 14 марта 2012

Если вы не перенаправляете что-либо в stdin (System.in), например, «input.txt» в командной строке вашего примера, ваша программа будет ожидать ввода данных в окне консоли.

Возможновам следует реорганизовать вашу программу так, чтобы она ожидала аргумент командной строки (например, проверив это «args.length >= 1») и интерпретировала его как имя файла для чтения.Если имя файла не указано, вы можете напечатать сообщение об ошибке.Кроме того, вы можете интерпретировать специальное псевдо-имя файла «-» (одиночный перенос) как «стандартный ввод», так что вы все равно можете перенаправлять данные.

Например:

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.

...