В Java 9 почему вывод System.getenv() неполный в jshell?

Я использую Windows 10 и запускаю версию Java 9, выпущенную вчера Oracle.

Если я открою jshell и введу System.out.println(System.getenv()), результат будет таким, как ожидалось, как показано в нижней части снимка экрана ниже. .

Однако, если я просто ввожу System.getenv(), в середине вывода отсутствует большой кусок данных. См. начальную часть скриншота ниже. Похоже, это функция jshell, поскольку на снимке экрана под многоточием ("...") в выводе System.getenv()< /strong> (во втором поле с нарисованными от руки желтыми краями) точно соответствует отсутствующим данным.

Конечная часть переменной среды CommonProgramFiles отсутствует, как и начало переменной среды SPRING_HOME, и есть несколько других переменных среды, таких как Path. strong> которые вообще не отображаются.

введите описание изображения здесь

(Некоторая информация на снимке экрана была размыта в целях конфиденциальности.)

Кто-нибудь еще видит то же самое (или нет), и есть ли у кого-нибудь предложения о том, почему jshell это делает?


person skomisa    schedule 22.09.2017    source источник


Ответы (1)


JShell усекает некоторые строковые результаты, которые печатаются в REPL. Однако это не влияет на печать на консоли.

Мы можем видеть, что то же самое происходит с этим:

import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
List<Integer> x = IntStream.range(0,3000).mapToObj(Integer::valueOf).collect(Collectors.toList());
x

Мы увидим такое же усечение с многоточием в этом выводе.

Если мы напечатаем результат:

System.out.println(x);

мы этого не видим.


Это настраивается пользователем. Например, мы можем создать режим пользовательского формата, который позволяет использовать до 40 000 символов (чрезмерно большое число, с которым мы, скорее всего, не столкнемся, поэтому усечения не происходит).

/set mode mine normal -command
/set truncation mine 40000
/set feedback mine

Это создает новый режим обратной связи с именем мой, который наследует встроенный режим нормальный (очевидно, их много). вариантов, поэтому мы наследуем от другого режима, чтобы нам не приходилось беспокоиться о настройке всего). Подробнее см. /help /set mode.

Вторая команда устанавливает усечение на 40000 символов. Это можно настроить так, чтобы усечение зависело от того, что отображается. Подробнее см. /help /set truncation.

Наконец, последняя команда здесь переключает в этот режим обратной связи. Теперь любая информация, отображаемая в консоли, больше не будет усекаться, если ее длина не превышает 40 000 символов.

Эта ссылка вместе с официальная документация и приведенные выше справочные команды помогли понять это. для того, чтобы написать этот ответ.


В нормальном режиме отображается до 1000 символов до усечения. Используйте /set truncation отдельно для отображения различных настроек усечения или /set truncation normal для отображения настроек для нормального режима.

person Matthew    schedule 22.09.2017
comment
Ах, из вашей ссылки кажется, что вы можете настроить его, используя /set truncation ‹mode› ‹length› ‹selector› .... Тем не менее я до сих пор не могу точно понять, что указать в jshell, чтобы предотвратить усечение длинного вывода. . - person skomisa; 23.09.2017
comment
@skomisa Я отредактировал ответ, чтобы он действительно показывал, как настроить усечение. Я не думаю, что это можно полностью предотвратить, но этот ответ показывает, как установить очень большое отображаемое количество символов. - person Matthew; 23.09.2017
comment
Ваши команды конфигурации отлично сработали для меня. Я также нашел ссылку, которая объясняет расположение многоточия, если вывод усечен: ошибки. openjdk.java.net/browse/JDK-8166637 - person skomisa; 23.09.2017