<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 :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理
        最近在重構(gòu)自己的小Demo 想把自己的下Demo 變成可以配置的程序。但是遇到了一些困難,走了不少的彎路,最終還是解決了。 如果你是個牛人,你不用看了,寫這些東西是給和我一樣的菜鳥看的。
    先說說我的Demo吧,我寫的是一個簡單新聞管理系統(tǒng),很簡陋的那種,不過麻雀雖小,但是五臟俱全。
    基本的增、刪、查、改,都有,用到了FCKeditor。一開始我連接數(shù)據(jù)庫用的是最原始的方法,把數(shù)據(jù)庫的連接信息全寫在代碼里,寫完以后就沒去管他了,十一放假這幾天,看了看自己的代碼,覺得代碼結(jié)果不好,于是就開始重構(gòu)自己的代碼,首先就是重寫數(shù)據(jù)庫的連接管理我把連接數(shù)據(jù)庫的一些基本信息寫到了database.properties 文件里,然后從程序中讀取連接數(shù)據(jù)庫所需要的信息。但是看似簡單的東西,比且很容易的完成的工作,我卻遇到了不少麻煩。首先就是路徑的問題,其次是該以何種方式讀取;就這兩個問題困擾了兩天。(呵呵,見笑了

    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;

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

    我的文件包結(jié)構(gòu):


    第一個要說的是:FileInputStream in = new FileInputStream("database.properties");
    網(wǎng)上有很多人說這條語句是從當(dāng)前目錄中加載database.properties文件的,但是我得出的結(jié)果是:它是從classpath 中加載database.properties文件的
    因為我用的是IDE 是NetBeans 我以為直接放在當(dāng)前包內(nèi)就可以了,但是我發(fā)現(xiàn)這樣不行。具體放哪里我也不知道,后來用了另一種方法:

    InputStream in = Object.class.getResourceAsStream("/org/news/comm/database.properties")
    基本上是可以用了,一開始測試的時候還挺開心的。很順利的就通過了,但是當(dāng)我真正運(yùn)行項目的時候問題又來了,程序報了 空指針引用 錯誤。我就很納悶了為什么在單個文件里測試可以很容易的通過,一運(yùn)行項目就會報錯呢?于是開始Debug,不Debug 不知道,一用嚇一跳:
    InputStream in = Object.class.getResourceAsStream("/org/news/comm/database.properties")

    in的值竟然是空的,難怪會報空指針錯誤了。單獨測試DataSource.java文件的時候運(yùn)行正常啊,沒有報錯,in 也有值,但是為什么運(yùn)行項目的時候又沒有值了呢?很是不解。

    于是我google 了一把,最后看現(xiàn)了幾篇好文章 說的是如何讀取 propterties 文件。最終我發(fā)現(xiàn)用第二種
    方法是有弊端的,關(guān)鍵就在Object 上,它所有類的父類,在單個文件中用他來讀取propterties文件還可以但是一運(yùn)行項目,他就不起作用了,也不知道為什么。難道是java 的bug??或者說是NetBeans的bug??
    我同樣的Eclipse 下測試過,結(jié)果是一樣的。

    最后我將輸入流語句稍微改了一下,變成下面的樣子:
    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

    總結(jié)一下讀取propterties文件方法的不同:(JavaWorld里的內(nèi)容,呵呵拿來用一下)

    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: 關(guān)于java 讀取propterties 文件的疑惑 和問題的解決  回復(fù)  更多評論   

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

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

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

    # re: 關(guān)于java 讀取propterties 文件的疑惑 和問題的解決  回復(fù)  更多評論   

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

    # re: 關(guān)于java 讀取propterties 文件的疑惑 和問題的解決  回復(fù)  更多評論   

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

    # re: 關(guān)于java 讀取propterties 文件的疑惑 和問題的解決  回復(fù)  更多評論   

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

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

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

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

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

    # re: 關(guān)于java 讀取propterties 文件的疑惑 和問題的解決  回復(fù)  更多評論   

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

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

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

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

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

    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: 關(guān)于java 讀取propterties 文件的疑惑 和問題的解決  回復(fù)  更多評論   

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

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

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

    /**
    *一個單子設(shè)計模式數(shù)據(jù)庫連接
    * @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: 關(guān)于java 讀取propterties 文件的疑惑 和問題的解決[未登錄]  回復(fù)  更多評論   

    2009-06-08 18:04 by absolutej
    呵呵,是singleton模式,體現(xiàn)在這一段代碼
    /**
    *如果連接為空則建立一個新連接
    * @return
    */
    public static Connection getConnection() throws IOException {
    if (conn == null) {
    new DataSource();
    }
    return conn;
    }
    主站蜘蛛池模板: 国产午夜影视大全免费观看| 永久免费AV无码国产网站| 亚洲Av无码乱码在线znlu| 亚洲狠狠婷婷综合久久蜜芽| 成人免费视频一区二区三区| 亚洲制服在线观看| 少妇高潮太爽了在线观看免费| 亚洲av日韩av综合| 午夜免费福利在线| 老司机福利在线免费观看| 日韩高清在线高清免费| 国产精品手机在线亚洲| 免费v片在线观看品善网| 亚洲AV成人无码久久WWW| 国产乱子伦片免费观看中字| 青青久久精品国产免费看| 亚洲欧洲久久av| 在线涩涩免费观看国产精品| 亚洲一区二区在线视频| 一二三四免费观看在线电影| 亚洲精品无码高潮喷水A片软| 免费永久看黄在线观看app| 国产福利电影一区二区三区,免费久久久久久久精| 亚洲精品国产自在久久 | 国产99久久久久久免费看| 久久久无码精品亚洲日韩软件| 国产午夜精品免费一区二区三区| 亚洲卡一卡2卡三卡4卡无卡三| 在线观看视频免费完整版| 免费一级毛片在线播放视频免费观看永久| 久久精品国产亚洲5555| 美女内射毛片在线看免费人动物| 亚洲午夜无码久久久久小说| 亚洲区小说区图片区| 最近免费中文字幕高清大全 | 亚洲国产欧美国产综合一区 | 亚洲男人天堂2022| 亚洲国产婷婷香蕉久久久久久| 亚洲免费在线视频| 亚洲熟妇无码八V在线播放| 国产亚洲一区二区三区在线不卡|