1. 程式人生 > >IO異常的處理、Properties屬性集、IO流小結

IO異常的處理、Properties屬性集、IO流小結

1. JDK1.7前處理

  • 之前我們習慣了把異常丟擲,而在實際開發中並不能這樣處理,強烈建議使用try...catch...finally程式碼塊,處理異常部分。
  • JDK1.7之前示例程式碼:
import java.io.*;
public class FileCopy {
    public static void main(String[] args)  {
       //建立檔案物件並關聯原始檔
        File srcFile = new File("H:/aaa.jpg");
        //建立檔案物件並關聯目標檔案
        File destFile = new File("H:/bbb.jpg");
        copyFile(srcFile,destFile);
    }
    public static void copyFile(File srcFile,File destFile)  {
        //宣告位元組輸入輸出流
        FileInputStream fis = null;
        FileOutputStream fos = null;
        try {
          //建立位元組輸入流物件關聯原始檔
           fis = new FileInputStream(srcFile);
          //建立位元組輸出流物件並關聯目標檔案
           fos = new FileOutputStream(destFile);

          //建立位元組陣列用於儲存讀取到的檔案資料
          byte[] b = new byte[1024];

          //定義整型變數用於儲存實際讀取到的位元組個數
          int len=-1;

          //迴圈讀寫資料
          while ((len=fis.read(b))!=-1){
              //利用fos將位元組陣列內容輸出到目標檔案中
              fos.write(b,0,len);
          }
      }catch (Exception e){

      }finally {
          try{
              //關閉流釋放資源
              if(fis != null)
              fis.close();
          }catch (Exception e){
              e.printStackTrace();
          }
            try{
              if(fos != null)
                fos.close();
            }catch (Exception e){
              e.printStackTrace();
            }
        }
    }
}

2. JDK1.7之後處理異常方式

    JDK1.7之後處理異常的正確姿勢(小括號中會幫我們處理關閉流的動作,不需要我們手動處理)
    try(建立流的程式碼){
    
    }catch(異常類名  變數名){
    
    }
    小括號中只能放建立流的程式碼,呼叫流方法的程式碼不能放在小括號中
import java.io.*;
public class FileCopy {
    public static void main(String[] args) {
        //建立檔案物件並關聯原始檔
        File srcFile = new File("H:/aaa.jpg");
        //建立檔案物件並關聯目標檔案
        File destFile = new File("H:/bbb.jpg");
        copyFile(srcFile, destFile);
    }
  
    public static void copyFile(File srcFile, File destFile) {
        try (//建立位元組輸入流物件關聯原始檔
             FileInputStream fis = new FileInputStream(srcFile);
             //建立位元組輸出流物件並關聯目標檔案
             FileOutputStream fos = new FileOutputStream(destFile);)
        {
            //建立位元組陣列用於儲存讀取到的檔案資料
            byte[] b = new byte[1024];

            //定義整型變數用於儲存實際讀取到的位元組個數
            int len = -1;

            //迴圈讀寫資料
            while ((len = fis.read(b)) != -1) {
                //利用fos將位元組陣列內容輸出到目標檔案中
                fos.write(b, 0, len);
            }
        } catch (Exception e) {

        }
    }
}

3. JDK1.9之後處理異常的方式

    JDK1.9之後處理異常的方式:(同樣小括號中會幫我們處理關閉流的動作,不需要我們手動處理)
    try(流物件1;流物件2){

    }catch(異常類名  變數名){

    }

 JDK1.7之後和JDK1.9之後注意事項

  • 同樣小括號中會幫我們處理關閉流的動作,不需要我們手動處理
  • 作用域不同:JDK1.7之後建立的流物件是放在小括號裡面,JDK1.9之後建立的流物件是放在小括號外面,只需要傳兩個變數名過去小括號,作用域更大,但是JDK1.9需要作宣告(...throws Exception...),否則會報錯。
import java.io.*;
public class FileCopy {
    public static void main(String[] args) throws FileNotFoundException {
        //建立檔案物件並關聯原始檔
        File srcFile = new File("H:/aaa.jpg");
        //建立檔案物件並關聯目標檔案
        File destFile = new File("H:/bbb.jpg");
        copyFile(srcFile, destFile);
    }


    public static void copyFile(File srcFile, File destFile) throws FileNotFoundException {
        //建立位元組輸入流物件關聯原始檔
        FileInputStream fis = new FileInputStream(srcFile);
        //建立位元組輸出流物件並關聯目標檔案
        FileOutputStream fos = new FileOutputStream(destFile);
        try (fis;fos) {
            //建立位元組陣列用於儲存讀取到的檔案資料
            byte[] b = new byte[1024];

            //定義整型變數用於儲存實際讀取到的位元組個數
            int len = -1;

            //迴圈讀寫資料
            while ((len = fis.read(b)) != -1) {
                //利用fos將位元組陣列內容輸出到目標檔案中
                fos.write(b, 0, len);
            }
        } catch (Exception e) {

        }
    }
}

Properties屬性集

  • Properties類概述:
  1. 實現了Map介面,繼承Hashtable,也是一個雙列集合。
  2. 也是用來儲存鍵值對資料,鍵和值預設是字串型別,不需要指定型別了。
  3. 有和流技術相結合的方法:可以直接將集合中的資料儲存到檔案中/也可以直接從檔案中讀取資料到檔案中
  • 屬性檔案要求:
  1. 命名要求:xxx.properties
  2. 每一個鍵值對佔據一行,格式:鍵=值
  3. 檔案中可以使用註釋的,註釋是以#開頭
  • Properties集合常用方法
  • Object setProperty(String key,String value)
  1. 新增鍵值對
  2. 如果鍵存在,則使用新值替換舊值,返回舊值
  3. 如果鍵不存在,則返回null
  • String getProperty(String key)
  1. 根據鍵獲得值,返回鍵對應的值
  2. 鍵不存在返回null
  • set<String> stringPropertyNames():獲得鍵集合
  • void store(OutputStream out,String comments)
  1. 將集合中的資料儲存到流關聯的目標檔案中
  2. comments:說明文字,一般給null即可
  • void load(InputStream in)
  1. 從流關聯的目標檔案中載入資料到集合中
  • 示例1:Properties集合常用方法 
import java.util.Properties;
import java.util.Set;
/*
    Properties集合常用方法
 */
public class PropertiesDemo01 {
    public static void main(String[] args) {
        //建立屬性集合物件
        Properties prop = new Properties();

        //新增鍵值對
        Object o = prop.setProperty("name", "馬雲");
        Object o1 = prop.setProperty("name", "馬化騰");

        Object o2 = prop.setProperty("gender", "男");
        Object age = prop.setProperty("age", "18");

        System.out.println(o);//null
        System.out.println(o1);//馬雲(新值替換舊值,馬化騰替換馬雲,返回舊值,返回馬雲)
        System.out.println(o2);//null
        System.out.println(age);//null
        System.out.println(prop);//{gender=男, name=馬化騰, age=18}

        //根據鍵獲得值
        System.out.println(prop.getProperty("name"));//馬化騰
        System.out.println("------------------------------");

        //獲得鍵集合
        Set<String> names = prop.stringPropertyNames();
        for (String name:names){
            System.out.println(name+"="+prop.getProperty(name));
        }
        /*
            gender=男
            name=馬化騰
            age=18
         */
    }
}
  •  示例2:與流技術相結合的方法演示
import java.io.FileOutputStream;
import java.util.Properties;
/*
    Properties集合方法:儲存集合資料到檔案中
 */
public class PropertiesDemo01 {
    public static void main(String[] args) throws Exception{
        //建立屬性集合物件
        Properties prop = new Properties();

        //新增鍵值對
        prop.setProperty("name", "馬雲");
        prop.setProperty("gender", "男");
        prop.setProperty("age", "18");

        //建立位元組輸出流物件並關聯目標檔案
        FileOutputStream fos = new FileOutputStream("teach.properties");
        prop.store(fos,"this is teacher");
        //關閉流
        fos.close();
    }
}

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.Properties;
/*
    Properties集合方法:從檔案中讀取資料到Properties集合中
 */
public class PropertiesDemo01 {
    public static void main(String[] args) throws Exception{
        //建立屬性集合物件
        Properties prop = new Properties();//{}

        System.out.println(prop);
        //建立位元組輸入流物件並關聯目標檔案
        FileInputStream fis = new FileInputStream("teach.properties");
        prop.load(fis);
        //關閉流
        fis.close();
        System.out.println(prop);//{gender=男, name=馬雲, age=18}
    }
}

IO流小結

  • IO流分類

    位元組流:以位元組為單位讀寫資料
        * 位元組輸入流:InputStream 所有位元組輸入流的父類
        * 位元組輸出流:OutputStream 所有位元組輸出流的父類
    字元流:以字元為單位讀寫資料
        * 字元輸入流:Reader  所有字元輸入流的父類
        * 字元輸出流:Writer 所有字元輸出流的父類

  • 如何判斷流是位元組流還是字元流:

    * 如果是以Stream結尾的流,就是位元組流,否則都是字元流。    
    

  • IO流的使用步驟:

    * 建立流關聯目標檔案
    * 呼叫流的write或read方法讀寫資料
    * 呼叫流的close方法關閉流釋放資源
    

  • 位元組流和字元流的區別:

    * 位元組流:可以操作任意型別的檔案
    * 字元流:只能用來操作文字檔案

  • 位元組流和字元流的選擇:

    * 如果明確清楚要操作的檔案型別是文字檔案,則強烈推薦使用字元流
    * 如果不清楚要操作的檔案型別是什麼型別,則只能選擇位元組流。