`
djsl6071
  • 浏览: 593400 次
  • 性别: Icon_minigender_1
  • 来自: 厦门
社区版块
存档分类
最新评论

关于java 读取propterties 文件的疑惑 和问题的解决[转载]

阅读更多

转载: http://www.blogjava.net/gml520/archive/2008/10/03/232245.html 

 

   最近在重构自己的小Demo 想把自己的下Demo 变成可以配置的程序。但是遇到了一些困难,走了不少的弯路,最终还是解决了。 如果你是个牛人,你不用看了,写这些东西是给和我一样的菜鸟看的。
先说说我的Demo吧,我写的是一个简单新闻管理系统,很简陋的那种,不过麻雀虽小,但是五脏俱全。
基本的增、删、查、改,都有,用到了FCKeditor。一开始我连接数据库用的是最原始的方法,把数据库的连接信息全写在代码里,写完以后就没去管他了,十一放假这几天,看了看自己的代码,觉得代码结果不好,于是就开始重构自己的代码,首先就是重写数据库的连接管理我把连接数据库的一些基本信息写到了database.properties 文件里,然后从程序中读取连接数据库所需要的信息。但是看似简单的东西,比且很容易的完成的工作,我却遇到了不少麻烦。首先就是路径的问题,其次是该以何种方式读取;就这两个问题困扰了两天。(呵呵,见笑了

java读取propterties文件有三种方法:

<!---->  ClassLoader.getResourceAsStream ("some/pkg/resource.properties");
  Class.getResourceAsStream (
"/some/pkg/resource.properties");
  ResourceBundle.getBundle (
"some.pkg.resource");
注意括号中代码的不同。

    先让大家看一段代码吧:
DataSource.java 文件:
<!---->import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Properties;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *一个单子设计模式数据库连接
 * 
@author guanminglin
 
*/
public class DataSource {

    
public static Connection conn;

    
public DataSource() throws IOException {
        {
            
try {

                Properties props 
= new Properties();
                
//一定要用DataSource 
                InputStream in = DataSource.class.getResourceAsStream("/org/news/comm/database.properties");

                
//原先试过这下面两种方法,但是都不行
                
//FileInputStream in = new FileInputStream("database.properties");
                //InputStream in = Object.class.getResourceAsStream("/org/news/comm/database.properties")

                //下面两行是用来测试的
                String s 
= in.toString();
                System.out.println(
"s=="+s);
                
                props.load(in);
                in.close();
                String drivers 
= props.getProperty("jdbc.drivers");
                String url 
= props.getProperty("jdbc.url");
                String username 
= props.getProperty("jdbc.username");
                String password 
= props.getProperty("jdbc.password");
                Class.forName(drivers);
                conn 
= DriverManager.getConnection(url, username, password);
                in.close();
            } 
catch (SQLException ex) {
                Logger.getLogger(DataSource.
class.getName()).log(Level.SEVERE, null, ex);
            } 
catch (ClassNotFoundException ex) {
                Logger.getLogger(DataSource.
class.getName()).log(Level.SEVERE, null, ex);
            }

        }



    }
   

    
/**
     *如果连接为空则建立一个新连接
     * 
@return
     
*/
    
public static Connection getConnection() throws IOException {
        
if (conn == null) {
            
new DataSource();
        }
        
return conn;
    }
    
public void test(){
        String str 
= new String();
        

    }

    
public static void main(String[] args) throws IOException {
        
// TODO code application logic here
        //用于测试
        new DataSource();
        System.out.print(conn);
    }
}

我的文件包结构:


第一个要说的是:FileInputStream in = new FileInputStream("database.properties");
网上有很多人说这条语句是从当前目录中加载database.properties文件的,但是我得出的结果是:它是从classpath 中加载database.properties文件的
因为我用的是IDE 是NetBeans 我以为直接放在当前包内就可以了,但是我发现这样不行。具体放哪里我也不知道,后来用了另一种方法:

InputStream in = Object.class.getResourceAsStream("/org/news/comm/database.properties")
基本上是可以用了,一开始测试的时候还挺开心的。很顺利的就通过了,但是当我真正运行项目的时候问题又来了,程序报了 空指针引用 错误。我就很纳闷了为什么在单个文件里测试可以很容易的通过,一运行项目就会报错呢?于是开始Debug,不Debug 不知道,一用吓一跳:
InputStream in = Object.class.getResourceAsStream("/org/news/comm/database.properties")

in的值竟然是空的,难怪会报空指针错误了。单独测试DataSource.java文件的时候运行正常啊,没有报错,in 也有值,但是为什么运行项目的时候又没有值了呢?很是不解。

于是我google 了一把,最后看现了几篇好文章 说的是如何读取 propterties 文件。最终我发现用第二种
方法是有弊端的,关键就在Object 上,它所有类的父类,在单个文件中用他来读取propterties文件还可以但是一运行项目,他就不起作用了,也不知道为什么。难道是java 的bug??或者说是NetBeans的bug??
我同样的Eclipse 下测试过,结果是一样的。

最后我将输入流语句稍微改了一下,变成下面的样子:
InputStream in = DataSource.class.getResourceAsStream("/org/news/comm/database.properties")

其实就是改个类名而已,让他自身去定位propterties文件,就解决问题了。(注意括号中红色的部分,org前面的 "/" 绝对不能少,要不然会报错的。
无论是测试单文件还是,测试整个项目都没问题了。(那个高兴啊

database.propterties 文件很简单:
<!---->jdbc.drivers = com.mysql.jdbc.Driver
jdbc.url 
= jdbc:mysql://localhost:3306/news
jdbc.username = root
jdbc.password 
= root

总结一下读取propterties文件方法的不同:(JavaWorld里的内容,呵呵拿来用一下)

Behavioral differences

Method Parameter format Lookup failure behavior Usage example
ClassLoader.
getResourceAsStream()
"/"-separated names; no leading "/" (all names are absolute) Silent (returns null) this.getClass().getClassLoader()
.getResourceAsStream
("some/pkg/resource.properties")
Class.
getResourceAsStream()
"/"-separated names; leading "/" indicates absolute names; all other names are relative to the class's package Silent (returns null) this.getClass()
.getResourceAsStream
("resource.properties")
ResourceBundle.
getBundle()
"."-separated names; all names are absolute; .properties suffix is implied Throws unchecked
java.util.MissingResourceException
ResourceBundle.getBundle
("some.pkg.resource")


推荐给大家一篇JavaWorld里面好的文章,里面讲述使用不同方式读出propterties文件的方式,以及他们之间的不同:Smartly load your properties
分享到:
评论
1 楼 zhongxinhu 2010-09-30  
谢谢,刚好在你这里找到答案!

相关推荐

    java读取txt文件乱码解决方案

    java读取txt文件乱码解决方案java读取txt文件乱码解决方案java读取txt文件乱码解决方案java读取txt文件乱码解决方案java读取txt文件乱码解决方案java读取txt文件乱码解决方案java读取txt文件乱码解决方案java读取txt...

    java读取文件方法大全

    根据给定的文件信息,我们可以总结出一系列关于Java中读取文件的方法,这些方法涵盖了不同层次的数据读取,包括字节、字符以及行级别的读取。以下是对这些知识点的详细阐述: ### Java读取文件方法大全:读取File流...

    Java读取大文件的处理

    Java读取大文件的处理是Java编程中的一项重要技术,特别是在处理大文件时需要注意性能和响应速度。下面我们将对Java读取大文件的处理技术进行详细的介绍。 标题解释 Java读取大文件的处理是指使用Java语言来读取大...

    java 读取文件 文件读取操作

    当处理包含文本数据的文件时,通常使用`java.io.InputStreamReader`和`java.io.Reader`类按字符读取。这样可以处理字符编码问题,例如UTF-8。以下是如何按字符读取文件的例子: ```java Reader reader = new ...

    java读取txt文件内容(java快速读取,程序已调试通)

    java读取txt文件,可以以文件路径构造这个流,:FileInputStream fin = new FileInputStream("d:/test.txt"); 然后使用这个流直接读取到文件,再使用reader构造BufferedReader,按行读取一整行的文本,作为字符串返回...

    Java读取TIFF文件

    本篇文章将深入探讨如何使用Java来读取TIFF文件,并获取其尺寸——即图像的宽度(长)和高度。 在Java中,处理TIFF文件通常需要借助第三方库,因为Java的标准API(如`java.awt.image.BufferedImage`)并不直接支持...

    java读取shp文件代码

    ### Java读取SHP文件及DBF属性的关键技术解析 #### 概述 在地理信息系统(GIS)领域,Shapefile是一种常见的矢量数据格式,用于存储地理位置信息及相关属性数据。一个完整的Shapefile由多个文件组成,包括.shp、....

    JAVA实现远程文件读取

    JAVA实现远程文件读取 JAVA是一种广泛应用于软件开发的编程语言,随着网络技术的发展,JAVA也提供了许多支持...JAVA实现远程文件读取技术可以广泛应用于各种文件共享和文件传输场景,提高了文件处理的效率和灵活性。

    java读取配置文件

    在Java编程中,读取配置文件是常见的任务,特别是在开发需要灵活配置的系统时。配置文件通常用于存储应用程序的设置,如数据库连接信息、服务器端口、第三方服务的API密钥等,这些信息可能需要根据不同的环境或需求...

    完美解决java读取excel内存溢出问题.rar

    总结来说,解决Java读取Excel内存溢出问题,关键在于合理利用资源、优化代码逻辑以及选择适合的API,如Apache POI的SXSSF。通过这些方法,我们可以在不显著增加系统资源负担的情况下,高效地处理大Excel文件。

    java读取pdf文件属性

    在IT领域,特别是Java编程中,读取PDF文件的元数据是一项常见的需求,尤其是在文档管理、内容管理系统或任何...通过上述步骤和注意事项,你就可以使用Java有效地读取PDF文件的属性,为你的应用增添更多的功能和价值。

    java读取excel文件

    下面将详细介绍 Java 读取 Excel 文件的过程和相关知识点。 Java 读取 Excel 文件的步骤 1. 导入所需的包:在 Java 项目中,需要导入相关的包,例如 `java.io.File`、`java.io.FileInputStream`、`java.io....

    java读写csv文件,中文乱码问题

    解决Java读取CSV文件中文乱码问题的步骤如下: 1. **指定字符编码**:在使用`BufferedReader`或者`FileReader`读取文件时,应明确指定编码。例如,使用`InputStreamReader`构造函数可以传入编码类型,如`new ...

    java中读取shp文件数据存入数据库

    shp文件:地理信息系统,也被称作GIS,它主要的扩展类型是SHAPEFILE (.SHP),一个包含了矢量地理空间数据的流行文件格式,描述了几何形态,点,线和多边形...该方法通过java代码实现将shp文件的数据读取以及存入数据库

    java读取*.mdb文件数据

    在提供的压缩包中,有一个名为"ucanaccess-2.0.9.2.jar"的文件,这是UCanAccess驱动,它是一个开源的Java库,允许Java应用程序直接操作.MDB和.ACCDB格式的Access数据库,而无需安装任何Microsoft软件。要使用这个...

    java读取本地.db文件实例

    在Java编程中,读取本地SQLite数据库(.db文件)是一项常见的任务,特别是在移动应用开发或者需要离线存储数据的场景下。SQLite是一种轻量级的、开源的关系型数据库,它不需要单独的服务器进程,可以直接在应用程序...

    Java保存与读取文件.rar

    Java保存与读取文件代码示例,super("存储与读取对象"); //调用父类构造函数  Container container=getContentPane(); //得到容器  Icon imageIcon=new ImageIcon("image.gif"); //实例化一个图标  ...

    Java读取TXT文件.txt

    以上就是从提供的代码片段中提取出的关于如何用Java读取TXT文件的主要知识点。这些知识点涵盖了基本的文件读取流程,包括文件流的创建、数据的读取与转换、异常处理等关键步骤。掌握这些知识点对于理解和编写类似的...

    彻底解决JAVA读取写入 TXT中文乱码问题 源码

    在Java编程中,读取和写入TXT文件时,经常遇到中文乱码的问题。这是因为Java默认的字符编码可能与TXT文件的实际编码不一致,导致字符无法正确解析。本篇文章将深入探讨这个问题,并提供完整的源码解决方案。 首先,...

    java 读取PDF文件中的内容

    在Java编程环境中,读取PDF文件中的内容是一个常见的任务,特别是在处理文档自动化或者数据分析时。PDF(Portable Document Format)是一种跨平台的文件格式,用于精确地保留文档的格式和内容。下面将详细介绍如何...

Global site tag (gtag.js) - Google Analytics