有没有办法确定Java System.in是否为;互动式;?

有没有办法确定Java System.in是否为;互动式;?,java,Java,如果输入是交互式的,即从控制台输入,我想打印命令提示符,例如“>” 但如果它被重定向(例如从文件重定向),则我不想提示 in是一个抽象的InputStream,它似乎没有任何用于此的方法 如果具体类型不同,也许可以使用instanceof 同样,如果System.out被重定向到一个我也不想提示AFAIK的文件,那么在纯Java中无法做到这一点,甚至在JNI/JNA中也会很复杂 另一种方法是使用JDK1.6中引入的新控制台API。这允许您尝试获取控制台的读写器。如果成功,结果保证是交互式的。。。

如果输入是交互式的,即从控制台输入,我想打印命令提示符,例如“>”

但如果它被重定向(例如从文件重定向),则我不想提示

in是一个抽象的InputStream,它似乎没有任何用于此的方法

如果具体类型不同,也许可以使用instanceof


同样,如果System.out被重定向到一个我也不想提示AFAIK的文件,那么在纯Java中无法做到这一点,甚至在JNI/JNA中也会很复杂

另一种方法是使用JDK1.6中引入的新控制台API。这允许您尝试获取控制台的读写器。如果成功,结果保证是交互式的。。。从你的意思来说


第二种替代方法是检查用于启动应用程序的包装器脚本中的legwork,并通过系统属性将信息传递给Java。例如,在GNU/Linux系统上,可以使用
tty(1)
命令来判断stdin是否连接到“tty”设备。

AFAIK,在纯Java中无法做到这一点,甚至在JNI/JNA中也会很复杂

另一种方法是使用JDK1.6中引入的新控制台API。这允许您尝试获取控制台的读写器。如果成功,结果保证是交互式的。。。从你的意思来说


第二种替代方法是检查用于启动应用程序的包装器脚本中的legwork,并通过系统属性将信息传递给Java。例如,在GNU/Linux系统上,可以使用
tty(1)
命令来判断stdin是否连接到“tty”设备。

您可以使其交互:

public static void main(String args[]) throws Exception {
    String action = null;
    Scanner in = new Scanner(System.in);

    while (!((action = in.nextLine()).equalsIgnoreCase("exit"))) {
        if (action.equalsIgnoreCase("open")) {
            openConnections();
        } else if (action.equalsIgnoreCase("close")) {
            closeConnections();
        }
    }
}

您可以使其具有交互性:

public static void main(String args[]) throws Exception {
    String action = null;
    Scanner in = new Scanner(System.in);

    while (!((action = in.nextLine()).equalsIgnoreCase("exit"))) {
        if (action.equalsIgnoreCase("open")) {
            openConnections();
        } else if (action.equalsIgnoreCase("close")) {
            closeConnections();
        }
    }
}

这应该行得通。听起来,如果没有连接控制台,System.console()将返回null。控制台API在某种意义上起作用,但是如果用户希望应用程序的输入来自(比如)一个文件,那么打开一个新的控制台流就会被破坏。在我看来,控制台API只应该在应用程序从非交互式stdin读取没有意义(或危险)的情况下使用。我在想,您可以检查System.console()返回的非空值,以确定是否连接到控制台。@Andrew-但这有什么帮助呢?它不会告诉你是系统。输入/输出连接到控制台。是的,你说得对,我没在想。它只告诉您java是否是从控制台启动的,但显然stdin/out仍然可以重定向,这应该可以工作。听起来,如果没有连接控制台,System.console()将返回null。控制台API在某种意义上起作用,但是如果用户希望应用程序的输入来自(比如)一个文件,那么打开一个新的控制台流就会被破坏。在我看来,控制台API只应该在应用程序从非交互式stdin读取没有意义(或危险)的情况下使用。我在想,您可以检查System.console()返回的非空值,以确定是否连接到控制台。@Andrew-但这有什么帮助呢?它不会告诉你是系统。输入/输出连接到控制台。是的,你说得对,我没在想。它只告诉您java是否是从控制台启动的,但显然stdin/out仍然可以重定向。而且它似乎被贴了两次?我真的不认为这回答了被问到的问题。OP想知道是否以交互方式调用代码(stdin/stdout连接到控制台)。对不起,我不明白这个答案。而且它似乎被贴了两次?我真的不认为这回答了被问到的问题。OP想知道是否以交互方式调用代码(stdin/stdout连接到控制台)。您只需将
fileno(stderr)
更改为
fileno(stdin)
。对于使用JNI的linux特定解决方案,可能存在的副本,请参阅。您只需将
fileno(stderr)
更改为
fileno(stdin)
。可能存在重复的