Java的File類和IO流其實真的不難

IO流:

IO流概述:

IO:輸入/輸出(Input/Output)

:是一種抽象概念,是對數據傳輸的總稱。也就是說數據在設備間的傳輸稱為流,流的本質是數據傳輸IO流就是用來處理設備間數據傳輸問題的, 常見的應用:文件復制;文件上傳;文件下載等等,總而言之,涉及到傳輸的,都涉及到流。

IO流體系圖:

在這裡插入圖片描述

在這裡插入圖片描述

既然IO是涉及文件的操作,那麼一定離不開文件操作的技術:

File類:

File 類是 java.io 包中唯一代表磁盤文件本身的對象。File 類定義瞭一些方法來操作文件,主要用來獲取或處理與磁盤文件相關的信息,像文件名、 文件路徑、訪問權限和修改日期等,還可以瀏覽子目錄層次結構。

File 類表示處理文件和文件系統的相關信息。File 類不具有從文件讀取信息和向文件寫入信息的功能,它僅描述文件本身的屬性。所以和IO搭配在一起進行讀出和寫入的操作。

先看一張File類常用的方法總匯圖:

在這裡插入圖片描述

使用createNewFile()創建一個文件:

public class test01 {
    public static void main(String[] args) throws IOException {
		//先建立一個File對象,並傳入路徑
        File file1 = new File("G://abc.txt");
        //創建空文件,如果沒有存在則新建一個,並且返回True,如果存在瞭就返回false
        System.out.println(file1.createNewFile());   
}        

如果執行後,該目錄沒有這個文件,那麼會創建一個,並且返回true,如果已經存在瞭,就會返回false,代表創建失敗。

在這裡插入圖片描述

使用mkdir()創建一個目錄:

File file2 = new File("G://a");
	System.out.println(file2.mkdir());   
//創建一個目錄,如果沒有存在則新建一個,並且返回True,如果存在瞭就返回false

使用mkdirs()創建多級目錄:

File file3 = new File("G://a//b//c");
        System.out.println(file3.mkdirs());   
//創建多級目錄,如果沒有存在則新建一個,並且返回True,如果存在瞭就返回false

在這裡插入圖片描述

接著我們需要使用IO流裡面的功能對文件進行輸入和輸出:

先介紹四個常用的流:

  • 字節輸入流:InputStream
  • 字節輸出流:OutputStream
  • 字符輸入流:Reader
  • 字符輸出流:Writer

為什麼會有字節和字符兩種流呢?

ASCII 碼中,一個英文字母(不分大小寫)為一個字節,一個中文漢字為兩個字節。

UTF-8 編碼中,一個英文字為一個字節,一個中文為三個字節。

Unicode 編碼中,一個英文為一個字節,一個中文為兩個字節。

所以我們知道計算機讀取數據是一個一個的讀取,當文件裡面是數字或者英文的時候,因為都占瞭一個字節,所以可以正常讀取出來。
那麼如果是漢字呢?最少也占瞭兩個字節,如果把一個漢字拆分讀取,顯示出來肯定是有問題的。

小結:如果數據通過Window自帶的記事本軟件打開,我們還可以讀懂裡面的內容,就使用字符流,否則使用字節流。如果你不知道該使用哪種類型的流,就使用字節流!

下面是四種流對應功能的方法名總匯表:

在這裡插入圖片描述

字節輸出流:

我們使用字節輸出流給abc.txt文件裡面寫一句話:

public class test01 {
    public static void main(String[] args) {
        try{
              //創建輸出流對象:
            OutputStream fos = null;
            fos = new FileOutputStream("G://abc.txt");
            String str = "今天的博客是IO流";
            //先將需要寫入的字符打散成數組:
            byte[] words = str.getBytes();
            //使用寫入的功能
            fos.write(words);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

運行後:

在這裡插入圖片描述

字節輸入流(從文件讀取到控制臺):

我們知道如果文件內是漢字,使用字節輸入流,那麼顯示的肯定是亂碼,如果現在文件裡面是“我愛中國”這四個字,使用下面這段代碼:

public class test02 {
    public static void main(String[] args) {
        //創建字節輸入流對象:
        InputStream fis = null;
        try{
            fis = new FileInputStream("G://abc.txt");
            int data;
            //fis.read()取到每一個字節通過Ascll碼表轉換成0-255之間的整數,沒有值返回-1
            while((data=fis.read())!=-1){
                //(char) data 將讀到的字節轉成對應的字符
                //中文的字符是2+個字節組成
                System.out.print((char) data);
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            try{
                fis.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

輸出的結果是:

在這裡插入圖片描述

然後把文件內信息換成英文和數字:

在這裡插入圖片描述

結論:有漢字的文件讀取不能用字節流

字符輸出流:

我們使用字符輸出流給abc.txt文件裡面寫幾句話:

public class test03 {
    public static void main(String[] args) {
        try{
            //使用字符輸出流的FileWriter寫入數據
            Writer fw = new FileWriter("G://abc.txt");
            fw.write("我們在學Java");
            fw.write("一起加油");
            fw.close(); //關閉資源
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

在這裡插入圖片描述

也沒用問題,我們發現,使用字符流寫中文漢字更方便。

字符輸入流:

可以設置緩存流提高獲取值的效率:

public class test04 {
    public static void main(String[] args) throws IOException {
        //創建字符輸入流對象:
        Reader fr = null;
        try{
            fr = new FileReader("G:/abc.txt");
            //借助字符流對象創建瞭字符緩存區 把字符一個一個的取到後先放到緩存區
            //然後一起再讀寫到程序內存來,效率更高
            BufferedReader br = new BufferedReader(fr);
            //先去緩存區一行一行的讀取
            String line = br.readLine();
            while(line != null){
                System.out.println(line);
                line = br.readLine();
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            try {
                fr.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

當文件內的信息為多行的時候:

在這裡插入圖片描述

字節流和字符流總結:

  • IO是文件的輸入和輸出,我們要想去對文件或者寫,或者通過程序發送消息給另外的用戶都要用到流。
  • IO流分 字節流和字符流,字節流是以字節為單位IO,字符流是以字符為單位IO;通常讀寫圖片、視頻音頻等用字節 流,如果讀寫文件的內容比如中文建議用字符流。

總結

IO流還有很多方法操作,比如復制文件、緩沖流(增加緩沖功能,避免頻繁讀寫硬盤)、轉換流(實現字節流和字符流之間的轉換)、數據流(提供將基礎數據類型寫入到文件中,或者讀取出來)等等

本篇文章就到這裡瞭,希望能夠給你帶來幫助,也希望您能夠多多關註WalkonNet的更多內容!  

推薦閱讀: