从命令行和代码设置系统属性有什么区别?

时间:2013-10-14 14:21:27

标签: java sqlite encoding jvm

问题在于:我的代码中有一些中文,我将其写入sqlite。

当我在eclipse中运行我的程序并从sqlite中读取字符串时,它运行正常。但是当我将项目打包到jar并在命令行中运行时。从sqlite读出的中文字符串是不可读的。

经过一些试验,我知道问题出在file.encoding系统属性中。当我使用命令java -Dfile.encoding=UTF-8 -jar TK.jar运行jar时,它可以正常使用中文单词,但是如果我在代码中设置系统属性,如:System.setProperty("file.encoding", "UTF-8");,它将无效。

那么,从命令行和代码设置系统属性有什么区别?谁能告诉我如何在代码中设置file.encoding系统属性?

非常感谢!

摘要:

请记住在使用String.getBytes()new String()时添加字符集,以避免在不同环境中运行程序时中文或日文输出不可读。

3 个答案:

答案 0 :(得分:4)

在代码中的某处,您可能依赖于UTF-8的默认字符集。例如,当您在未指定字符集的情况下调用String.getBytes()时,Java将使用默认字符集。如果您始终需要UTF-8,请在致电String.getBytes()时指定:

byte[] utf8bytes = text.getBytes("UTF-8");

此外,如果要读取具有特定字符编码的文件,请指定字符编码,而不是依赖于默认设置。例如:

InputStream is = new FileInputStream("utf8file.txt");
BufferedReader in = new BufferedReader(new InputStreamReader(is, "UTF-8"));

// Read text, file will be read as UTF-8
String line = in.readLine();

in.close();

答案 1 :(得分:0)

如果在命令行中指定了系统属性,则在程序加载后它们就可用。

如果你在程序中指定它们,那么它们只有在你设置之后才可用,通过用main方法加载类,你甚至可以在设置它们之前使用系统属性加载其他类!

答案 2 :(得分:0)

并非所有属性都可以在运行时更改。这意味着如果不指定value作为参数并决定从System.setProperty设置它,那将无效。 “file.encoding”就是其中之一。 Possible duplicate.