如何在Java中读取属性文件?

时间:2011-06-06 06:31:10

标签: java file servlets

我正在使用servlet来硬编码数据库连接细节,所以如果进行任何更改,我必须重新编译代码。所以我想使用.properties文件(我稍后可以修改)并将其用作数据库连接的源。

问题是我不知道如何阅读属性文件。有人可以帮我看一下这个文件吗?

13 个答案:

答案 0 :(得分:7)

   . . .
   // 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是否存在。 - ......

答案 1 :(得分:5)

您可以查看Apache Commons Configuration。使用它你可以读取属性文件:

Configuration config = new PropertiesConfiguration("user.properties");
String connectionUrl = config.getString("connection.url");

有关文件位置的信息可能也很重要:

  

如果您没有指定绝对值   路径,将搜索文件   自动在下面   位置:

     
      
  • 在当前目录中
  •   
  • 在用户主目录中
  •   
  • 在类路径中
  •   

因此,如果在servlet中读取属性文件,则应将属性文件放在类路径中(例如,在WEB-INF/classes中)。

您可以在他们的网站上找到更多示例。

答案 2 :(得分:3)

您可以使用java.util.Properties

答案 3 :(得分:3)

在Web应用程序中读取属性文件的最大问题是您实际上不知道文件的actaul路径。所以我们必须使用相对路径,因此我们必须使用各种函数和类,如getresourceAsStream(),InputStream,FileinputStream等。

方法getReourceAsStream在静态和非静态方法中的行为有所不同。 你可以用以下方式做到这一点

  1. 非静态

    InputStream input = getClass().getClassLoader().getResourceAsStream("config.properties");

  2. <强>静态

    InputStream input = ReadPropertyFile.class.getClassLoader().getResourceAsStream("config.properties");

  3. 如需完整参考,请点击以下链接..

    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/

答案 4 :(得分:2)

InputStream in = Thread.currentThread().getContextClassLoader().getResourceAsStream("my.properties");
Properties p = new Properties();
p.load(in);
in.close();

答案 5 :(得分:2)

下面的代码将添加一个Listener,用于检查使用dbprops system属性配置的文件。对于每个给定的间隔,它将查看文件是否被修改,如果它被修改,它将从文件加载属性。     包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();
    }

}
}
}

答案 6 :(得分:2)

在程序下面,使用键值对

读取属性文件显示
                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);
                    }

            }

答案 7 :(得分:2)

如果您的应用程序足够小,只有少数属性来自一个或两个属性文件,那么我建议使用JDK自己的Properties类,它从文件加载属性并像使用它一样使用它使用哈希表。属性类本身继承自Hashtable。但是,你的应用程序非常庞大,来自不同来源的大量属性,如属性文件,xml文件,系统属性,我建议使用Apache commons配置。它提供了来自不同配置源的属性的统一视图,并允许您为出现在不同源中的公共属性定义覆盖和首选项机制。请参阅本文http://wilddiary.com/reading-property-file-java-using-apache-commons-configuration/以获取有关使用commons配置的快速教程。

答案 8 :(得分:2)

这可能有效::

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.

答案 9 :(得分:1)

Properties类有一个方便的load方法。这是读取java属性文件的最简单方法。

答案 10 :(得分:1)

从属性文件

中读取数据库值是个好主意

您可以使用Util包中的属性类。要记住的重要一点是在读取文件或将文件写入磁盘后关闭流。否则会引起问题。以下是供您参考的示例:

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

答案 11 :(得分:1)

ResourceBundle rb = ResourceBundle.getBundle("mybundle");
String propertyValue = rb.getString("key");

假设mybundle.properties文件在classpath

答案 12 :(得分:0)

阅读this。通常,属性文件保存在类路径中,以便此方法可以读取它。