Java 프로그램의 입력/출력 스트림이 터미널에 연결되어 있는지 어떻게 확인할 수 있습니까?

StackOverflow https://stackoverflow.com/questions/1403772

  •  05-07-2019
  •  | 
  •  

문제

Java 프로그램이 사용에 따라 다른 기본 설정 (Verbosity, 지원되는 경우 색상 출력)을 갖기를 원합니다. C에는 파일 디스크립터가 터미널에 연결된 경우 1, 그렇지 않으면 0을 반환하는 ISATTY () 함수가 있습니다. Java에 이에 동등한 것이 있습니까? javadoc에서 입력 스트림 또는 인쇄물을 보지 못했습니다.

도움이 되었습니까?

해결책

System.Console () 응용 프로그램이 연결된 경우 콘솔을 반환합니다. 그렇지 않으면 반환됩니다. null. (JDK 6 ON에서만 사용할 수 있습니다.)

다른 팁

system.console () vs isatty ()

@Bombe가 이미 언급 한 System.Console ()은 콘솔 연결을 확인하는 간단한 사용 사례에 대해 작동합니다. 그러나 System.console ()의 문제점은 콘솔에 연결된 stdin 또는 stdout (또는 둘 다 또는 둘 다)인지 확인할 수 없다는 것입니다.

Java의 차이점 System.Console () 그리고 C ISATTY () 다음의 사례-차단에 설명 할 수 있습니다 (가상의 foo.class로 데이터를 파이프하는 곳) :

1) Stdin과 Stdout은 tty입니다

%> java Foo
System.console() => <Console instance>
isatty(STDIN_FILENO) => 1
isatty(STDOUT_FILENO) => 1

2) Stdout은 tty입니다

%> echo foo | java Foo
System.console() => null
isatty(STDIN_FILENO) => 0
isatty(STDOUT_FILENO) => 1

3) Stdin은 tty입니다

%> 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-Checking을 지원하지 않는지 말할 수 없습니다. Java의 Target OS 중 일부가 지원하지 않는지 궁금합니다.

jni를 사용하여 isatty ()를 호출

기술적으로 ~이다 일부와 함께 Java (Stephen-C@ exted) 로이 작업을 수행 할 수 있습니다. 상당히 간단한 JNI, 그러나 응용 프로그램은 다른 시스템에 휴대 할 수없는 C 코드에 의존하게됩니다. 나는 어떤 사람들이 그곳에 가고 싶지 않다는 것을 이해할 수 있습니다.

JNI가 어떻게 보일지에 대한 빠른 예 (많은 세부 사항을 통해 광택) :

자바: tty/ttyutils.java

public class TtyUtils {
    static {
        System.loadLibrary("ttyutils");
    }
    // FileDescriptor 0 for STDIN, 1 for STDOUT
    public native static boolean isTty(int fileDescriptor);
}

씨: 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;
}

기타 언어 :

다른 언어를 사용할 수있는 옵션이 있다면 대부분의 다른 언어를 지원할 수 있습니다. 그러나 당신이 질문을했기 때문에, 당신은 이미 그것을 알고있을 것입니다. 나를 위해 떠오르는 첫 번째는 (C/C ++를 제외하고) 루비, 파이썬, 골란 그리고 .

짧은 대답은 표준 Java에 'ISATTY'와 직접적인 동등한 것이 없다는 것입니다. 있었어요 RFE 1997 년부터 Java Bug 데이터베이스에서 이와 같은 것을 위해서만 가지다 가졌다1 하나의 상당한 투표.

이론적으로는 JNI Magic을 사용하여 'Isatty'를 구현할 수 있습니다. 그러나 그것은 모든 종류의 잠재적 문제를 소개합니다. 나는 이것을 직접하는 것을 생각조차하지 않을 것입니다 ...


1- Java 버그가 고정 될 투표는 Oracle이 Sun을 점령 할 때까지 사라졌습니다.

당신은 사용할 수 있습니다 jnr-posix Java에서 Native Posix 메소드를 호출하는 라이브러리 :

import jnr.posix.POSIX;
import jnr.posix.POSIXFactory;
import java.io.FileDescriptor;

POSIX posix = POSIXFactory.getPOSIX();

posix.isatty(FileDescriptor.out);

C 소스를 직접 컴파일하지 않으려면 Jansi 라이브러리를 사용할 수 있습니다. JNR-POSIX보다 훨씬 작습니다

<dependency>
  <groupId>org.fusesource.jansi</groupId>
  <artifactId>jansi</artifactId>
  <version>1.17.1</version>
</dependency>

...

import static org.fusesource.jansi.internal.CLibrary.isatty;

...

System.out.println( isatty(STDIN_FILENO) );
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top