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

时间:2017-09-22 22:01:58

标签: read-eval-print-loop java-9 jshell

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

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

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

环境变量 CommonProgramFiles 的结束部分缺失,环境变量 SPRING_HOME 的开头也是如此,还有其他一些环境变量,例如路径,根本没有显示。

enter image description here

(屏幕截图中的某些信息因隐私而模糊不清。)

是否有其他人看到同样的事情(或者没有),是否有人就 jshell 为何会这样做提出建议?

1 个答案:

答案 0 :(得分:7)

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 的新反馈模式,该模式继承自内置模式正常 (显然很多选项,所以我们从另一种模式继承,这样我们就不必担心设置所有内容了。有关详细信息,请参阅/help /set mode

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

最后,此处的最后一个命令切换到此反馈模式。现在,除非超过40,000个字符,否则控制台中显示的任何内容都不会被截断。

This link以及official documentation和上面的帮助命令帮助我解决了这个问题。

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