如何在 Java 中读取属性文件? [复制]
Posted
技术标签:
【中文标题】如何在 Java 中读取属性文件? [复制]【英文标题】:How to read a properties file in Java? [duplicate] 【发布时间】:2011-09-09 01:28:52 【问题描述】:我正在使用 servlet 对数据库连接详细信息进行硬编码,因此如果进行任何更改,我必须重新编译代码。因此,我想使用.properties
文件(我可以稍后修改)并将其用作我的数据库连接的源。
问题是我不知道如何读取属性文件。有人可以帮我阅读文件吗?
【问题讨论】:
尽管您已经在这里阅读了很多内容,但我还是想向您推荐this article,因为它可能会帮助您对如何组织您的财产有一个基本的了解。它已经相当老了,但从那时起 API 并没有太大变化。 相关:***.com/questions/3134581/… 和 ***.com/questions/2161054/… 【参考方案1】:您可以使用java.util.Properties
【讨论】:
但我使用了 Properties 方法,但它抛出 FileNotFound 异常 我的代码:Properties prop = new Properties(); prop.load(new FileInputStream("file.properties")); 你的属性文件需要在类路径中。【参考方案2】:Properties
类有一个方便的load
方法。这是读取 java 属性文件的最简单方法。
【讨论】:
但我使用了 Properties 方法,但它抛出 FileNotFound 异常 我的代码:Properties prop = new Properties(); prop.load(new FileInputStream("file.properties"));【参考方案3】:读取this。通常属性文件保存在类路径中,以便该方法可以读取它。
【讨论】:
【参考方案4】: . . .
// create and load default properties
Properties defaultProps = new Properties();
FileInputStream in = new FileInputStream("defaultProperties");
defaultProps.load(in);
in.close();
// create application properties with default
Properties applicationProps = new Properties(defaultProps);
// now load properties from last invocation
in = new FileInputStream("appProperties");
applicationProps.load(in);
in.close();
. . .
示例来自这里Properties
(Java)
Properties
的方法可以抛出异常。
- 当文件路径无效时 (FileNotFoundException
)。请尝试创建File
对象并检查File
是否存在。
- ...
【讨论】:
但我使用了 Properties 方法,但它抛出 FileNotFound 异常 我的代码:Properties prop = new Properties(); prop.load(new FileInputStream("file.properties")); 您应该先阅读该消息,然后再将答案复制粘贴到各处!【参考方案5】:你可以看看Apache Commons Configuration。使用它,您可以像这样读取属性文件:
Configuration config = new PropertiesConfiguration("user.properties");
String connectionUrl = config.getString("connection.url");
有关文件位置的这些信息可能也很重要:
如果您不指定绝对值 路径,文件将被搜索 自动在下面 地点:
在当前目录中 在用户主目录中 在类路径中
因此,如果在 servlet 中读取属性文件,您应该将属性文件放在类路径中(例如,在 WEB-INF/classes
中)。
您可以在他们的网站上找到更多示例。
【讨论】:
【参考方案6】:InputStream in = Thread.currentThread().getContextClassLoader().getResourceAsStream("my.properties");
Properties p = new Properties();
p.load(in);
in.close();
【讨论】:
【参考方案7】:以下代码将添加一个侦听器,用于检查配置了 dbprops 系统属性的文件。对于每个给定的时间间隔,它将查看文件是否被修改,如果被修改,它将从文件中加载属性。 包 com.servlets;
import java.io.File;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.Timer;
import java.util.TimerTask;
import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
public class DBPropsWatcherListener
implements ServletContextListener
public void contextInitialized(ServletContextEvent event)
ServletContext servletContext = event.getServletContext();
Timer timer = new Timer("ResourceListener");
timer.schedule(new MyWatcherTask(servletContext), 15);
public void contextDestroyed(ServletContextEvent event)
private class MyWatcherTask extends TimerTask
private final ServletContext servletContext;
private long lastModifiedTime = -1;
public MyWatcherTask(ServletContext servletContext)
this.servletContext = servletContext;
public void run()
try
File resourceFile = new File(System.getProperty("dbProps"));
long current = resourceFile.lastModified();
if (current > lastModifiedTime)
java.io.InputStream dbPropsStream = new FileInputStream(resourceFile );
java.util.Properties dbProps = new java.util.Properites();
dbProps.load(dbPropsStream);
realoadDBProps();
lastModifiedTime = current;
catch (MalformedURLException e)
e.printStackTrace();
【讨论】:
【参考方案8】:从属性文件中读取数据库值是个好主意
您可以使用 Util 包中的 properties 类。要记住的重要一点是在读取文件或将文件写入磁盘后关闭流。否则会导致问题。下面是一个示例供您参考:
import java.io.FileInputStream;
import java.io.IOException;
import java.util.Properties;
public class App
public static void main( String[] args )
Properties prop = new Properties();
try
//load a properties file
prop.load(new FileInputStream("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();
输出
localhost
mkyong
password
【讨论】:
【参考方案9】:下面的程序使用键值对读取属性文件显示
File f1 = new File("abcd.properties");
FileReader fin = new FileReader(f1);
Properties pr = new Properties();
pr.load(fin);
Set<String> keys = pr.stringPropertyNames();
Iterator<String> it = keys.iterator();
String key, value;
while (it.hasNext())
key = it.next();
value = pr.getProperty(key);
System.out.println(key+":"+value);
【讨论】:
【参考方案10】:ResourceBundle rb = ResourceBundle.getBundle("mybundle");
String propertyValue = rb.getString("key");
假设 mybundle.properties 文件在类路径中
【讨论】:
【参考方案11】:在 Web 应用程序中读取属性文件的最大问题是您实际上不知道文件的实际路径。所以我们必须使用相对路径,为此我们必须使用各种函数和类,如 getresourceAsStream()、InputStream、FileinputStream 等。
getReourceAsStream 方法在静态和非静态方法中的行为不同.. 您可以通过以下方式做到这一点
非静态
InputStream input = getClass().getClassLoader().getResourceAsStream("config.properties");
静态
InputStream input = ReadPropertyFile.class.getClassLoader().getResourceAsStream("config.properties");
如需完整参考,您可以点击这些链接。
http://www.codingeek.com/java/using-getresourceasstream-in-static-method-reading-property-files
http://www.codingeek.com/java/read-and-write-properties-file-in-java-examples/
【讨论】:
【参考方案12】:如果您的应用程序足够小,只有少数属性来自一个或两个属性文件,那么我建议使用 JDK 自己的 Properties 类,它从文件中加载属性并像您一样使用它使用哈希表。 Properties 类本身继承自 Hashtable。但是,您的应用程序非常大,具有来自不同来源(如属性文件、xml 文件、系统属性)的大量属性,那么我建议使用 Apache commons 配置。它提供了来自不同配置源的属性的统一视图,并允许您为出现在不同源中的常见属性定义覆盖和首选项机制。参考这篇文章http://wilddiary.com/reading-property-file-java-using-apache-commons-configuration/,获取使用公共配置的快速教程。
【讨论】:
【参考方案13】:这可能有效::
Properties prop = new Properties();
FileReader fr = new FileReader(filename);
prop.load(fr);
Set<String> keys = pr.stringPropertyNames();
//now u can get the values from keys.
【讨论】:
以上是关于如何在 Java 中读取属性文件? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
如何在eclipse中从另一个java项目中读取项目的属性文件