关于 Java 9 为什么在 jshell 中 System.getenv() 的输出不完整?

On Java 9 why is the output from System.getenv() incomplete in jshell?

我使用的是 Windows 10 和 运行 Oracle 昨天发布的 Java 9 版本。

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

但是,如果我简单地输入 System.getenv(),输出中间会丢失大量数据。请参阅下面屏幕截图的初始部分。这似乎是 jshell 的一个特性,因为在 [=27] 的输出中省略号 ("...") 下面的屏幕截图=]System.getenv()(手绘黄边的第二个框内)正好对应缺失数据。

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

(为了保护隐私,屏幕截图中的某些信息已被模糊处理。)

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

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 个字符。

This link along with the official documentation 和上面的帮助命令帮助解决了这个问题,以便写下这个答案。


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