day02(3)IO異常的處理萨蚕,Properties集合

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);
        }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末播歼,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子掰读,更是在濱河造成了極大的恐慌,老刑警劉巖叭莫,帶你破解...
    沈念sama閱讀 206,311評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蹈集,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡雇初,警方通過(guò)查閱死者的電腦和手機(jī)拢肆,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)靖诗,“玉大人郭怪,你說(shuō)我怎么就攤上這事】伲” “怎么了鄙才?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,671評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)促绵。 經(jīng)常有香客問(wèn)我攒庵,道長(zhǎng),這世上最難降的妖魔是什么败晴? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,252評(píng)論 1 279
  • 正文 為了忘掉前任浓冒,我火速辦了婚禮,結(jié)果婚禮上尖坤,老公的妹妹穿的比我還像新娘稳懒。我一直安慰自己,他們只是感情好慢味,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,253評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布场梆。 她就那樣靜靜地躺著墅冷,像睡著了一般。 火紅的嫁衣襯著肌膚如雪辙谜。 梳的紋絲不亂的頭發(fā)上俺榆,一...
    開(kāi)封第一講書(shū)人閱讀 49,031評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音装哆,去河邊找鬼罐脊。 笑死,一個(gè)胖子當(dāng)著我的面吹牛蜕琴,可吹牛的內(nèi)容都是我干的萍桌。 我是一名探鬼主播,決...
    沈念sama閱讀 38,340評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼凌简,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼上炎!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起雏搂,我...
    開(kāi)封第一講書(shū)人閱讀 36,973評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤藕施,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后凸郑,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體裳食,經(jīng)...
    沈念sama閱讀 43,466評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,937評(píng)論 2 323
  • 正文 我和宋清朗相戀三年芙沥,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了诲祸。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,039評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡而昨,死狀恐怖救氯,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情歌憨,我是刑警寧澤着憨,帶...
    沈念sama閱讀 33,701評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站躺孝,受9級(jí)特大地震影響享扔,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜植袍,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,254評(píng)論 3 307
  • 文/蒙蒙 一惧眠、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧于个,春花似錦氛魁、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,259評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)捶码。三九已至,卻和暖如春或链,著一層夾襖步出監(jiān)牢的瞬間惫恼,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工澳盐, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留祈纯,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,497評(píng)論 2 354
  • 正文 我出身青樓叼耙,卻偏偏與公主長(zhǎng)得像腕窥,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子筛婉,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,786評(píng)論 2 345