2012-11-29 51 views
1

System.setProperty( 「file.encoding的」, 「UTF-8」);誰將JVM file.encoding重置爲原始版本?

下面的評論暗示的file.encoding會爲同一個JVM上運行的所有應用程序進行更改,但是,我不遵守這種行爲。

以編程方式設置系統屬性將影響在同一個JVM中運行的所有代碼,這是危險的,特別是在討論這樣的低級系統屬性時。

我已經閱讀了這個問題,並瞭解有與緩存許多問題和Java 1.5
Setting the default Java character encoding?

請,現在考慮下面的代碼:

public class FileEncodingTest { 
    public static void main (String[] args) { 
     System.out.println(System.getProperty("file.encoding")); 
     System.setProperty("file.encoding", "UTF-8"); 
     System.out.println(System.getProperty("file.encoding")); 
    } 
} 

然後,我創建一個jar -file使用在項目配置中設置的Eclipse和Java 1.6。
然後我運行的jar文件與Java 1.7,這一切發生的Windows 7

java -jar FileEncodingTest.jar 
Cp1251 
UTF-8 

java -jar FileEncodingTest.jar 
Cp1251 
UTF-8 

下,那麼是誰,爲什麼重置的file.encoding值回Cp1251

UPD: 任何人都可以解釋或提供一個鏈接,這也解釋了一步一步的什麼JVM方面情況,處理當我輸入java -jar MyClass.jar

+1

變化在一個JVM系統屬性不影響其他JVM的。 –

+0

@ThorbjørnRavnAndersen,所以對於每個'java -jar',創建一個單獨的JVM實例? –

+2

對於典型的Oracle/IBM Java發行版,是的。 –

回答

1

你開始2個虛擬機。每個「java -jar」命令一個。

你可以改變你的編碼使用的項目在Eclipse中編輯項目屬性。

但請注意,當你硬編碼的東西,依靠FILEFORMAT和其他項目使用您的實現會有問題。那是評論意味着什麼。

+0

你的意思是2個虛擬機的實例?我一直相信系統中只有一個JVM實例。 –

+0

我不知道jvm的確切內部工作方式,但是您啓動了2個進程。每個加載它自己的屬性。你沒有進程間通信。它不會有任何意義,你的項目干擾其他程序,如JDownloader – schippi

1

就像你打開一個IE瀏覽器,它會在第一個主頁。如果你訪問另一個網站,那麼你打開另一個IE,它仍然是首頁。 JVM非常相似。 2個不同的java程序進程使用不同的JVM。這意味着程序結束時,文件編碼屬性將再次默認。

+0

感謝您的答案。請參閱我的更新。你能幫我/向我解釋嗎?然後我可以接受你的答案。 –

相關問題