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

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

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

环境变量 CommonProgramFiles 的末尾部分丢失了,环境变量 SPRING_HOME 的开头也没有了,还有其他一些环境变量(例如路径)也没有显示。

read-eval-print-loop - 在Java 9上,为什么jshell中System.getenv()的输出不完整?-LMLPHP

(为了保护隐私,屏幕快照中的某些信息已模糊化。)

是否有其他人看到(或没有)相同的东西,并且有人对为什么 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

这将创建一个新的反馈模式我的,它继承自内置模式普通†(显然有很多选项,因此我们从另一种模式继承,因此我们不必担心设置所有内容)。有关详细信息,请参见/help /set mode

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

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

This link以及official documentation和上面的help命令有助于弄清楚这一点,以便编写此答案。

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

关于read-eval-print-loop - 在Java 9上,为什么jshell中System.getenv()的输出不完整?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46373797/

10-13 02:57