【问题标题】:Who resets JVM file.encoding back to original?谁将 JVM file.encoding 重置回原来的?
【发布时间】:2012-11-29 08:25:55
【问题描述】:

System.setProperty("file.encoding", "utf-8");

下面的评论暗示 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"));
    }
}

然后我使用项目配置中设置的 Eclipse 和 Java 1.6 创建一个 jar 文件。
然后我用 Java 1.7 运行 jar-file,这一切都发生在 Windows 7 下。

java -jar FileEncodingTest.jar
Cp1251
UTF-8

java -jar FileEncodingTest.jar
Cp1251
UTF-8

那么是谁以及为什么将file.encoding 的值重置回Cp1251

统一更新: 任何人都可以解释或提供一个链接,逐步解释当我键入java -jar MyClass.jar 时在 JVM、进程方面会发生什么?

【问题讨论】:

  • 在一个 JVM 中更改系统属性不会影响其他 JVM。
  • @ThorbjørnRavnAndersen,所以为每个java -jar 创建一个单独的 JVM 实例?
  • 对于典型的 Oracle/IBM Java 发行版,是的。

标签: java encoding character-encoding jar jvm


【解决方案1】:

您启动了 2 个虚拟机。每个“java -jar”命令一个。

您可以通过在 Eclipse 中编辑项目属性来更改项目使用的编码。

但请注意,当您对依赖文件格式的内容进行硬编码并且另一个项目使用您的实现时,将会出现问题。这就是评论的意思。

【讨论】:

  • 您的意思是 2 个 vm 实例吗?我一直认为系统中只有一个JVM实例。
  • 我不知道 jvm 的确切内部工作原理,但您启动了 2 个进程。每个加载自己的属性。你没有进程间通信。您的项目会干扰其他程序,例如 JDownloader
【解决方案2】:

就像你打开一个 IE 浏览器一样,它首先进入主页。如果你访问另一个网站,然后你打开另一个 IE,它仍然是主页。 JVM 非常相似。 java程序的2个不同进程使用不同的JVM。这意味着当程序结束时,文件编码属性将再次默认。

【讨论】:

    猜你喜欢
    • 2014-03-15
    • 1970-01-01
    • 1970-01-01
    • 2015-07-10
    • 1970-01-01
    • 1970-01-01
    • 2021-11-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多