溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Java的File類和IO流實(shí)例分析

發(fā)布時(shí)間:2022-03-15 09:08:56 來(lái)源:億速云 閱讀:145 作者:iii 欄目:開發(fā)技術(shù)

本文小編為大家詳細(xì)介紹“Java的File類和IO流實(shí)例分析”,內(nèi)容詳細(xì),步驟清晰,細(xì)節(jié)處理妥當(dāng),希望這篇“Java的File類和IO流實(shí)例分析”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來(lái)學(xué)習(xí)新知識(shí)吧。

    IO流:

    IO流概述:

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

    :是一種抽象概念,是對(duì)數(shù)據(jù)傳輸?shù)目偡Q。也就是說(shuō)數(shù)據(jù)在設(shè)備間的傳輸稱為流,流的本質(zhì)是數(shù)據(jù)傳輸IO流就是用來(lái)處理設(shè)備間數(shù)據(jù)傳輸問(wèn)題的, 常見的應(yīng)用:文件復(fù)制;文件上傳;文件下載等等,總而言之,涉及到傳輸?shù)?,都涉及到流?/p>

    IO流體系圖:

    Java的File類和IO流實(shí)例分析

    Java的File類和IO流實(shí)例分析

    既然IO是涉及文件的操作,那么一定離不開文件操作的技術(shù):

    File類:

    File 類是 java.io 包中唯一代表磁盤文件本身的對(duì)象。File 類定義了一些方法來(lái)操作文件,主要用來(lái)獲取或處理與磁盤文件相關(guān)的信息,像文件名、 文件路徑、訪問(wèn)權(quán)限和修改日期等,還可以瀏覽子目錄層次結(jié)構(gòu)。

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

    先看一張F(tuán)ile類常用的方法總匯圖:

    Java的File類和IO流實(shí)例分析

    使用createNewFile()創(chuàng)建一個(gè)文件:

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

    如果執(zhí)行后,該目錄沒(méi)有這個(gè)文件,那么會(huì)創(chuàng)建一個(gè),并且返回true,如果已經(jīng)存在了,就會(huì)返回false,代表創(chuàng)建失敗。

    Java的File類和IO流實(shí)例分析

    使用mkdir()創(chuàng)建一個(gè)目錄:

    File file2 = new File("G://a");
    	System.out.println(file2.mkdir());   
    //創(chuàng)建一個(gè)目錄,如果沒(méi)有存在則新建一個(gè),并且返回True,如果存在了就返回false

    使用mkdirs()創(chuàng)建多級(jí)目錄:

    File file3 = new File("G://a//b//c");
            System.out.println(file3.mkdirs());   
    //創(chuàng)建多級(jí)目錄,如果沒(méi)有存在則新建一個(gè),并且返回True,如果存在了就返回false

    Java的File類和IO流實(shí)例分析

    接著我們需要使用IO流里面的功能對(duì)文件進(jìn)行輸入和輸出:

    先介紹四個(gè)常用的流:

    • 字節(jié)輸入流:InputStream

    • 字節(jié)輸出流:OutputStream

    • 字符輸入流:Reader

    • 字符輸出流:Writer

    為什么會(huì)有字節(jié)和字符兩種流呢?

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

    UTF-8 編碼中,一個(gè)英文字為一個(gè)字節(jié),一個(gè)中文為三個(gè)字節(jié)。

    Unicode 編碼中,一個(gè)英文為一個(gè)字節(jié),一個(gè)中文為兩個(gè)字節(jié)。

    所以我們知道計(jì)算機(jī)讀取數(shù)據(jù)是一個(gè)一個(gè)的讀取,當(dāng)文件里面是數(shù)字或者英文的時(shí)候,因?yàn)槎颊剂艘粋€(gè)字節(jié),所以可以正常讀取出來(lái)。

    那么如果是漢字呢?最少也占了兩個(gè)字節(jié),如果把一個(gè)漢字拆分讀取,顯示出來(lái)肯定是有問(wèn)題的。

    小結(jié):如果數(shù)據(jù)通過(guò)Window自帶的記事本軟件打開,我們還可以讀懂里面的內(nèi)容,就使用字符流,否則使用字節(jié)流。如果你不知道該使用哪種類型的流,就使用字節(jié)流!

    下面是四種流對(duì)應(yīng)功能的方法名總匯表:

    Java的File類和IO流實(shí)例分析

    字節(jié)輸出流:

    我們使用字節(jié)輸出流給abc.txt文件里面寫一句話:

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

    運(yùn)行后:

    Java的File類和IO流實(shí)例分析

    字節(jié)輸入流(從文件讀取到控制臺(tái)):

    我們知道如果文件內(nèi)是漢字,使用字節(jié)輸入流,那么顯示的肯定是亂碼,如果現(xiàn)在文件里面是“我愛中國(guó)”這四個(gè)字,使用下面這段代碼:

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

    輸出的結(jié)果是:

    Java的File類和IO流實(shí)例分析

    然后把文件內(nèi)信息換成英文和數(shù)字:

    Java的File類和IO流實(shí)例分析

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

    字符輸出流:

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

    public class test03 {
        public static void main(String[] args) {
            try{
                //使用字符輸出流的FileWriter寫入數(shù)據(jù)
                Writer fw = new FileWriter("G://abc.txt");
                fw.write("我們?cè)趯W(xué)Java");
                fw.write("一起加油");
                fw.close(); //關(guān)閉資源
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    Java的File類和IO流實(shí)例分析

    也沒(méi)用問(wèn)題,我們發(fā)現(xiàn),使用字符流寫中文漢字更方便。

    字符輸入流:

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

    public class test04 {
        public static void main(String[] args) throws IOException {
            //創(chuàng)建字符輸入流對(duì)象:
            Reader fr = null;
            try{
                fr = new FileReader("G:/abc.txt");
                //借助字符流對(duì)象創(chuàng)建了字符緩存區(qū) 把字符一個(gè)一個(gè)的取到后先放到緩存區(qū)
                //然后一起再讀寫到程序內(nèi)存來(lái),效率更高
                BufferedReader br = new BufferedReader(fr);
                //先去緩存區(qū)一行一行的讀取
                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();
                }
            }
        }

    當(dāng)文件內(nèi)的信息為多行的時(shí)候:

    Java的File類和IO流實(shí)例分析

    字節(jié)流和字符流總結(jié):

    • IO是文件的輸入和輸出,我們要想去對(duì)文件或者寫,或者通過(guò)程序發(fā)送消息給另外的用戶都要用到流。

    • IO流分 字節(jié)流和字符流,字節(jié)流是以字節(jié)為單位IO,字符流是以字符為單位IO;通常讀寫圖片、視頻音頻等用字節(jié) 流,如果讀寫文件的內(nèi)容比如中文建議用字符流。

    讀到這里,這篇“Java的File類和IO流實(shí)例分析”文章已經(jīng)介紹完畢,想要掌握這篇文章的知識(shí)點(diǎn)還需要大家自己動(dòng)手實(shí)踐使用過(guò)才能領(lǐng)會(huì),如果想了解更多相關(guān)內(nèi)容的文章,歡迎關(guān)注億速云行業(yè)資訊頻道。

    向AI問(wèn)一下細(xì)節(jié)

    免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

    AI