溫馨提示×

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

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

Java中I/O輸入輸出實(shí)例分析

發(fā)布時(shí)間:2022-08-03 16:01:43 來源:億速云 閱讀:163 作者:iii 欄目:開發(fā)技術(shù)

這篇文章主要介紹“Java中I/O輸入輸出實(shí)例分析”,在日常操作中,相信很多人在Java中I/O輸入輸出實(shí)例分析問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對(duì)大家解答”Java中I/O輸入輸出實(shí)例分析”的疑惑有所幫助!接下來,請(qǐng)跟著小編一起來學(xué)習(xí)吧!

    前言

    在變量、數(shù)組和對(duì)象中存儲(chǔ)的數(shù)據(jù)是暫時(shí)存在的,程序結(jié)束后它們就會(huì)丟失。為了能夠永久地保存創(chuàng)建的數(shù)據(jù),需要將其保存在磁盤文件中,這樣就可以在其他程序中使用它們。Java的I/O技術(shù)可以將數(shù)據(jù)保存到文本文件、二進(jìn)制文件甚至是ZIP壓縮文件中,已達(dá)到永久性保存數(shù)據(jù)的要求。掌握I/O處理技術(shù)能夠提高對(duì)數(shù)據(jù)的處理能力。

    一、流概述

    流是一組有序的數(shù)據(jù)序列,根據(jù)操作的類型,可分為輸入流和輸出流兩種。I/O(Input/Output,輸入/輸出)流提供了一條通道程序,可以使用這條通道把源中的字節(jié)序列送到目的地。雖然I/O流通常與磁盤文件存取有關(guān),但是程序的源和目的地也可以是鍵盤、鼠標(biāo)、內(nèi)存或顯示器窗口等。
    Java由數(shù)據(jù)流處理輸入/輸出模式,程序從指向源的輸入流中讀取源中的數(shù)據(jù),源可以是文件、網(wǎng)絡(luò)、壓縮包或其他數(shù)據(jù)源。
    輸出流的指向是數(shù)據(jù)要到達(dá)的目的地,程序通過向輸出流中寫入數(shù)據(jù)把信息傳遞到目的地。

    二、輸入/輸出流

    Java語言定義了許多類專門負(fù)責(zé)各種方式的輸入/輸出,這類類都被放在java.io包中。其中,所有輸入流類都是抽象類InputStream(字節(jié)輸入流)或抽象類Reader(字符輸入流)的子類;而所有輸出流都是抽象類OutputStream(字節(jié)輸出流)或抽象類Writer(字符輸出流)的子類。

    1、輸入流

    InputStream類是字節(jié)輸入流的抽象類,是所有字節(jié)輸入流的父類。InputStream類的具體層次結(jié)構(gòu)如下所示。
    該類中所有方法遇到錯(cuò)誤時(shí)都會(huì)引發(fā)IOException異常。下面是對(duì)該類中的一些方法的簡要說明。

    read()方法:從輸入流中讀取數(shù)據(jù)的下一個(gè)字節(jié)。返回0-255范圍內(nèi)的int字節(jié)值。如果因?yàn)橐呀?jīng)到達(dá)流末尾而沒有可用的字節(jié),則返回值為-1。
    read(byte[] b):從輸入流中讀入一定長度的字節(jié),并以整數(shù)的形式返回字節(jié)數(shù)。
    mark(int readlimit)方法:在輸入流的當(dāng)前位置放置一個(gè)標(biāo)記,readlimit參數(shù)告知此輸入流在標(biāo)記位置失效之前允許讀取的字節(jié)數(shù)。
    reset()方法:將輸入指針返回到當(dāng)前所做的標(biāo)記處。
    skip(long n)方法:跳過輸入流上的n個(gè)字節(jié)并返回實(shí)際跳過的字節(jié)數(shù)。
    markSupported()方法:如果當(dāng)前流支持mark()/reset()操作就返回true。
    close方法:關(guān)閉此輸入流并釋放與該流關(guān)聯(lián)的所有系統(tǒng)資源。

    Java中的字符是Unicode編碼,是雙字節(jié)的。InputStream是用來處理字節(jié)的,并不適合處理字符文本。Java為字符文本的輸入專門提供了一套單獨(dú)的類Reader,但Reader類并不是InputStream類的替換者,只是處理字符串時(shí)簡化了編程。Reader類是字符輸入流的抽象類,所有字符輸入流的實(shí)現(xiàn)都是它的子類。

    Reader類中的方法與InputStream類中的方法類似,讀者在需要時(shí)可查看JDK文檔。

    2、輸出流

    OutputStream類是字節(jié)輸出流的抽象類,此抽象類是表示輸出字節(jié)流的所有類的超類。
    OutputStream類中的所有方法均返回void,在遇到錯(cuò)誤時(shí)會(huì)引發(fā)IoException異常。下面對(duì)OutputStream類中的方法作簡單的介紹。

    write(int b)方法:將指定的字節(jié)寫入此輸出流。
    write(byte[] b)方法:將b個(gè)字節(jié)從指定的byte數(shù)組寫入此輸出流。
    write(byte[] b,int off, int len)方法:將指定byte數(shù)組中從偏移量off開始的len個(gè)字節(jié)寫入此輸出流。
    flush()方法:徹底完成輸出并清空緩存區(qū)。
    close()方法:關(guān)閉輸出流。

    三、File類

    File類是java.io包中唯一代表磁盤文件本身的對(duì)象。File類定義了一些與平臺(tái)無關(guān)的方法來操作文件,可以通過調(diào)用File類中的方法,實(shí)現(xiàn)創(chuàng)建、刪除、重命名文件等操作。File類的對(duì)象主要用來獲取文件本身的一些信息,如文件所在的目錄、文件的長度、文件讀寫權(quán)限等。數(shù)據(jù)流可以將數(shù)據(jù)寫入到文件中,文件也是數(shù)據(jù)流最常用的數(shù)據(jù)媒體。

    1、文件的創(chuàng)建與刪除

    可以使用File類創(chuàng)建一個(gè)文件對(duì)象。通常使用以下3種構(gòu)造方法來創(chuàng)建文件對(duì)象。

    1、File(String pathname)

    該構(gòu)造方法通過將給定路徑名字符串轉(zhuǎn)換為抽象路徑名來創(chuàng)建一個(gè)新File實(shí)例。

    語法如下:

    new File(String pathname);

    其中,pathname指定路徑名稱(包含文件名)。例如:

    File file = new File(“d:/1.txt”);

    2、File(String parent,String child)

    該構(gòu)造方法根據(jù)定義的父路徑和子路徑字符串(包含文件名)創(chuàng)建一個(gè)新的File對(duì)象。

    語法如下:

    new File(String parent,String child);

    3、File(File f,String child)

    該構(gòu)造方法根據(jù)Parent抽象路徑名和child路徑名字符串創(chuàng)建一個(gè)新的File實(shí)例。

    語法如下:

    new File(File f,String child);

    2、獲取文件信息

    File類提供了很多方法用于獲取一些文件本身的信息。如下表

    方法| 返回值 | 說明
    -------- | -----
    getName() | String| 獲取文件的名稱
    canReda()| boolean |判斷文件是否為可讀的
    canWrite()| boolean | 判斷文件是否可被寫入
    exits()|boolean | 判斷文件是否存在
    length()|long | 獲取文件的長度(以字節(jié)為單位)
    getAbsolutePath() | String | 獲取文件的絕對(duì)路徑
    getParent() | String | 獲取文件的父路徑
    isFile() | boolean | 判斷文件是否存在
    isDirectory() | boolean | 判斷文件是否為一個(gè)目錄
    isHidden() | boolean | 判斷文件是否為隱藏文件
    lastModified() | long | 獲取文件最后修改時(shí)間

    四、文件輸入/輸出流

    程序運(yùn)行期間,大部分?jǐn)?shù)據(jù)都在內(nèi)存中進(jìn)行操作,當(dāng)程序結(jié)束或關(guān)閉時(shí),這些數(shù)據(jù)將消失。如果需要將數(shù)據(jù)永久保存,可使用文件輸入/輸出流與指定的文件建立連接,將需要的數(shù)據(jù)永久保存到文件中。

    1、FillInputStream與FileOutputStream類

    FileInputStream類與FileOUtputStream類都用來操作磁盤文件。如果用戶的文件讀取需求比較簡單,則可以使用FileInputString類,該類繼承自InputString類。FileOutputStream類與FileInputStream類對(duì)應(yīng),提供了基本的文件寫入能力。FileOutputStream類是OutputStream類的子類。
    FileInputStream類常用的構(gòu)造方法如下:

    FileInputStream(String name)
    FileInputStream(File file)

    2、FileReader和FileWriter類

    使用FileOutputStream類向文件中寫入數(shù)據(jù)與使用FileInputStream類從文件中將內(nèi)容讀出來,都存在一點(diǎn)不足,即這兩個(gè)類都只提供了對(duì)字節(jié)或字節(jié)數(shù)組的讀取方法。由于漢子在文件中占用兩個(gè)字節(jié),如果使用字節(jié)流,讀取不好可能會(huì)出現(xiàn)亂碼現(xiàn)象,此時(shí)采用字符流Reader或Writer類即可避免這種現(xiàn)象。

    FileReader和FileWriter字符流對(duì)應(yīng)了FileInputStream和FileOutputStream類。FileReader流順序地讀取文件,只要不關(guān)閉流,每次調(diào)用read()方法就順序地讀取源中其余的內(nèi)容,直到源的末尾或流被關(guān)閉。

    五、帶緩存的輸入/輸出流

    緩存是I/O的一種性能優(yōu)化。緩存流為I/O流增加了內(nèi)存緩存區(qū)。有了緩存區(qū),使得在流上執(zhí)行skip()、mark()和reset()方法都成為可能。

    1、BufferedInputStream與BufferedOutputStream類

    BufferedInputStream類可以對(duì)所有InputStream類進(jìn)行帶緩沖區(qū)的包裝以達(dá)到性能的優(yōu)化。BufferedInputStream類有兩個(gè)構(gòu)造方法:

    BufferedInputStream(InputStream in)
    BufferedInputStream(InputStream in,int size)

    第一種構(gòu)造方法創(chuàng)建一個(gè)有32個(gè)字節(jié)的緩存區(qū),第二種構(gòu)造方法以指定的大小來創(chuàng)建緩存區(qū)。

    2、BufferedReader與BufferedWriter類

    BufferedReader類與BufferedWriter類分別繼承Reader類與Writer類。這兩個(gè)類同樣具有內(nèi)部緩存機(jī)制,并可以以行為單位進(jìn)行輸入/輸出。

    六、數(shù)據(jù)輸入/輸出流

    數(shù)據(jù)輸入/輸出流(DataInputStream類與DataOutputStream類)允許應(yīng)用程序以與機(jī)器無關(guān)的方式從底層輸入流中讀取基本Java數(shù)據(jù)類型。也就是說,當(dāng)讀取一個(gè)數(shù)據(jù)時(shí),不必再關(guān)心這個(gè)數(shù)值應(yīng)當(dāng)是哪種字節(jié)。

    七、ZIP壓縮輸入/輸出流

    ZIP壓縮管理文件(ZIP archive)是一種十分典型的文件壓縮形式,使用它可以節(jié)省存儲(chǔ)空間。關(guān)于ZIP壓縮的I/O實(shí)現(xiàn),在Java的內(nèi)置類中提供了非常好用的相關(guān)類,所以其實(shí)現(xiàn)方式非常簡單。本節(jié)將介紹使用java.util.zip包中的ZipOutputStream與ZipInputStream類來實(shí)現(xiàn)文件的壓縮/解壓縮。如要從ZIP壓縮管理文件內(nèi)讀取某個(gè)文件,要先找到對(duì)應(yīng)文件的“目錄進(jìn)入點(diǎn)”(從它可知該文件在ZIP文件內(nèi)的位置),才能讀取這個(gè)文件的內(nèi)容。如果要將文件內(nèi)容寫入ZIP文件內(nèi),必須先寫入對(duì)應(yīng)于該文件的“目錄進(jìn)入點(diǎn)”,并且把要寫入文件內(nèi)容的位置移到此進(jìn)入點(diǎn)所指的位置,然后再寫入文件內(nèi)容。

    Java實(shí)現(xiàn)了I/O數(shù)據(jù)流與網(wǎng)絡(luò)數(shù)據(jù)流的單一接口,因此數(shù)據(jù)的壓縮、網(wǎng)絡(luò)傳輸和解壓縮的實(shí)現(xiàn)比較容易。ZipEntry類產(chǎn)生的對(duì)象,是用來代表一個(gè)ZIP壓縮文件內(nèi)的進(jìn)入點(diǎn)(entry)。ZipInputStream用來寫出ZIP壓縮格式的文件,所支持的包括已壓縮及未壓縮的進(jìn)入點(diǎn)(entry)。

    ZipOutputStream類用來寫出ZIp壓縮格式的文件,而且所支持的包括已壓縮及未壓縮的進(jìn)入點(diǎn)(entry)。下面介紹利用ZipEntry、

    ZipInputStream和ZipOutputStream3個(gè)Java類實(shí)現(xiàn)ZIP數(shù)據(jù)壓縮方式的編程方法。

    1、壓縮文件

    利用ZipOutputStream類對(duì)象,可將文件壓縮為.zip文件。ZipOutputStream類的構(gòu)造方法如下:

    ZipOutputStram(OutputStream out);

    ZipOutputStream類的常用方法如表所示:

    方法返回值說明
    putNextEntry(ZipEntry e)void開始寫一個(gè)新的ZipEntry,并將流內(nèi)的位置移至此entry所指數(shù)據(jù)的開頭
    write(byte[] b,int off,int len)void將字節(jié)數(shù)組寫入當(dāng)前ZIP條目數(shù)據(jù)
    finish()void完成寫入ZIP輸出流的內(nèi)容,無須關(guān)閉它所配合的OutputStream
    setComment(String comment)void可設(shè)置此ZIP文件的注釋文字

    2、解壓縮ZIP文件

    ZipInputStream類可讀取ZIP壓縮格式的文件,包括已壓縮和未壓縮的條目(entry)。ZipInputStream類的構(gòu)造方法如下:

    ZipInputStream(InputStream in)

    ZipInputStream類的常用方法如下表所示:

    方法返回值說明
    read(byte[] b, int off , int len)int讀取目標(biāo)b數(shù)組內(nèi)off偏移量的位置,長度是len字節(jié)
    available()int判斷是否已讀完目前entry所指定的數(shù)據(jù)。已讀完返回0,否則返回1
    closeEntry()void關(guān)閉當(dāng)前ZIP條目并定位流以讀取下一個(gè)條目
    skip(long n)long跳過當(dāng)前ZIP條目中指定的字節(jié)數(shù)
    getNextEntry()ZipEntry讀取下一個(gè)ZipEntry,并將流內(nèi)的位置移至該entry所指數(shù)據(jù)的開頭
    createZipEntry(String name)ZipEntry以指定的name參數(shù)新建一個(gè)ZipEntry對(duì)象

    補(bǔ)充:獲取目錄下的所有目錄和文件

    示例:假設(shè)目錄“D:\TestDir1”下有兩個(gè)文件夾(dir1 和 dir2)和一個(gè)文件 file1.txt 。

    File[] listFiles()方法:獲取該目錄下的所有子目錄和文件,返回File類數(shù)組。

    import java.io.File;
     
    /**
     * 獲取目錄下的所有目錄和文件
     * @author pan_junbiao
     **/
    public class DirFileTest
    {
        public static void main(String[] args)
        {
            File file = new File("D:\\TestDir1");
     
            //判斷目錄是否存在
            if (!file.exists())
            {
                System.out.println("目錄不存在");
                return;
            }
     
            //獲取文件數(shù)組
            File[] fileList = file.listFiles();
            for (int i = 0; i < fileList.length; i++)
            {
                //判斷是否為目錄
                if (fileList[i].isDirectory())
                {
                    System.out.println("目錄:" + fileList[i].getName());
                }
                else
                {
                    System.out.println("文件:" + fileList[i].getName());
                }
            }
        }
    }

    執(zhí)行結(jié)果:

    Java中I/O輸入輸出實(shí)例分析

    到此,關(guān)于“Java中I/O輸入輸出實(shí)例分析”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注億速云網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)砀鄬?shí)用的文章!

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

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

    AI