#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 — хорошо. я думаю, я буду придерживаться старых классов; или не использовать перенаправление с более новым консольным классом; и принять имя файла сценария в качестве явного аргумента. Спасибо.