System.console () против isatty ()
System.console (), как уже упоминалось @Bombe, работает для простых случаев использования проверки подключения к консоли. Однако проблема с System.console () заключается в том, что он не позволяет определить, подключен ли к консоли STDIN или STDOUT (или оба, или ни один).
Различие между Java System.console () и C isatty () может быть проиллюстрировано в следующей разбивке по регистру (когда мы передаем данные в / из гипотетического Foo. класс):
1) STDIN и STDOUT tty
%> java Foo
System.console() => <Console instance>
isatty(STDIN_FILENO) => 1
isatty(STDOUT_FILENO) => 1
2) STDOUT является
%> echo foo | java Foo
System.console() => null
isatty(STDIN_FILENO) => 0
isatty(STDOUT_FILENO) => 1
3) Стандарт
%> java Foo | cat
System.console() => null
isatty(STDIN_FILENO) => 1
isatty(STDOUT_FILENO) => 0
4) Ни STDIN, ни STDOUT не являются tty
%> echo foo | java Foo | cat
System.console() => null
isatty(STDIN_FILENO) => 0
isatty(STDOUT_FILENO) => 0
Я не могу сказать вам, почему Java не поддерживает лучшую проверку tty. Интересно, не поддерживаются ли некоторые целевые ОС Java.
Использование JNI для вызова isatty ()
Технически возможно сделать это в Java (как указал stephen-c @) с некоторым довольно простым JNI , но это сделает ваше приложение зависимым от C-кода это не может быть переносимым на другие системы. Я понимаю, что некоторые люди могут не захотеть туда идти.
Краткий пример того, как будет выглядеть JNI (с большим количеством деталей):
Java: tty / TtyUtils.java
public class TtyUtils {
static {
System.loadLibrary("ttyutils");
}
// FileDescriptor 0 for STDIN, 1 for STDOUT
public native static boolean isTty(int fileDescriptor);
}
C: ttyutils.c (предполагает совпадение ttyutils.h ), скомпилированный в libttyutils.so
#include <jni.h>
#include <unistd.h>
JNIEXPORT jboolean JNICALL Java_tty_TtyUtils_isTty
(JNIEnv *env, jclass cls, jint fileDescriptor) {
return isatty(fileDescriptor)? JNI_TRUE: JNI_FALSE;
}
Другие языки:
Если у вас есть возможность использовать другой язык, я думаю, что большинство других языков поддерживают проверку tty. Но, поскольку вы задали вопрос, вы, вероятно, уже знаете это. Первое, что приходит мне на ум (кроме C / C ++): Ruby , Python , Golang и Perl .