用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 -&gt;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文件(转)

用C#读取XML文件,怎么可以循环读取

java程序运行,用输入输出流读取c盘中的一个文件读取不到提示FileNotFoundException

用DELPHI写一个代码,将EXCEL文件读取成TXT文本

java中如何读取xml中数据。多节点的。给我一个例子,谢谢。

从excel表格读取数据用Java代码实现批量上传写入数据库