2017-09-22 73 views
4

我正在使用Windows 10并运行昨天由Oracle发布的Java 9版本。在Java 9上,为什么来自System.getenv()的输出在jshell中不完整?

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

但是,如果我只是输入System.getenv(),那么输出中间会有大量数据缺失。看到下面的屏幕截图的最初部分。这似乎是jshell的一个特性,因为在System.getenv()(在手绘黄色边缘的第二个框内)的输出中的省略号(“...”)之下的屏幕截图正好对应于缺失的数据。

对环境变量COMMONPROGRAMFILES端部丢失,因为是环境变量SPRING_HOME的开始,并且有几个其他的环境变量未示出的在所有如路径

enter image description here

(屏幕拍摄了一些信息已经模糊的隐私。)

没有任何人看到同样的事情(或没有),而且没有人对为什么jshell建议是这样做?

回答

6

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和上面的帮助命令帮助解决这个问题,以写出这个答案。


&dagger;正常模式在截断前最多显示1,000个字符。使用/set truncation本身显示各种截断设置或/set truncation normal以显示正常模式的设置。

+0

啊,从你的链接看来你可以使用“/ set truncation ...”来配置它。然而,我仍然无法弄清楚在jshell中指定什么,以防止冗长的输出被截断... – skomisa

+1

@skomisa我编辑了答案,以便它实际上显示如何调整截断。我不认为可以完全防止它,但是这个答案显示了如何将显示的字符数设置得非常高。 – Matthew

+2

您的配置命令对我来说非常合适。如果输出被截断,我还找到一个链接来解释省略号的位置:https://bugs.openjdk.java.net/browse/JDK-8166637 – skomisa

相关问题