6

我正在使用 Windows 10 并运行 Oracle 昨天发布的 Java 9 版本。

如果我打开一个jshell并输入System.out.println(System.getenv())输出如预期的那样,如下面的屏幕截图的下部所示。

但是,如果我只是输入System.getenv(),则输出中间会丢失大量数据。请参阅下面屏幕截图的初始部分。这似乎是jshell的一个功能,因为在System.getenv()输出中省略号 (" ... ")下方的屏幕截图中(在带有手绘黄色边缘的第二个框中)与丢失的数据完全对应。

缺少环境变量CommonProgramFiles的结尾部分,环境变量SPRING_HOME的开头也是如此,还有其他几个环境变量,例如Path根本没有显示。

在此处输入图像描述

(出于隐私考虑,屏幕截图中的某些信息已被模糊处理。)

有没有其他人看到同样的事情(或没有),有没有人对jshell为什么这样做有建议?

4

1 回答 1

8

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

这将创建一个名为mine的新反馈模式,它继承自内置模式normal (显然有很多选项,所以我们从另一个模式继承,这样我们就不必担心设置所有内容)。详情请参阅/help /set mode

第二个命令将截断设置为 40000 个字符。可以对其进行配置,以便截断取决于显示的内容类型。详情请参阅/help /set truncation

最后,这里的最后一条命令切换到这种反馈模式。现在,控制台中显示的任何内容都将不再被截断,除非它超过 40,000 个字符。

此链接以及官方文档和上面的帮助命令有助于弄清楚这一点,以便编写此答案。


正常模式在截断前最多显示 1,000 个字符。单独使用/set truncation来显示各种截断设置或/set truncation normal显示正常模式的设置。

于 2017-09-22T23:00:23.253 回答