FileDescriptor.in против System.in

В Java мы можем использовать класс Scanner для ввода данных, но он не так эффективен, как BufferedReader в пакете ввода-вывода. При инициализации объекта класса Scanner или объекта класса BufferedReader мы используем InputStream "System.in". System.in хорош по сравнению с FileDescriptor.in?

Например, если я использую System.in с BufferedReader:

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

И используя FileDescriptor.in:

BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(FileDescriptor.in), "ASCII"));

То же самое и при печати:

Использование System.out OutputStream:

System.out.println("Hello World!");

Использование FileDescriptor.out с BufferedWriter:

BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(FileDescriptor.out),"ASCII"), 512);

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
0
184
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Похоже, ваш вопрос "System.in хорош по сравнению с FileDescriptor.in?"

Ответы:

  1. Это разные. System.in можно заменить на System.setIn, но FileDescriptor.in всегда указывает на один и тот же источник ввода-вывода (пока вы запускаете программу, если вы не используете собственный код), поэтому вы менее гибки, если используете FileDescriptor.in.
  2. С настройками по умолчанию при запуске виртуальной машины производительность такая же, если вы помните, что System.in буферизуется, поэтому любая альтернатива также должна буферизоваться.

Доказательство пункта 2 находится в исходном коде класса System:

    FileInputStream fdIn = new FileInputStream(FileDescriptor.in);
    // ...
    setIn0(new BufferedInputStream(fdIn));

Стандартный поток, который вы получаете от System.in, - это FileInputStream, который читает с FileDescriptor.in, но есть BufferedInputStream, обернутый вокруг него по соображениям производительности (это улучшает производительность небольших чтений).

Другие вопросы по теме