Java Charset.defaultCharset()和file.encoding之间有什么区别?

Java Charset.defaultCharset()和file.encoding之间有什么区别?,java,character-encoding,Java,Character Encoding,我在MSWindows7上运行JavaSE8,并使用Eclipse和Netbeans。通过运行下面的程序,我意识到两个表达式的返回值都是不同的 System.out.println(System.getProperty("file.encoding")); System.out.printf(Charset.defaultCharset()); 关于Charset.defaultCharset(),据说是“返回默认字符集”,关于file.encoding,我们被告知“默认字符集保存在JVM的系

我在MSWindows7上运行JavaSE8,并使用Eclipse和Netbeans。通过运行下面的程序,我意识到两个表达式的返回值都是不同的

System.out.println(System.getProperty("file.encoding"));
System.out.printf(Charset.defaultCharset());
关于Charset.defaultCharset(),据说是“返回默认字符集”,关于file.encoding,我们被告知“默认字符集保存在JVM的系统属性file.encoding中”。因此,似乎Charset.defaultCharset()必须准确返回存储在file.encoding中的内容。但我意识到这不会发生!!例如,如果我更改file.encoding内容

System.setProperty("file.encoding", "Big5");
System.out.println(System.getProperty("file.encoding")); 
它打印的是Big5,但是

System.out.printf(Charset.defaultCharset()); 
仍然打印它以前的值(在Eclipse上打印Windows-1256,在Netbeans中打印UTF-8)。你能解释一下它们到底是什么,它们在实践中有什么联系和区别吗


版本:过了一会儿,我在这个网站上找到了关于这个主题的非常有用的内容,整个问题都解决了:


Charset.defaultCharset()
中获得的值就是JVM启动时使用的值。以后不能更改

另一方面,系统属性可以更改,但在各种JDK类中是否获得所需的效果则是另一回事

为了使用不同的字符集,最好提供一个JVM参数,例如

java -cp <classpath> <package.classname> -Dfile.encoding=Big5
java-cp-Dfile.encoding=Big5

谢谢你这个乱穿马路的人,但我无法理解JVM字符集和它用于程序的字符集之间的区别。假设JVM是从UTF-8开始的,如果我们将file.encoding设置为其他字符集,那么这个UTF-8字符集(JVM字符集)在Java程序中的哪个位置扮演角色?输入流读取器和相应的编写器类将使用一个额外的参数,您可以在其中指定编码。为什么不用呢?默认字符集就是这样——当您不指定任何内容时,它是默认的。