JAVA學習線路:day11-IO流[1]

全部的文檔和源代碼都開源在GitHub: https://github.com/kun213/DailyCode上了。但願咱們能夠一塊兒加油,一塊兒學習,一塊兒交流。java

day11【IO流】

今日學習內容-2020.10.10

@git

1、File類

一、可以說出File對象的建立方式

File類的構造方法github

  • public File(String pathname) ` :經過將給定的路徑名字符串轉換爲抽象路徑名來建立新的 File實例。
  • public File(String parent,String child) :從父路徑名字符串和子路徑名字符串建立新的 File實例。
  • public File(File parent, String child) :從父抽象路徑名和子路徑名字符串建立新的 File實例。

代碼舉例:算法

/**
 * File類構造方法
 */

public class FileDemo {
    public static void main(String[] args) {
        method_3();
    }
    /**
     * File類構造方法
     *   File(File parent,String child)傳遞File類型的父路徑,和字符串的子路徑
     *   第一個參數是File對象
     */
    public static void method_3(){
        File parent = new File("E:\\JavaEE\\IdeaProjects");
        File file = new File(parent,"basic-code");
        System.out.println(file);
    }

    /**
     * File類構造方法
     *  File(String parent,String child)傳遞字符串的父路徑,和字符串的子路徑
     *  程序中,分的越開越好
     *  單獨操做父路徑,單獨操做子路徑
     */
    public static void method_2(){
        File file = new File("E:\\JavaEE\\IdeaProjects","basic-code");
        System.out.println(file);
    }

    /**
     * File類構造方法
     *   File(String path)傳遞字符串的路徑
     */
    public static void method_1(){
        File file = new File("E:\\JavaEE\\IdeaProjects\\basic-code");
        System.out.println(file);
    }
}

注意數組

  1. 一個File對象表明硬盤中實際存在的一個文件或者目錄。
  2. 不管該路徑下是否存在文件或者目錄,都不影響File對象的建立。

二、可以使用File類經常使用方法

File類的獲取方法ide

  • public String getAbsolutePath() :返回此File的絕對路徑名字符串。
  • public String getPath() :將此File轉換爲路徑名字符串。
  • public String getName() :返回由此File表示的文件或目錄的名稱。
  • public long length() :返回由此File表示的文件的長度。
  • public File getParentFile()返回由此File表示的文件或目錄的父目錄,若是沒有父目錄,返回null。

代碼舉例:函數

/**
 * File類的獲取方法
 *   基本上都是get開頭
 */
public class FileDemo {
    public static void main(String[] args) {
            method_5();
    }
    /**
     *  String getPath() 將構造方法中的路徑,轉成字符串
     */
    public static void method_5(){
        File file = new File("E:\\JavaEE\\IdeaProjects\\basic-code");
        String path = file.getPath();
        System.out.println(path.toString());
    }

    /**
     *  File getAbsoluteFile() 返回File構造方法中路徑的絕對路徑形式
     *  返回值是File對象
     *
     *  注意: 直接傳遞文件名,或者文件夾名
     *  獲取到的絕對路徑,將從IDEA的工程下計算
     */
    public static void method_4(){
        File file = new File("1.txt");
        File abso = file.getAbsoluteFile();
        System.out.println(abso);
    }

    /**
     * long length() 獲取File構造方法中路徑表示的文件的字節數
     */
    public static void method_3(){
      File file = new File("E:\\開始學習的Java筆記和代碼\\測試io\\1.txt");
        long l = file.length();
        System.out.println(l);
    }
    /**
     * File getParentFile()  獲取,構造方法中封裝的路徑的父路徑
     * 上一級文件夾
     * 方法的返回值是File對象,能夠方法調用鏈
     * 若是此路徑名沒有父目錄,則返回 null。
     */
    public static void method_2(){
        File file = new File("E:\\JavaEE\\IdeaProjects\\basic-code");
        File parent = file.getParentFile().getParentFile();//方法調用鏈
        System.out.println(parent);
    }
    /**
     * String getName() 返回名字
     * 獲取了,構造方法中封裝路徑,最後的名稱
     * 名稱多是文件夾名,多是文件名
     */
    public static void method_1(){
        File file = new File("E:\\JavaEE\\IdeaProjects\\basic-code");
        String name = file.getName();
        System.out.println(name);
    }
}

三、可以辨別相對路徑和絕對路徑

  • 絕對路徑:從盤符開始的路徑,這是一個完整的路徑,絕對路徑具備惟一性。
  • 相對路徑:相對於項目目錄的路徑,這是一個便捷的路徑,開發中常用。
public static void main(String[] args) {
    // D盤下的bbb.java文件
    File f = new File("D:\\bbb.java");
    System.out.println(f.getAbsolutePath());

    // 項目下的bbb.java文件
    File f2 = new File("bbb.java");
    System.out.println(f2.getAbsolutePath());
}

四、可以遍歷文件夾

  • public File[] listFiles()返回一個File數組,表示該File目錄中的全部的子文件或目錄、
  • public File[] listFiles(FileFilter filter)返回一個File數組,表示該File目錄中的全部的子文件或目錄,filter是文件過濾器,能夠過濾不須要的文件。
public static void main(String[] args) {
    File dir = new File("d:\\java_code");
    //獲取當前目錄下的文件以及文件夾對象,只要拿到了文件對象,那麼就能夠獲取更多信息
    File[] files = dir.listFiles();
    for (File file : files) {
    	System.out.println(file);
    }
}

FileFilter接口學習

文件過濾器接口,此接口的實現類能夠傳遞給方法listFiles(),實現文件的過濾功能測試

FileFilter接口方法:線程

public boolean accept(File path):方法參數就是listFiles()方法獲取到的文件或者目錄的路徑。若是方法返回true,表示須要此路徑,不然此路徑將被忽略。

遍歷目錄,獲取全部的Java文件

public static void main(String[] args){
    File dir = new File("d:\\demo");
    File[] files = dir.listFiles(new FileFilter() {
    @Override
    public boolean accept(File pathname) {
        //判斷若是獲取到的是目錄,直接放行
        if(pathname.isDirectory())
        return true;
        //獲取路徑中的文件名,判斷是否java結尾,是就返回true
        //.toLowerCase是String 中的全部字符都轉換爲小寫
        return pathname.getName().toLowerCase().endsWith("java");
      }
    });
    for(File file : files){
    	System.out.println(file);
    }
}

2、方法遞歸

一、可以解釋遞歸的含義

/**
 * 方法的遞歸調用: 編寫程序上一個手段
 * 方法本身調用本身,具備方法語言,均可以使用遞歸
 * 解決問題:
 *   目錄遍歷案例,功能是肯定的,就是制定目錄進行遍歷
 *   遍歷的目錄,每次可能不一樣
 *
 *   功能的計算主體明確,計算中的參數每次是變化
 *
 *   方法自身調用注意事項:
 *     1: 不能是死遞歸,方法不停的進棧,不會出去,內存滿了,溢出
 *     2: 遞歸必定要有出口,能結束.可是若是進棧的方法過多也不能夠
 *
 */

二、可以使用遞歸的方式計算5的階乘

分析:分析:n的階乘:n! = n * (n-1) ... 3 * 2 * 1

實現代碼:

public class JieChengDemo {
    public static void main(String[] args) {
        int jieCheng = getJieCheng(5);
        System.out.println(jieCheng);
    }
    /**
    經過遞歸算法實現.
    參數列表:int
    返回值類型: int
     */
    public static int getJieCheng(int num){
         /*
        num爲1時,方法返回1,
        至關因而方法的出口,num總有是1的狀況
           */
        if (num == 1){
            return 1;
        }else {
             /*
            num不爲1時,方法返回 num +(num-1)的累和
            遞歸調用getJieCheng方法
              */
            return num * getJieCheng(num-1);
        }
    }

1~N遞歸求和的代碼執行圖解:

注意:遞歸必定要有條件限定,保證遞歸可以中止下來,不然就是死遞歸。遞歸次數不要太多,不然會發生棧內存溢出,會拋出StackOverflowError錯誤。

三、可以說出使用遞歸會內存溢出隱患的緣由

函數調用的參數是經過棧空間來傳遞的,在調用過程當中會佔用線程的棧資源。

遞歸調用只有走到最後的結束點後函數才能依次退出,而未到達最後的結束點以前,佔用的棧空間一直沒有釋放,若是遞歸調用次數過多,就可能致使佔用的棧資源超過線程的最大值,從而致使棧溢出,致使程序的異常退出。

3、IO流

一、可以說出IO流的分類和功能

根據數據的流向分爲:輸入流輸出流

  • 輸入流 :把數據從其餘設備上讀取到內存中的流。
  • 輸出流 :把數據從內存 中寫出到其餘設備上的流。

格局數據的類型分爲:字節流字符流

  • 字節流 :以字節爲單位,讀寫數據的流。
  • 字符流 :以字符爲單位,讀寫數據的流。

4、字節流

使用字節流能夠進行任何文件的複製,由於字節流操做的是組成文件的最小單元-字節。

複製原理圖解:

代碼實現

/**
 * 字節流複製文件,任意文件
 * 不能是文件夾
 */ 
public static void main(String[] args) throws IOException {
     // 1.建立流對象
     // 1.1 指定數據源
     FileInputStream fis = new FileInputStream("D:\\test.jpg");
     // 1.2 指定目的地
     FileOutputStream fos = new FileOutputStream("test_copy.jpg");

     // 2.讀寫數據
     // 2.1 定義數組
     byte[] b = new byte[1024];
     // 2.2 定義長度
     int len;
     // 2.3 循環讀取
     while ((len = fis.read(b))!=-1) {
         // 2.4 寫出數據
         fos.write(b, 0 , len);
     }

     // 3.關閉資源
     fos.close();
     fis.close();
}

5、字節緩衝流

一、可以使用字節流緩衝流複製文件

緩衝流:針對基礎流對象進行高效處理的流對象。或者爲基礎流增長功能。

字節緩衝流BufferedInputStreamBufferedOutputStream

緩衝流的基本原理,是在建立流對象時,會建立一個內置的默認大小的緩衝區數組,經過緩衝區讀寫,減小系統IO次數,從而提升讀寫的效率。

構造方法

  • public BufferedInputStream(InputStream in) :建立一個 新的緩衝輸入流。
  • public BufferedOutputStream(OutputStream out): 建立一個新的緩衝輸出流。
// 建立字節緩衝輸入流
BufferedInputStream bis = new BufferedInputStream(new FileInputStream("bis.txt"));
// 建立字節緩衝輸出流
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("bos.txt"));

注意:在使用緩衝流時,必須傳遞基礎流。

代碼實現:緩衝流+數組方式:

public static void main(String[] args) throws FileNotFoundException {
    // 記錄開始時間
    long start = System.currentTimeMillis();
    // 建立流對象
    BufferedInputStream bis = new BufferedInputStream(new FileInputStream("jdk8.exe"));
    BufferedOutputStream bos = new BufferedOutputStream(new           FileOutputStream("copy.exe"));
    
    // 讀寫數據
    int len = 0;
    byte[] bytes = new byte[8*1024];
    while ((len = bis.read(bytes)) != -1) {
    	bos.write(bytes, 0 , len);
    }
    
    // 記錄結束時間
    long end = System.currentTimeMillis();
    System.out.println("緩衝流使用數組複製時間:"+(end - start)+" 毫秒");
}
緩衝流使用數組複製時間:666 毫秒
ew BufferedOutputStream(new           FileOutputStream("copy.exe"));
    
    // 讀寫數據
    int len = 0;
    byte[] bytes = new byte[8*1024];
    while ((len = bis.read(bytes)) != -1) {
    	bos.write(bytes, 0 , len);
    }
    
    // 記錄結束時間
    long end = System.currentTimeMillis();
    System.out.println("緩衝流使用數組複製時間:"+(end - start)+" 毫秒");
}
緩衝流使用數組複製時間:666 毫秒
相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息