java讀取.properties文件及文件複製(通道)


1、使用java.util.Properties類的load()方法 示例:

Java代碼  收藏代碼
  1. InputStream in = new BufferedInputStream(new FileInputStream(name));   
  2. Properties p = new Properties();   
  3. p.load(in); 
  4. in.close()   // 任何輸入輸出流都需要 .close()


2、使用java.util.ResourceBundle類的getBundle()方法
示例:
Java代碼  收藏代碼
  1. ResourceBundle rb = ResourceBundle.getBundle(name, Locale.getDefault());   


用ResourceBundle讀取.properties文件可避免路徑問題
            我在jar裏讀取.properties文件時,總是找不到文件路徑,後來用ResourceBundle讀取.properties文件即可避免路徑問題,代碼如下:
    

//process爲文件名,切記不要加 .properties, URL是文件裏的鍵名
Java代碼  收藏代碼
  1.     ResourceBundle bundle = ResourceBundle.getBundle("com.ihandy.smsoc.app.process");  
  2.    String s = bundle.getString("URL");  
  3. System.out.println(s);  
  4. pURL = s;  



3、使用java.util.PropertyResourceBundle類的構造函數
示例:
Java代碼  收藏代碼
  1. InputStream in = new BufferedInputStream(new FileInputStream(name));   
  2. ResourceBundle rb = new PropertyResourceBundle(in);   


4、使用class變量的getResourceAsStream()方法
示例:

Java代碼  收藏代碼
  1. InputStream in = 類名.class.getResourceAsStream(name);   
  2. Properties p = new Properties();   
  3. p.load(in);   

5、使用class.getClassLoader()所得到的java.lang.ClassLoader的getResourceAsStream()方法示例:
Java代碼  收藏代碼
  1. InputStream in = 類名.class.getClassLoader().getResourceAsStream(name);   
  2. Properties p = new Properties();   
  3. p.load(in);   


6、使用java.lang.ClassLoader類的getSystemResourceAsStream()靜態方法示例:
Java代碼  收藏代碼
  1. InputStream in = ClassLoader.getSystemResourceAsStream(name);   
  2. Properties p = new Properties();   
  3. p.load(in);   


7、Servlet中可以使用javax.servlet.ServletContext的getResourceAsStream()方法示例:
Java代碼  收藏代碼
  1. InputStream in = context.getResourceAsStream(path);   
  2. Properties p = new Properties();   
  3. p.load(in);  


下面展示一個數據連接從properties文件中配置信息例子:

Java代碼  收藏代碼

             package com.web.connection;

  1. 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;

    public class Conn {
        private String fileName="/db.properties";//這裏是指放在classes下,如果有包的話,前面加包名即可。例:/com/web/db.properties
        private String driver = "";
        private String url = "";
        private String username ="";
        private String password = "";
        Connection conn=null;
        

        public  Connection  getConn(){
            Properties p = new Properties();
            try {
                InputStream in = Conn.class.getResourceAsStream(fileName);//這裏有人用new FileInputStream(fileName),不過這種方式找不到配置文件。有人說是在classes下,我調過了,不行。
                p.load(in);
                in.close();
                if(p.containsKey("driver")){
                    this.driver = p.getProperty("driver");
                }
                if(p.containsKey("url")){
                    this.url = p.getProperty("url");
                }
                if(p.containsKey("user")){
                    this.username = p.getProperty("user");
                }
                if(p.containsKey("password")){
                    this.password = p.getProperty("password");
                }
            } catch (IOException ex) {
                Logger.getLogger(Conn.class.getName()).log(Level.SEVERE, null, ex);
            }
            System.out.println(p.getProperty("driver"));
           try {
                Class.forName(this.driver);
                conn = DriverManager.getConnection(this.url,this.username,this.password);
            } catch (SQLException ex) {
                ex.printStackTrace();
                System.out.print("獲取連接異常");
            } catch (ClassNotFoundException ex) {
                System.out.print("加載驅動出錯");
                ex.printStackTrace();;
            }
            return conn;
        }
    }
 

     一個從一個文件(inFile)copy到另一個文件(outFile)

第一種方案:

           File inFile= new File("***");

           File outFile= new File("***");

            BufferedInputStream  in  = new BufferedInputStream(new FileInputStream(inFile));
            BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(outFile));
            int c;
            while ((c = in.read()) != -1)
               out.write(c);
            in.close();
            out.close();

 第二種方案:  使用快速通道  提高大文件複製的效率

  1. 用文件通道的方式來進行文件複製

        /**

        * 使用文件通道的方式複製文件

        * @param s          源文件

        * @param t         複製到的新文件

        */

        public void fileChannelCopy(File s, File t) {

            FileInputStream fi = null;

            FileOutputStream fo = null;

            FileChannel in = null;

            FileChannel out = null;

            try {

                fi = new FileInputStream(s);

                fo = new FileOutputStream(t);

                in = fi.getChannel();//得到對應的文件通道

                out = fo.getChannel();//得到對應的文件通道

                in.transferTo(0, in.size(), out);//連接兩個通道,並且從in通道讀取,然後寫入out通道

            } catch (IOException e) {

                e.printStackTrace();

            } finally {

                try {

                    fi.close();

                    in.close();

                    fo.close();

                    out.close();

                } catch (IOException e) {

                    e.printStackTrace();

                }

            }

        }

   //

通道跟緩存

讀取文件

第一步是獲取通道。我們從 FileInputStream 獲取通道:

FileInputStream fin = new FileInputStream( "readandshow.txt" );
FileChannel fc = fin.getChannel();

下一步是創建緩衝區:

ByteBuffer buffer = ByteBuffer.allocate( 1024 );

最後,需要將數據從通道讀到緩衝區中,如下所示:

fc.read( buffer );

您會注意到,我們不需要告訴通道要讀 多少數據 到緩衝區中。每一個緩衝區都有複雜的內部統計機制,它會跟蹤已經讀了多少數據以及還有多少空間可以容納更多的數據。我們將在 緩衝區內部細節 中介紹更多關於緩衝區統計機制的內容。

寫入文件

在 NIO 中寫入文件類似於從文件中讀取。首先從 FileOutputStream 獲取一個通道:

FileOutputStream fout = new FileOutputStream( "writesomebytes.txt" );
FileChannel fc = fout.getChannel();

下一步是創建一個緩衝區並在其中放入一些數據 - 在這裏,數據將從一個名爲 message 的數組中取出,這個數組包含字符串 "Some bytes" 的 ASCII 字節(本教程後面將會解釋 buffer.flip()buffer.put() 調用)。

ByteBuffer buffer = ByteBuffer.allocate( 1024 );

for (int i=0; i<message.length; ++i) {
     buffer.put( message[i] );
}
buffer.flip();

最後一步是寫入緩衝區中:

fc.write( buffer );

 


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章