<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    何以解憂?唯有Java

    其實程序員也懂得浪漫!
    posts - 90, comments - 637, trackbacks - 0, articles - 2
      BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理
        最近在重構自己的小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


    評論

    # re: 關于java 讀取propterties 文件的疑惑 和問題的解決  回復  更多評論   

    2008-10-03 21:38 by 隔葉黃鶯
    關鍵是 ClassLoader 的問題,不同的環境可能不同的類加載器層次,比如單獨應用程序跑得好好的,一放到 Tomcat 就不那么回事了。

    比如你用 Object.class 作為參照就會有這樣的問題,如果以 DataSource.class 作參照,基本能保證 DataSource.class 是最低層加載器加載的,所以能夠一致。

    可以看看 Hibernate 的 org.hibernate.util.ConfigHelper 是怎么在不同環境中找到配置文件的。它依據了 Thread.currentThread().contextClassLoader 來定位配置文件的。

    # re: 關于java 讀取propterties 文件的疑惑 和問題的解決  回復  更多評論   

    2008-10-03 21:46 by 免費小說
    老板用的什么IDE

    # re: 關于java 讀取propterties 文件的疑惑 和問題的解決  回復  更多評論   

    2008-10-03 21:54 by 日月雨林@gmail.com
    @隔葉黃鶯
    謝謝您的回復,有空我會去看的。因為我還沒有用過Hibernate 。呵呵
    我覺得Javaworld 上的那篇文章不錯。

    # re: 關于java 讀取propterties 文件的疑惑 和問題的解決  回復  更多評論   

    2008-10-03 21:55 by 日月雨林@gmail.com
    @免費小說
    我的在文章中說了啊,我用的是NetBeans IDE ,
    還有我不是什么“老板” 哦

    # re: 關于java 讀取propterties 文件的疑惑 和問題的解決[未登錄]  回復  更多評論   

    2008-10-07 11:05 by Matthew
    轉載了,謝謝
    http://blog.csdn.net/djsl6071/archive/2008/10/07/3026735.aspx

    # re: 關于java 讀取propterties 文件的疑惑 和問題的解決[未登錄]  回復  更多評論   

    2008-10-20 15:24 by Joe
    看不懂DataSource類中的getConnection()方法在這里有什么作用,請解釋一下,謝謝```````````````````

    # re: 關于java 讀取propterties 文件的疑惑 和問題的解決  回復  更多評論   

    2008-10-20 15:40 by 日月雨林@gmail.com
    @Joe
    這個方法不是有注釋嗎?

    "如果連接為空則建立一個新連接"

    # re: 關于java 讀取propterties 文件的疑惑 和問題的解決[未登錄]  回復  更多評論   

    2008-10-20 15:58 by Joe
    哦。這個getConnection()方法是在其他類里被調用的。我剛才是看這個方法都沒在這里用到,所以有點不解

    # re: 關于java 讀取propterties 文件的疑惑 和問題的解決[未登錄]  回復  更多評論   

    2008-11-08 19:16 by Java愛好者
    樓主:
    你看我的代碼怎么可以用呢。FileInputStream和Properties。你的屬性文件所在位置不對的問題。

    Properties pros = new Properties();
    fis = new FileInputStream("dbconnection.properties");
    pros.load(fis);
    driver=pros.getProperty("driver");
    url=pros.getProperty("db_url");
    name=pros.getProperty("user");
    password=pros.getProperty("password");
    其中屬性文件位于項目的根目錄下,和src同級就可以了。我試驗了沒有問題。沒有你說的那么麻煩吧。?
    我使用的Netbeans6.0.1 中文版

    # re: 關于java 讀取propterties 文件的疑惑 和問題的解決  回復  更多評論   

    2009-06-08 08:01 by absolutej
    讀屬性文件的時候,我以前會以一個同意的文件夾來存,但是那樣在以后項目發布的時候會報FileNotFoundException之類的異常,參考朋友的建議后,以后直接把properties文件跟調用類的文件放在一起,用調用類文件的Class文件自身來調用
    Object.Class.getResourceAsStream("*.properties"),這樣用一直滿好的!

    # re: 關于java 讀取propterties 文件的疑惑 和問題的解決[未登錄]  回復  更多評論   

    2009-06-08 18:02 by absolutej
    樓主,什么是單子設計模式,是不是單體設計模式?
    假如是SingleTon模式的話,你這段代碼,我真的沒有看出了,請指教下?

    /**
    *一個單子設計模式數據庫連接
    * @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);
    }

    }



    }

    # re: 關于java 讀取propterties 文件的疑惑 和問題的解決[未登錄]  回復  更多評論   

    2009-06-08 18:04 by absolutej
    呵呵,是singleton模式,體現在這一段代碼
    /**
    *如果連接為空則建立一個新連接
    * @return
    */
    public static Connection getConnection() throws IOException {
    if (conn == null) {
    new DataSource();
    }
    return conn;
    }
    主站蜘蛛池模板: 黄色免费网站网址| 高清永久免费观看| 亚洲中文无码亚洲人成影院| 亚洲精品美女在线观看| 夜夜亚洲天天久久| 亚洲福利电影在线观看| 亚洲精品熟女国产| 亚洲一区二区三区亚瑟| 亚洲妇女熟BBW| 亚洲爆乳成av人在线视菜奈实| 亚洲一区二区三区高清在线观看 | 男女交性永久免费视频播放| 成年免费大片黄在线观看岛国 | 成年网站免费入口在线观看| 一本久久免费视频| 99精品视频免费| 久久99热精品免费观看牛牛| 精品无码无人网站免费视频| 我们的2018在线观看免费高清 | 黄网站色视频免费在线观看的a站最新 | 国产亚洲欧洲Aⅴ综合一区 | 亚洲热妇无码AV在线播放| 亚洲国产成人精品无码区在线观看| 亚洲AV无码一区二区二三区软件 | 中文字幕亚洲一区| 亚洲AV日韩AV天堂一区二区三区| 亚洲视频在线观看网站| 日韩亚洲国产综合高清| 曰批免费视频播放在线看片二| 男女一进一出抽搐免费视频| 在线免费观看国产| 四虎成人免费观看在线网址 | 久久久久久精品免费看SSS| 成年女人男人免费视频播放 | 亚洲毛片在线免费观看| 成年男女免费视频网站| 亚洲午夜国产片在线观看| 亚洲欧洲在线观看| 亚洲女女女同性video| 久久嫩草影院免费看夜色| 999国内精品永久免费观看|