Перенаправление ввода из командной строки в java-программу не работает для консольного класса

#java #command-line

#java #командная строка

Вопрос:

Версия Java = 14.0.1

ОС = Windows 8

2 метода f1 и f2 в коде работают одинаково, когда я просто запускаю java Test для каждой отдельной компиляции.

Но когда я перенаправляю ввод из файла в командной строке, например java Test < script.txt , работает только f1, а f2 выдает ошибку «нет консоли». Почему так?

f2 даже терпит неудачу, когда я вызываю его в jshell с помощью Test.f2(), тогда как f1() просто работает.

Я был знаком с кодом типа f1. Сегодня я начал использовать код типа f2. Делая f2, я подумал, что в моей программе или системе произошла какая-то ошибка, и собирался сдаться, пока не подумал попробовать f1 и не понял, что моя программа в порядке.

Что я делаю не так в f2?

Java-код…

 import java.io.*;

class Test{
    
    public static void main(String[] args) throws Exception{
        //f1(); //OR
        f2();
    }
    
    
    static void f1() throws Exception{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String s = null;
        int i =0 ;
        
        while(true){
            System.out.println("s = ?");
            s = br.readLine();
            System.out.println(i   " : "   s);
            i  ;
            if(s.equals("exit"))break;
        }
        
    }
    
    //redirection does not work on this
    public static void f2(){
        Console console = System.console();
        if(console==null){
            System.out.println("ERROR: no Console instance");
            return;
        }
        String s = null;
        int i =0 ;
        
        while(true){
            console.printf("s = ?n");
            s = console.readLine();
            
            console.printf("%d = %sn",i,s);
            i  ;
            if(s.equals("exit"))break;
        }
    }
}

 

Пример сценария wannabe … script.txt

 this
will
print
exit
this
wont
print
 

Комментарии:

1. Я не думаю, что java.io.Console будет работать здесь. Цитирование из docs.oracle.com/en/java/javase/14/docs/api/java.base/java/io / … : «Если виртуальная машина запускается из интерактивной командной строки без перенаправления стандартных потоков ввода и вывода, то ее консоль будет существовать и обычно будет подключена к клавиатуре и дисплею, с которых была запущена виртуальная машина. Если виртуальная машина запускается автоматически, например, с помощью планировщика фоновых заданий, то обычно у нее не будет консоли. » Надеюсь, это поможет

2. пользователь79161 — хорошо. я думаю, я буду придерживаться старых классов; или не использовать перенаправление с более новым консольным классом; и принять имя файла сценария в качестве явного аргумента. Спасибо.