1. 程式人生 > >遞迴和I/O流

遞迴和I/O流

遞迴

遞迴:是一種方法內部呼叫方法本身的程式設計技巧。

計算5! = 5*4*3*2*1。
5! = 4! * 5
4! = 3! * 4
3! = 2! * 3
2! = 1! * 2
1! = 1;

public static void main(String[] args){
    m(5);// 120
}
public static int m(int n){
    if(n == 1){// 遞迴:要給一個結束點(出口)
        return 1;
    }
    return n*m(n-1);// 遞迴呼叫

列出某指定資料夾下的所有檔案

public static void main(String[] args) {
    File file = new File("F:/abc/");
    m(file);
}

// 用於列出某指定資料夾下的所有檔案
public static void m(File dir){
    File[] fileArr = dir.listFiles();
    for(File f : fileArr){
        if(f.isDirectory()){
            m(f);// 如果是資料夾,遞迴呼叫方法本身
        }else {
            System.out.println(f);
        }
    }
}

I/O流

  • 1、為什麼要使用IO流?
    持久化:將記憶體中的資料儲存在硬碟上的過程。IO流、JDBC、Hibernate

  • 2、以程式作為參照物,則分為:
    InputStream輸入流:由檔案到程式(抽象類)
    OutputStream輸出流:由程式到檔案(抽象類)
    檔案輸入輸出流:FileInputStream FileOutputStream

  • 3、流的特點:
    流只能順序的操作
    流都是成對出現的(方向不同)

  • 注:
    1、FileInputStream如果沒有檔案則報異常,而FileOutputStream會自動新建檔案
    2、FileInputStream讀取到檔案末尾,得到-1的值,可以作為讀取結束的標誌。

  • I/O流的分類:

    • 以方向來說:輸入流和輸出流
    • 以包裝設計模式來說:基本流和包裝流
    • 能處理位元組還是字元:位元組流和字元流
    • 所有的以InputStream和OutputStream結尾的都是位元組流
    • 所有的以Reader和Writer結尾的都是字元流。
    • InputStreamReader:連線位元組流和字元流的橋樑,稱之為轉換流
    • OutputStreamWriter:連線位元組流和字元流的橋樑,稱之為轉換流

      • 什麼時候使用位元組流,什麼時候使用字元流?
    • 1、關於檔案本身的操作(拷貝、下載、上傳等),使用位元組流。
    • 2、關於文字檔案內容的操作,使用字元流
    • BufferedReader/BufferedWriter(功能欠缺)
    • PrintWriter和BufferedReader配對使用
// 讀取指定檔案的內容(F:/abc/a.txt)
File file = new File("F:/abc/a.txt");
FileInputStream fis = null;
try {
    fis = new FileInputStream(file);
    int n1 = fis.read();// 一次讀取一個位元組
    System.out.println((char)n1);
    int n2 = fis.read();
    System.out.println((char)n2);
} catch (FileNotFoundException e) {
    e.printStackTrace();
} catch (IOException e){
    e.printStackTrace();
} finally{// 肯定會執行的程式碼 一般用於關閉資源或處理臨時檔案
    try {
        if(fis != null){
            fis.close();
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
}

覆蓋式寫入資料

File file = new File("E:/abc/");
FileOutputStream fos = null;
try {
    // append:是否以追加的形式寫內容到檔案,預設是false,為覆蓋模式
    fos = new FileOutputStream(file, true);// 追加模式
    fos.write(97);
    fos.write(100);
} catch (FileNotFoundException e) {
    e.printStackTrace();
} catch (IOException e) {
    e.printStackTrace();
} finally {
    try {
        if (fos != null) {
            fos.close();
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
}

拷貝檔案

public static void main(String[] args) {
    File fileSrc = new File("F:/abc/a.txt");
    File fileDest = new File("F:/abc/b.txt");
    copyFile(fileSrc,fileDest);// 複製檔案
}
/**
 * 完成fileSrc到fileDest的拷貝工作
 * @param fileSrc 原始檔的路徑
 * @param fileDest 目標檔案的路徑
 */
public static void copyFile(String fileSrc,String fileDest){
    copyFile(new File(fileSrc),new File(fileDest));
}

/**
 * 完成fileSrc到fileDest的拷貝工作
 * @param fileSrc 原始檔
 * @param fileDest 目標檔案
 */
public static void copyFile(File fileSrc,File fileDest){
    FileInputStream fis = null;
    FileOutputStream fos = null;
    try {
        fis = new FileInputStream(fileSrc);
        fos = new FileOutputStream(fileDest);
        byte[] byArr = new byte[1024*8];// 空間換時間
        int b=0;
        // b:實際讀到的位元組數
        while ((b=fis.read(byArr)) != (-1)) {
            fos.write(byArr,0,b);// 一次寫入byArr長度
        }
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        try {
            if (fis != null) {
                fis.close();
            }
            if(fos != null){
                fos.close();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

I/O流包裝類BufferedReader的使用

public static void main(String[] args) {
    File file = new File("F:/abc/a.txt");
    System.out.println(getText(file));
}

public static String getText(File file){
    FileInputStream fis = null;
    InputStreamReader isr = null;
    BufferedReader br = null;
    StringBuilder builder = null;
    try {
        fis = new FileInputStream(file);
        // 設定編碼格式
        isr = new InputStreamReader(fis,"utf-8");
        // I/O包裝類,功能增強,一次讀一行
        br = new BufferedReader(isr);
        String str = null;
        builder = new StringBuilder();
        // 一次讀一行
        while((str=br.readLine()) != null){
            builder.append(str);
            builder.append("\r\n");// 換行
        }
    } catch (IOException e){
        e.printStackTrace();
    } finally {
        try {
            br.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    return builder.toString();
}

I/O流包裝類PrintWriter的使用

File file = new File("F:/abc/a.txt");
PrintWriter pw = null;
try {
// true:追加模式
    FileOutputStream fos = new FileOutputStream(file,true);
// utf-8:設定編碼格式
    OutputStreamWriter osw = new OutputStreamWriter(fos,"utf-8:設定編碼格式");
    pw = new PrintWriter(osw);// 例項化PrintWriter
    pw.println("abc");// 寫入字串資料,自帶換行
    pw.print("def");
    pw.print("mon");
} catch (FileNotFoundException e) {
    e.printStackTrace();
} catch (UnsupportedEncodingException e) {
    e.printStackTrace();
}finally{
    pw.close();
}