首頁 > 軟體

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

2022-03-04 19:00:54

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流還有很多方法操作,比如複製檔案、緩衝流(增加緩衝功能,避免頻繁讀寫硬碟)、轉換流(實現位元組流和字元流之間的轉換)、資料流(提供將基礎資料型別寫入到檔案中,或者讀取出來)等等

本篇文章就到這裡了,希望能夠給你帶來幫助,也希望您能夠多多關注it145.com的更多內容!  


IT145.com E-mail:sddin#qq.com