【问题标题】:How to read a properties file in Java? [duplicate]如何在 Java 中读取属性文件? [复制]
【发布时间】:2011-09-09 01:28:52
【问题描述】:

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

问题是我不知道如何读取属性文件。有人可以帮我阅读文件吗?

【问题讨论】:

标签: java file servlets


【解决方案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 方法在静态和非静态方法中的行为不同.. 您可以通过以下方式做到这一点

                1. 非静态

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

                2. 静态

                  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.
                    

                    【讨论】:

                      猜你喜欢
                      • 2017-03-01
                      • 1970-01-01
                      • 1970-01-01
                      • 2018-05-31
                      • 2011-03-10
                      • 2020-02-03
                      • 2012-01-21
                      • 1970-01-01
                      • 1970-01-01
                      相关资源
                      最近更新 更多