IO異常的處理
在jdk1.7之前使用try catch finally 處理流中的異常
格式:
try{
可能會(huì)產(chǎn)出異常的代碼
}catch(異常類(lèi)變量 變量名){
異常的處理邏輯
}finally{
一定會(huì)指定的代碼
資源釋放
}
jdk1.7之前try...catch處理的完整方法(非常麻煩)
public static void main(String[] args) {
//提高變量fw的作用域,讓finally可以使用
//變量在定義的時(shí)候,可以沒(méi)有值,但是使用的時(shí)候必須有值
//fw = new FileWriter("09_IOAndProperties\\g.txt",true); 執(zhí)行失敗,fw沒(méi)有值,fw.close會(huì)報(bào)錯(cuò)
FileWriter fw = null;
try{
//可能會(huì)產(chǎn)出異常的代碼
fw = new FileWriter("w:\\09_IOAndProperties\\g.txt",true);
for (int i = 0; i <10 ; i++) {
fw.write("HelloWorld"+i+"\r\n");
}
}catch(IOException e){
//異常的處理邏輯
System.out.println(e);
}finally {
//一定會(huì)指定的代碼
//創(chuàng)建對(duì)象失敗了,fw的默認(rèn)值就是null,null是不能調(diào)用方法的,會(huì)拋出NullPointerException
//需要增加一個(gè)判斷,不是null在把資源釋放
if(fw!=null){
try {
//fw.close方法聲明拋出了IOException異常對(duì)象,所以我們就的處理這個(gè)異常對(duì)象,要么throws,要么try catch
fw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
JDK7的新特性
在try的后邊可以增加一個(gè)(),在括號(hào)中可以定義流對(duì)象
那么這個(gè)流對(duì)象的作用域就在try中有效
try中的代碼執(zhí)行完畢,會(huì)自動(dòng)把流對(duì)象釋放,不用寫(xiě)finally
格式:
try(定義流對(duì)象;定義流對(duì)象....){
可能會(huì)產(chǎn)出異常的代碼
}catch(異常類(lèi)變量 變量名){
異常的處理邏輯
}
使用jdk1.7新特性的try..catch(內(nèi)容為文件復(fù)制)
public static void main(String[] args) {
try(//1.創(chuàng)建一個(gè)字節(jié)輸入流對(duì)象,構(gòu)造方法中綁定要讀取的數(shù)據(jù)源
FileInputStream fis = new FileInputStream("c:\\1.jpg");
//2.創(chuàng)建一個(gè)字節(jié)輸出流對(duì)象,構(gòu)造方法中綁定要寫(xiě)入的目的地
FileOutputStream fos = new FileOutputStream("d:\\1.jpg");){
//可能會(huì)產(chǎn)出異常的代碼
//一次讀取一個(gè)字節(jié)寫(xiě)入一個(gè)字節(jié)的方式
//3.使用字節(jié)輸入流對(duì)象中的方法read讀取文件
int len = 0;
while((len = fis.read())!=-1){
//4.使用字節(jié)輸出流中的方法write,把讀取到的字節(jié)寫(xiě)入到目的地的文件中
fos.write(len);
}
}catch (IOException e){
//異常的處理邏輯
System.out.println(e);
}
}
JDK9新特性
try的前邊可以定義流對(duì)象
在try后邊的()中可以直接引入流對(duì)象的名稱(chēng)(變量名)
在try代碼執(zhí)行完畢之后,流對(duì)象也可以釋放掉,不用寫(xiě)finally
格式:
A a = new A();
B b = new B();
try(a,b){
可能會(huì)產(chǎn)出異常的代碼
}catch(異常類(lèi)變量 變量名){
異常的處理邏輯
}
public static void main(String[] args) throws IOException {
//1.創(chuàng)建一個(gè)字節(jié)輸入流對(duì)象,構(gòu)造方法中綁定要讀取的數(shù)據(jù)源
FileInputStream fis = new FileInputStream("c:\\1.png");
//2.創(chuàng)建一個(gè)字節(jié)輸出流對(duì)象,構(gòu)造方法中綁定要寫(xiě)入的目的地
FileOutputStream fos = new FileOutputStream("e:\\1.jpg");
try(fis;fos){
//一次讀取一個(gè)字節(jié)寫(xiě)入一個(gè)字節(jié)的方式
//3.使用字節(jié)輸入流對(duì)象中的方法read讀取文件
int len = 0;
while((len = fis.read())!=-1){
//4.使用字節(jié)輸出流中的方法write,把讀取到的字節(jié)寫(xiě)入到目的地的文件中
fos.write(len);
}
}catch (IOException e){
System.out.println(e);
}
//fos.write(1);//Stream Closed
}
屬性集
java.util.Properties 繼承于 Hashtable ,來(lái)表示一個(gè)持久的屬性集绪妹。它使用鍵值結(jié)構(gòu)存儲(chǔ)數(shù)據(jù)骂租,每個(gè)鍵及其 對(duì)應(yīng)值都是一個(gè)字符串涨椒。該類(lèi)也被許多Java類(lèi)使用,比如獲取系統(tǒng)屬性時(shí)津坑, System.getProperties 方法就是返回 一個(gè) Properties 對(duì)
Properties類(lèi)
java.util.Properties集合 extends Hashtable<k,v> implements Map<k,v>
Properties 類(lèi)表示了一個(gè)持久的屬性集妙蔗。Properties 可保存在流中或從流中加載。
Properties集合是一個(gè)唯一和IO流相結(jié)合的集合
可以使用Properties集合中的方法store,把集合中的臨時(shí)數(shù)據(jù),持久化寫(xiě)入到硬盤(pán)中存儲(chǔ)
可以使用Properties集合中的方法load,把硬盤(pán)中保存的文件(鍵值對(duì)),讀取到集合中使用
屬性列表中每個(gè)鍵及其對(duì)應(yīng)值都是一個(gè)字符串疆瑰。
Properties集合是一個(gè)雙列集合,key和value默認(rèn)都是字符串
使用Properties集合存儲(chǔ)數(shù)據(jù)眉反,遍歷:
使用Properties集合存儲(chǔ)數(shù)據(jù),遍歷取出Properties集合中的數(shù)據(jù)
Properties集合是一個(gè)雙列集合,key和value默認(rèn)都是字符串
Properties集合有一些操作字符串的特有方法:
- Object setProperty(String key, String value) 調(diào)用 Hashtable 的方法 put。
- String getProperty(String key) 通過(guò)key找到value值,此方法相當(dāng)于Map集合中的get(key)方法
- Set<String> stringPropertyNames() 返回此屬性列表中的鍵集穆役,其中該鍵及其對(duì)應(yīng)值是字符串,此方法相當(dāng)于Map集合中的keySet方法
//創(chuàng)建Properties集合對(duì)象
Properties prop = new Properties();
//使用setProperty往集合中添加數(shù)據(jù)
prop.setProperty("趙麗穎","168");
prop.setProperty("迪麗熱巴","165");
prop.setProperty("古力娜扎","160");
//prop.put(1,true);
//使用stringPropertyNames把Properties集合中的鍵取出,存儲(chǔ)到一個(gè)Set集合中
Set<String> set = prop.stringPropertyNames();
//遍歷Set集合,取出Properties集合的每一個(gè)鍵
for (String key : set) {
//使用getProperty方法通過(guò)key獲取value
String value = prop.getProperty(key);
System.out.println(key+"="+value);
}
可以使用Properties集合中的方法store,把集合中的臨時(shí)數(shù)據(jù),持久化寫(xiě)入到硬盤(pán)中存儲(chǔ)
- void store(OutputStream out, String comments)
- void store(Writer writer, String comments)
參數(shù):
OutputStream out:字節(jié)輸出流,不能寫(xiě)入中文
Writer writer:字符輸出流,可以寫(xiě)中文
String comments:注釋,用來(lái)解釋說(shuō)明保存的文件是做什么用的
不能使用中文,會(huì)產(chǎn)生亂碼,默認(rèn)是Unicode編碼
一般使用""空字符串
使用步驟:
1.創(chuàng)建Properties集合對(duì)象,添加數(shù)據(jù)
2.創(chuàng)建字節(jié)輸出流/字符輸出流對(duì)象,構(gòu)造方法中綁定要輸出的目的地
3.使用Properties集合中的方法store,把集合中的臨時(shí)數(shù)據(jù),持久化寫(xiě)入到硬盤(pán)中存儲(chǔ)
4.釋放資源
//1.創(chuàng)建Properties集合對(duì)象,添加數(shù)據(jù)
Properties prop = new Properties();
prop.setProperty("趙麗穎","168");
prop.setProperty("迪麗熱巴","165");
prop.setProperty("古力娜扎","160");
//2.創(chuàng)建字節(jié)輸出流/字符輸出流對(duì)象,構(gòu)造方法中綁定要輸出的目的地
FileWriter fw = new FileWriter("09_IOAndProperties\\prop.txt");
//3.使用Properties集合中的方法store,把集合中的臨時(shí)數(shù)據(jù),持久化寫(xiě)入到硬盤(pán)中存儲(chǔ)
prop.store(fw,"save data");
//4.釋放資源
fw.close();
//創(chuàng)建字節(jié)輸出流匿名方法寸五,使用store方法,寫(xiě)入到硬盤(pán)中孵睬,因?yàn)橛兄形臅?huì)亂碼
//匿名方法會(huì)自動(dòng)釋放
prop.store(new FileOutputStream("09_IOAndProperties\\prop2.txt"),"");
可以使用Properties集合中的方法load,把硬盤(pán)中保存的文件(鍵值對(duì)),讀取到集合中使用
void load(InputStream inStream)
void load(Reader reader)
參數(shù):
InputStream inStream:字節(jié)輸入流,不能讀取含有中文的鍵值對(duì)
Reader reader:字符輸入流,能讀取含有中文的鍵值對(duì)
使用步驟:
1.創(chuàng)建Properties集合對(duì)象
2.使用Properties集合對(duì)象中的方法load讀取保存鍵值對(duì)的文件
3.遍歷Properties集合
注意:
1.存儲(chǔ)鍵值對(duì)的文件中,鍵與值默認(rèn)的連接符號(hào)可以使用=,空格(其他符號(hào))
2.存儲(chǔ)鍵值對(duì)的文件中,可以使用#進(jìn)行注釋,被注釋的鍵值對(duì)不會(huì)再被讀取
3.存儲(chǔ)鍵值對(duì)的文件中,鍵與值默認(rèn)都是字符串,不用再加引號(hào)
//1.創(chuàng)建Properties集合對(duì)象
Properties prop = new Properties();
//2.使用Properties集合對(duì)象中的方法load讀取保存鍵值對(duì)的文件
prop.load(new FileReader("09_IOAndProperties\\prop.txt"));
//使用字節(jié)流時(shí)會(huì)有亂碼
prop.load(new FileInputStream("09_IOAndProperties\\prop.txt"));
//3.遍歷Properties集合
Set<String> set = prop.stringPropertyNames();
for (String key : set) {
String value = prop.getProperty(key);
System.out.println(key+"="+value);
}