導航:首頁 > 文件管理 > 靜態代碼塊讀取配置文件

靜態代碼塊讀取配置文件

發布時間:2023-11-16 22:15:48

『壹』 java如何實現sql連接和查詢的代碼

import java.sql.Connection。

『貳』 java static {}的用法

作用
有時你希望定義一個類成員,使它的使用完全獨立於該類的任何對象。通常情況下,類成員必須通過它的類的對象訪問,但是可以創建這樣一個成員,它能夠被它自己使用,而不必引用特定的實例。在成員的聲明前面加上關鍵字static(靜態的)就能創建這樣的成員。如果一個成員被聲明為static,它就能夠在它的類的任何對象創建之前被訪問,而不必引用任何對象。你可以將方法和變數都聲明為static。static 成員的最常見的例子是main( ) 。因為在程序開始執行時必須調用main() ,所以它被聲明為static。
聲明為static的變數實質上就是全局變數。當聲明一個對象時,並不產生static變數的拷貝,而是該類所有的實例變數共同擁有一個static變數。聲明為static的方法有以下幾條限制:
·
它們僅能調用其他的static 方法。
·
它們只能訪問static數據。
·
它們不能以任何方式引用this 或super(關鍵字super 與繼承有關)。
舉例
如果你需要通過計算來初始化你的static變數,你可以聲明一個static塊,Static 塊僅在該類被載入時執行一次。下面的例子顯示的類有一個static方法,一些static變數,以及一個static 初始化塊:
// Demonstrate static variables,methods,and blocks.
class UseStatic {
static int a = 3;
static int b;
static void meth(int x) {
System.out.println("x = " + x);
System.out.println("a = " + a);
System.out.println("b = " + b);
}
static {
System.out.println("Static block initialized.");
b = a * 4;
}
public static void main(String args[]) {
meth(42);
}
}
一旦UseStatic 類被裝載,所有的static語句被運行。首先,a被設置為3,接著static 塊執行(列印一條消息),最後,b被初始化為a*4 或12。然後調用main(),main() 調用meth() ,把值42傳遞給x。3個println ( ) 語句引用兩個static變數a和b,以及局部變數x 。
注意:在一個static 方法中引用任何實例變數都是非法的。
下面是該程序的輸出:
Static block initialized.
x = 42
a = 3
b = 12

『叄』 JAVA中如何讀取src下所有的properties文件

最常用讀取properties文件的方法
InputStream in = getClass().getResourceAsStream("資源Name");這種方式要求properties文件和當前類在同一文件夾下面。如果在不同的包中,必須使用:
InputStream ins = this.getClass().getResourceAsStream("/cn/zhao/properties/testPropertiesPath2.properties");
Java中獲取路徑方法
獲取路徑的一個簡單實現
反射方式獲取properties文件的三種方式

1 反射方式獲取properties文件最常用方法以及思考:
Java讀取properties文件的方法比較多,網上最多的文章是"Java讀取properties文件的六種方法",但在Java應用中,最常用還是通過java.lang.Class類的getResourceAsStream(String name) 方法來實現,但眾多讀取properties文件的代碼中,都會這么做:

InputStream in = getClass().getResourceAsStream("資源Name");

這裡面有個問題,就是getClass()調用的時候默認省略了this,this是不能在static(靜態)方法或者static塊中使用的,原因是static類型的方法或者代碼塊是屬於類本身的,不屬於某個對象,而this本身就代表當前對象,而靜態方法或者塊調用的時候是不用初始化對象的。

問題是:假如不想讓某個類有對象,那麼會將此類的默認構造方法設為私有,當然也不會寫別的共有的構造方法。並且我這個類是工具類,都是靜態的方法和變數,要在靜態塊或者靜態方法中獲取properties文件,這個方法就行不通了。

其實這個類就不是這么用的,他僅僅是需要獲取一個Class對象就可以了,那就容易了,
取所有類的父類Object,用Object.class比用正在寫類自身方便安全,下面給出一個例子,以方便交流。
import java.util.Properties;
import java.io.InputStream;
import java.io.IOException;

/**
* 讀取Properties文件的例子
* File: TestProperties.java
* User: leimin
* Date: 2008-2-15 18:38:40
*/
public final class TestProperties {
private static String param1;
private static String param2;

static {
Properties prop = new Properties();
InputStream in = Object. class .getResourceAsStream( "/test.properties" );
try {
prop.load(in);
param1 = prop.getProperty( "initYears1" ).trim();
param2 = prop.getProperty( "initYears2" ).trim();
} catch (IOException e) {
e.printStackTrace();
}
}

/**
* 私有構造方法,不需要創建對象
*/
private TestProperties() {
}

public static String getParam1() {
return param1;
}

public static String getParam2() {
return param2;
}

public static void main(String args[]){
System.out.println(getParam1());
System.out.println(getParam2());
}
}

運行結果:

151
152
當然,把Object.class換成int.class也行。

另外,如果是static方法或塊中讀取Properties文件,還有一種最保險的方法,就是這個類的本身名字來直接獲取Class對象,比如本例中可寫成TestProperties.class,這樣做是最保險的方法。
2 獲取路徑的方式:
File fileB = new File( this .getClass().getResource( "" ).getPath());

System. out .println( "fileB path: " + fileB);

2.2獲取當前類所在的工程名:
System. out .println("user.dir path: " + System. getProperty ("user.dir"))<span style="background-color: white;">3 獲取路徑的一個簡單的Java實現</span>
/**

*獲取項目的相對路徑下文件的絕對路徑

*

* @param parentDir

*目標文件的父目錄,例如說,工程的目錄下,有lib與bin和conf目錄,那麼程序運行於lib or

* bin,那麼需要的配置文件卻是conf裡面,則需要找到該配置文件的絕對路徑

* @param fileName

*文件名

* @return一個絕對路徑

*/

public static String getPath(String parentDir, String fileName) {

String path = null;

String userdir = System.getProperty("user.dir");

String userdirName = new File(userdir).getName();

if (userdirName.equalsIgnoreCase("lib")

|| userdirName.equalsIgnoreCase("bin")) {

File newf = new File(userdir);

File newp = new File(newf.getParent());

if (fileName.trim().equals("")) {

path = newp.getPath() + File.separator + parentDir;

} else {

path = newp.getPath() + File.separator + parentDir

+ File.separator + fileName;

}

} else {

if (fileName.trim().equals("")) {

path = userdir + File.separator + parentDir;

} else {

path = userdir + File.separator + parentDir + File.separator

+ fileName;

}

}

return path;

}

4 利用反射的方式獲取路徑:
InputStream ips1 = Enumeration . class .getClassLoader() .getResourceAsStream( "cn/zhao/enumStudy/testPropertiesPath1.properties" );

InputStream ips2 = Enumeration . class .getResourceAsStream( "testPropertiesPath1.properties" );

InputStream ips3 = Enumeration . class .getResourceAsStream( "properties/testPropertiesPath2.properties" );

『肆』 maven項目只能讀到絕對路徑下的文件,讀不到相對路徑下的文件

新建一個maven工程後,main目錄下會有java和resources兩個文件夾,其中java文件夾下存放源代碼,resources文件夾下存放一些配置文件等。

maven%E5%B7%A5%E7%A8%8B%E7%BB%93%E6%9E%84%E5%9B%BE.pngJava: maven下讀取資源文件的問題, java路徑

在弄清楚編譯後,資源文件以及位元組碼存在哪裡這個問題之前,有必要明白什麼是classpath

classpath實際上就是編譯後的 以 classes 文件夾為起點的路徑,而在ItelliJ IDEA 中編譯後的文件都會存入out/proction下。

所以,編譯後,resources文件夾中的文件以及java目錄下的文件都會存入同一個目錄(out/proction)下,也就是說,編譯後是不存在java和resources這兩個目錄的。

讀取資源文件的若干中方法

package me.shenchao.main;

import java.io.*;

/** * Created by jerry on 16-4-20. */

public class Demo1 {

private static void readTxt(String filePath) {

BufferedReader reader = null;

try {

reader = new BufferedReader(new FileReader(filePath));

String line = null;

while ((line = reader.readLine()) != null) {

System.out.println(line);

}

} catch (Exception e) {

e.printStackTrace();

} finally {

if (reader != null) {

try {

reader.close();

} catch (IOException e) {

e.printStackTrace();

}

}

}

}

public static void main(String[] args) {

//獲取classpath路徑

System.out.println("classpath路徑: "+Demo1.class.getClassLoader().getResource("").getPath());

//獲取當前類的載入路徑

System.out.println("當前類載入路徑: "+Demo1.class.getResource("").getPath());

// 讀取文件resources目錄中文件的若干種方法

// 方法一:從classpath路徑出發讀取

readTxt(Demo1.class.getClassLoader().getResource("test/demo1.txt").getPath());

// 方法二:從類載入路徑出發,相當於使用絕對路徑

readTxt(Demo1.class.getResource("/test/demo1.txt").getPath());

// 方法三:從類載入路徑出發,相當於使用相對路徑

readTxt(Demo1.class.getResource("../../../test/demo1.txt").getPath());

}

}

其中demo1.txt文件中內容為:

hahahahahahahahahha

輸出如下:

classpath路徑: /home/jerry/IdeaProjects/Demo/out/proction/demo1/

當前類載入路徑: /home/jerry/IdeaProjects/Demo/out/proction/demo1/me/shenchao/main/

hahahahahahahahahha

hahahahahahahahahha

hahahahahahahahahha

從上面可以發現getResource 與 class.getClassLoader().getResource兩者的區別:

前者獲取的是當前類載入的路徑,如果用此方法讀取文件則有兩種方法,與相對路徑絕對路徑非常類似,具體參見代碼

後者獲取的是類載入器的路徑,即會到classpath路徑下。可以理解當前在 classp/ 目錄下,要想訪問哪個文件,直接填寫路徑即可,不用區分相對路徑和絕對路徑。顯然,此方法比較容易寫出。推薦。

.gif

相關

Related Posts

JAVA: 理解Java中的類初始化

在運行 Java 代碼時,很多時候需要弄清楚程序執行的流程,而面向對象的 Java 程序並非像主要為面向過程而設計的 C 語言一樣去順序執行(簡單按照代碼的順序),這使得對於類文件的載入以及執行流程的理解非常重要。本文簡單介紹了 Java 類的初始化部分具體過程,包括成員變數、靜態代碼塊、構造函數等的初始化時機及執行流程。 初始化時機 根據 javase 8 的文檔說明[1],一個類(本文暫不考慮介面)T…

JAVA: 獲取當前月份c.get(Calendar.MONTH)中月份少一個月

@Test public void testGetTitle(){ System.out.println(new LocalDate().minusDays(1).toString("MM/dd/yyyy")); // joda-time Calendar c1 = Calendar.getInstance(); int year…

JAVA: 讀寫文件的幾種方法

如果您使用java8,可以也參考這篇文章:JAVA: Java8流逐行讀取文件 import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.text.SimpleDateFormat;…

閱讀全文

與靜態代碼塊讀取配置文件相關的資料

熱點內容
wps工具欄怎麼換成中文 瀏覽:338
win7和xp共享文件 瀏覽:883
蘋果4代音量鍵沒反應 瀏覽:827
怎樣打開tif文件 瀏覽:153
java下載文件zip 瀏覽:440
qq瀏覽器壓縮文件怎麼設密碼 瀏覽:526
黃埔數控編程哪裡好 瀏覽:406
mac109升級1010 瀏覽:691
在java的菜單如何導入文件 瀏覽:982
現在什麼網站銷量最高 瀏覽:760
angularjsclass定義 瀏覽:157
ug數控編程怎麼導出程序 瀏覽:466
cmdb文件 瀏覽:710
鵯文件夾 瀏覽:763
網路輿情應對的基本理念是什麼 瀏覽:433
word2007層次結構 瀏覽:456
去掉文件名的數字 瀏覽:713
word公司 瀏覽:710
淘寶店數據包怎麼上傳 瀏覽:341
pbt文件 瀏覽:204

友情鏈接