为啥 Java 会忽略 .properties 文件的第一行?

Posted

技术标签:

【中文标题】为啥 Java 会忽略 .properties 文件的第一行?【英文标题】:Why does Java ignore the first line of a .properties file?为什么 Java 会忽略 .properties 文件的第一行? 【发布时间】:2014-09-08 16:59:11 【问题描述】:

我正在使用一个应用程序来加载带有java.util.Properties.properties 文件,如下所示:

Properties _properties = new Properties();
_properties.load(new FileInputStream("app.properties"));

属性文件(最初)是这样的:

app=myApp
dbLogin=myDbLogin
version=0.9.8.10
server=1
freq=10000
stateGap=360000

奇怪的是,当我调用_properties.getProperty("app") 时,它总是返回null,但是我可以毫无问题地加载所有其他属性。我通过在属性文件顶部添加注释解决了这个问题,然后一切正常。

我的问题是:Java 为什么要这样做?我似乎找不到任何关于此的文档,而且似乎违反直觉。

【问题讨论】:

它不这样做,你确定你指的是同一个文件吗? 为什么'app.properties'用单引号括起来? 贴一个真实的例子。您的 Java 代码是非法的,我的猜测是您的真实属性文件中的“app”后面有一个空格。 属性中没有“getString()”方法 BOM 在文件开头? 【参考方案1】:

感谢@KonstantinV.Salikhov 和@pms 帮助解决这个问题;我决定发布发现的答案,以拯救人们通过 cmets 狩猎。

问题是我的文件编码错误,如下所述:http://docs.oracle.com/javase/7/docs/api/java/util/Properties.html

load(Reader) / store(Writer, String) 方法以下面指定的简单面向行的格式从基于字符的流中加载和存储属性。 load(InputStream) / store(OutputStream, String) 方法与 load(Reader)/store(Writer, String) 对的工作方式相同,除了输入/输出流以 ISO 8859-1 字符编码进行编码.

(强调我的)。

我将属性文件的编码更改为 ISO-8859-1,一切正常。

【讨论】:

您应该努力始终使用没有 BOM 的 UTF-8。然后,您可以使用 InputStreamReader/OutputStreamWriter 进行操作。使用 Reader/Writer 你可以指定编码。【参考方案2】:

Java 无法正确处理 BOM - 您可以在属性中将其视为键。可以保存文件 UTF-8 但没有 BOM。以 vim 为例

:set nobomb

See vim wiki

【讨论】:

以上是关于为啥 Java 会忽略 .properties 文件的第一行?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 Hibernate 会忽略 package-info.java?

properties配置文件读取操作总结java笔记

为啥Java忽略我的serialVersionUID?

为啥 flyway 会忽略我的 SQL 迁移文件?

为啥 OpenJDK Docker 容器会忽略 Kubernetes 中的内存限制?

java.util.Properties