2017-09-22 128 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

相關問題