Java для перенаправления или стандартного вывода [duplicate]

Есть список, словарь и набор понятий, но нет кортежей (хотя изучите «генераторные выражения»).

Они обращаются к проблеме, когда традиционные циклы в Python являются операторами (не возвращаются ничего), а не выражения, которые возвращают значение.

Они не являются решением каждой проблемы и могут быть переписаны как традиционные циклы. Они становятся неудобными, когда состояние должно поддерживаться и amp; обновлено между итерациями.

Они обычно состоят из:

[<output expr> <loop expr <input expr>> <optional predicate expr>]

, но могут быть перекручены множеством интересных и причудливых способов.

Они могут быть аналогичны традиционные map() и filter() операции, которые все еще существуют в Python и продолжают использоваться.

Когда все сделано хорошо, они имеют высокий коэффициент удовлетворения.

33
задан Zilk 10 September 2009 в 08:12
поделиться

5 ответов

System.console () вернет консоль, к которой подключено ваше приложение, если оно подключено, в противном случае оно возвращает null. (Обратите внимание, что он доступен только от JDK 6.)

22
ответ дан Bombe 21 August 2018 в 17:27
поделиться
  • 1
    @Bombe: это не относится к основному вопросу ... вот как узнать, подключен ли СУЩЕСТВУЮЩИЙ поток к консоли. – Stephen C 10 September 2009 в 08:44
  • 2
    Что такое существующий поток? Как поток может быть подключен к терминалу, но не существует? Или вы пытаетесь обнаружить, когда процесс теряет контрольный терминал? – Bombe 10 September 2009 в 13:42
  • 3
    @Bombe: А я вижу, что делает объект консоли. Но я все еще утверждаю, что это не делает то, что делает isatty. В частности, он не говорит вам, связан ли данный поток с консолью. – Stephen C 13 September 2009 в 16:27
  • 4
    System.console() будет null, если либо stdin, либо stdout перенаправлены, но он не говорит вам, какой из них он имеет. Это актуально, потому что иногда вам нужно знать, какой поток (если есть) подключен к консоли. Например, если stdout перенаправляется в файл журнала, вы можете удалить escape-коды ANSI , но это же неверно, если stdin перенаправлено. – Gili 15 August 2016 в 01:05

System.console () vs isatty ()

System.console (), как уже упоминалось @Bombe, работает для простых случаев проверки связи с консолью. Однако проблема с 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 is 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. Интересно, не поддерживают ли некоторые из целевых ОС 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-checking , Но, поскольку вы задали этот вопрос, вы, наверное, уже это знаете. Первыми, которые приходят мне в голову (кроме C / C ++), являются Ruby , Python , Golang и Perl .

26
ответ дан Kristian Holdhus 21 August 2018 в 17:27
поделиться
  • 1
    Вот вызов native code Console, чтобы решить, будет ли он существовать или нет - оба stdin и stdout должны быть TTY, чтобы экземпляр Console был доступен. – dimo414 2 February 2016 в 07:23

Вы можете использовать библиотеку jnr-posix для вызова собственных методов posix из Java:

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

POSIX posix = POSIXFactory.getPOSIX();

posix.isatty(FileDescriptor.out);
5
ответ дан Leonid Beschastny 21 August 2018 в 17:27
поделиться

Короткий ответ заключается в том, что в стандартной Java нет прямого эквивалента 'isatty'. Там был RFE для чего-то подобного в базе данных Java Bug с 1997 года, но он имел только одно незначительное голосование.

Теоретически вы могли бы реализовать «isatty» используя магию JNI. Но это создает всевозможные потенциальные проблемы. Я даже не подумал бы о том, чтобы сделать это сам ...


1 - Голосование за ошибки Java, которые должны быть исправлены, исчезло примерно в то время, когда Oracle заняла Sun.

8
ответ дан Stephen C 21 August 2018 в 17:27
поделиться
0
ответ дан Neil McGuigan 1 November 2018 в 10:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: