用Java读取属性文件
Posted
技术标签:
【中文标题】用Java读取属性文件【英文标题】:Reading Properties file in Java 【发布时间】:2012-01-07 07:22:22 【问题描述】:我有以下代码试图读取属性文件:
Properties prop = new Properties();
ClassLoader loader = Thread.currentThread().getContextClassLoader();
InputStream stream = loader.getResourceAsStream("myProp.properties");
prop.load(stream);
最后一行出现异常。具体来说:
Exception in thread "main" java.lang.NullPointerException
at java.util.Properties$LineReader.readLine(Properties.java:418)
at java.util.Properties.load0(Properties.java:337)
at java.util.Properties.load(Properties.java:325)
at Assignment1.BaseStation.readPropertyFile(BaseStation.java:46)
at Assignment1.BaseStation.main(BaseStation.java:87)
谢谢, 尼科斯
【问题讨论】:
【参考方案1】:我看到这个问题是一个老问题。如果将来有人偶然发现这一点,我认为这是一种简单的方法。 将属性文件保存在您的项目文件夹中。
FileReader reader = new FileReader("Config.properties");
Properties prop = new Properties();
prop.load(reader);
【讨论】:
【参考方案2】:当前的答案都没有显示 InputStream
被关闭(这将泄漏文件描述符),和/或当找不到资源时不处理 .getResourceAsStream()
返回 null (这将导致 @ 987654323@ 带有令人困惑的消息,"inStream parameter is null"
)。您需要以下内容:
String propertiesFilename = "server.properties";
Properties prop = new Properties();
try (var inputStream = getClass().getClassLoader().getResourceAsStream(propertiesFilename))
if (inputStream == null)
throw new FileNotFoundException(propertiesFilename);
prop.load(inputStream);
catch (IOException e)
throw new RuntimeException(
"Could not read " + propertiesFilename + " resource file: " + e);
【讨论】:
【参考方案3】:指定从 src 开始的路径如下:
src/main/resources/myprop.proper
【讨论】:
【参考方案4】:如果您的 config.properties 不在 src/main/resource 目录中并且它在项目的根目录中,那么您需要执行以下操作:-
Properties prop = new Properties();
File configFile = new File(myProp.properties);
InputStream stream = new FileInputStream(configFile);
prop.load(stream);
【讨论】:
【参考方案5】:这里的许多答案描述了危险的方法,它们实例化文件输入流但没有获得对输入流的引用以便稍后关闭流。这会导致悬空输入流和内存泄漏。加载属性的正确方法应该类似于以下:
Properties prop = new Properties();
try(InputStream fis = new FileInputStream("myProp.properties"))
prop.load(fis);
catch(Exception e)
System.out.println("Unable to find the specified properties file");
e.printStackTrace();
return;
注意try-with-resources
块中文件输入流的实例化。由于FileInputStream
是可自动关闭的,因此在退出try-with-resources
块后它将自动关闭。如果要使用简单的try
块,则必须在finally
块中使用fis.close();
显式关闭它。
【讨论】:
【参考方案6】:以原始顺序读取属性文件:
File file = new File("../config/edc.properties");
PropertiesConfiguration config = new PropertiesConfiguration();
PropertiesConfigurationLayout layout = new PropertiesConfigurationLayout(config);
layout.load(new InputStreamReader(new FileInputStream(file)));
for(Object propKey : layout.getKeys())
PropertiesConfiguration propval = layout.getConfiguration();
String value = propval.getProperty((String) propKey).toString();
out.print("Current Key:" + propkey + "Current Value:" + propval + "<br>");
【讨论】:
【参考方案7】:如果您的属性文件路径和您的 java 类路径相同,那么您应该这样做。
例如:
src/myPackage/MyClass.java
src/myPackage/MyFile.properties
Properties prop = new Properties();
InputStream stream = MyClass.class.getResourceAsStream("MyFile.properties");
prop.load(stream);
【讨论】:
【参考方案8】:鉴于应该使用上下文loader.getResourceAsStream("myPackage/myProp.properties")
。
前导 '/'
不适用于 ClassLoader.getResourceAsStream(String)
方法。
您也可以使用Class.getResourceAsStream(String)
方法,该方法使用'/'
来确定路径是绝对路径还是相对于类位置。
示例:
myClass.class.getResourceAsStream("myProp.properties")
myClass.class.getResourceAsStream("/myPackage/myProp.properties")
【讨论】:
【参考方案9】:Properties prop = new Properties();
try
prop.load(new FileInputStream("conf/filename.properties"));
catch (IOException e)
e.printStackTrace();
conf/filename.properties
基于项目根目录
【讨论】:
我的用例是针对 Jenkins 的,所以很高兴有一个不依赖于一堆 ClassPathLoader 恶作剧的解决方案。谢谢!【参考方案10】:你不能像使用 this 关键字 -
props.load(this.getClass().getResourceAsStream("myProps.properties"));
在静态上下文中。
最好的办法是掌握应用程序上下文,例如 -
ApplicationContext context = new ClassPathXmlApplicationContext("classpath:/META-INF/spring/app-context.xml");
然后你可以从类路径加载资源文件 -
//load a properties file from class path, inside static method
prop.load(context.getClassLoader().getResourceAsStream("config.properties"));
这适用于静态和非静态上下文,最好的部分是此属性文件可以位于应用程序类路径中包含的任何包/文件夹中。
【讨论】:
ApplicationContext 仅适用于 Spring 应用程序【参考方案11】:您可以使用ResourceBundle
类来读取属性文件。
ResourceBundle rb = ResourceBundle.getBundle("myProp.properties");
【讨论】:
ResourceBundle rb = ResourceBundle.getBundle("myProp"); 这种方法是recommended for i18n。【参考方案12】:您可以使用java.io.InputStream读取文件,如下所示:
InputStream inputStream = getClass().getClassLoader().getResourceAsStream(myProps.properties);
【讨论】:
如何在java中将InputStream转换为File?我想使用 File API 读取 .properties 文件【参考方案13】:您可以在此页面上找到信息:http://www.mkyong.com/java/java-properties-file-examples/
Properties prop = new Properties();
try
//load a properties file from class path, inside static method
prop.load(App.class.getClassLoader().getResourceAsStream("config.properties"));
//get the property value and print it out
System.out.println(prop.getProperty("database"));
System.out.println(prop.getProperty("dbuser"));
System.out.println(prop.getProperty("dbpassword"));
catch (IOException ex)
ex.printStackTrace();
【讨论】:
别忘了关闭prop.load(reader)
中的Reader
,根据文档:The specified stream remains open after this method returns
该链接中有很多方法。你为什么选择带类加载器的那个?这种方法有什么优点或缺点吗?【参考方案14】:
根据您的异常,InputStream
为空,这意味着类加载器未找到您的属性文件。我猜 myProp.properties 在你的项目的根目录中,如果是这样的话,你需要一个前面的斜杠:
InputStream stream = loader.getResourceAsStream("/myProp.properties");
【讨论】:
我的文件层次结构是:src -> myPackage -> myClass.java , myProp.properties。我按照你的建议做了,但它仍然抛出同样的异常getResourceAsStream
在类路径中搜索文件。如果你的properties文件在myPackage
的包目录下,则使用/myPackage/myProp.properties
作为路径。
@Mark Elliot 如果我有一个 conf
包来存储我的所有配置文件并且我的文件层次结构是:myproject ->src, conf, test
,我将如何通过添加前面的斜杠来加载属性?
【参考方案15】:
您的文件应该在类路径中以com/example/foo/myProps.properties
的形式提供。然后将其加载为:
props.load(this.getClass().getResourceAsStream("myProps.properties"));
【讨论】:
【参考方案16】:确保文件名正确并且文件实际上在类路径中。如果不是这种情况导致最后一行抛出异常,getResourceAsStream()
将返回 null。
如果 myProp.properties 位于项目的根目录中,请改用/myProp.properties
。
【讨论】:
我的文件层次结构是:src -> myPackage -> myClass.java , myProp.properties。我按照你的建议做了,但它仍然抛出同样的异常 由于您的属性文件不在项目的根目录中,因此您不需要前导斜杠。 我在没有前导斜杠的情况下首先抛出异常。它仍然无法正常工作。以上是关于用Java读取属性文件的主要内容,如果未能解决你的问题,请参考以下文章
java 如何读取jar包外的properties文件(转)
java程序运行,用输入输出流读取c盘中的一个文件读取不到提示FileNotFoundException