版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
第7章I/O《Java基礎案例教程》(第3版)學習目標/Target掌握File類的使用方法,能夠創(chuàng)建File對象,并能夠調(diào)用File類的常用方法創(chuàng)建、刪除、判斷和獲取文件,以及對目錄進行遍歷掌握字節(jié)流的使用方法,能夠使用字節(jié)流讀取和寫入文件,并能進行I/O流的資源釋放掌握字符流的使用方法,能夠使用字符流讀取和寫入文件熟悉I/O流,能夠簡述I/O流的概念以及I/O流的繼承體系學習目標/Target熟悉緩沖流的使用方法,能夠使用字符緩沖流和字節(jié)緩沖流讀寫文件熟悉對象流的使用方法,能夠使用對象流讀取和寫入對象類型的數(shù)據(jù)了解CommonsIO,能夠在項目中使用CommonsIO的工具類對文件進行操作熟悉數(shù)據(jù)流的使用方法,能夠使用數(shù)據(jù)流讀取和寫入基本數(shù)據(jù)類型的數(shù)據(jù)章節(jié)概述/
Summary大多數(shù)的應用程序都需要與外部設備進行數(shù)據(jù)交換,例如,從磁盤中讀取文件內(nèi)容、將數(shù)據(jù)寫入磁盤或網(wǎng)絡等。Java將這種在應用程序與外部設備之間的數(shù)據(jù)傳輸抽象表述為“流”。Java中的“流”都位于java.io包中,稱為I/O(輸入輸出)流。本章將針對I/O流的相關知識進行講解。目錄/Contents0102File類I/O流概述0304字節(jié)流字符流目錄/Contents0506緩沖流數(shù)據(jù)流0708對象流CommonsIOFile類7.17.1File類File類是Java中用于對磁盤上的文件和目錄的抽象表示形式的類,它位于java.io包中。通過實例化File對象,可以對文件或目錄進行一些基本的操作,如創(chuàng)建、刪除、重命名、判斷是否存在等,下面對File類進行講解。7.1.1創(chuàng)建File對象
先定一個小目標!掌握創(chuàng)建File對象,能夠使用File的構造方法創(chuàng)建File對象7.1.1創(chuàng)建File對象File類提供了多個構造方法用于創(chuàng)建File對象,常見構造方法如下表所示。方法聲明功能描述File(Stringpathname)通過指定的字符串類型的文件路徑創(chuàng)建File對象File(Stringparent,Stringchild)通過指定的字符串類型的父路徑和子路徑(包括文件名稱)創(chuàng)建File對象File(Fileparent,Stringchild)通過指定的File類的父路徑和字符串類型的子路徑(包括文件名稱)創(chuàng)建File對象7.1.1創(chuàng)建File對象案例演示下面通過一個案例演示如何使用File類提供的構造方法創(chuàng)建一個File對象。Example01.java源代碼7.1.1創(chuàng)建File對象案例演示案例的運行結果如下圖所示。7.1.2File類的常用方法
先定一個小目標!掌握File類的常用方法,能夠使用File類的常用方法判斷和獲取文件、創(chuàng)建和刪除文件、遍歷目錄7.1.2File類的常用方法1.判斷和獲取方法在操作文件或目錄的過程中,經(jīng)常需要對文件或目錄的信息做判斷和獲取操作。例如,判斷給定路徑下是否存在文件或目錄、獲取文件的名稱、大小和路徑等信息。這些操作可以通過File類提供的一系列判斷和獲取方法來實現(xiàn)。7.1.2File類的常用方法1.判斷和獲取方法File類常見的判斷和獲取方法。方法聲明功能描述booleanexists()判斷File對象對應的文件或目錄是否存在,若存在則返回true,否則返回falsebooleanisFile()判斷File對象對應的是否是文件(不是目錄),若是文件則返回true,反之返回falsebooleanisDirectory()判斷File對象對應的是否是目錄(不是文件),若是目錄則返回true,反之返回falsebooleanisAbsolute()判斷File對象對應的文件或目錄是否是絕對路徑booleancanRead()判斷File對象對應的文件是否可以讀取,若可以則返回true,反之返回falsebooleancanWrite()判斷File對象對應的文件是否可以修改,若可以則返回true,反之返回false7.1.2File類的常用方法1.判斷和獲取方法接上頁表格。方法聲明功能描述StringgetName()返回File對象表示的文件或目錄的名稱longlength()返回文件內(nèi)容的長度(單位是字節(jié))longlastModified()返回1970年1月1日0時0分0秒到文件最后修改時間的毫秒值StringgetPath()返回File對象對應的路徑名字符串StringgetAbsolutePath()返回File對象對應的絕對路徑(在Unix/Linux等系統(tǒng)上,如果路徑是以正斜線/開始,則這個路徑是絕對路徑;在Windows等系統(tǒng)上,如果路徑是從盤符開始,則這個路徑是絕對路徑)StringgetParentFile()返回File對象對應目錄的父目錄(即返回的目錄不包含最后一級子目錄)7.1.2File類的常用方法1.判斷和獲取方法下面通過一個案例演示File類的判斷和獲取方法的使用。首先在項目的src目錄下創(chuàng)建一個名為file的包,然后在file包中創(chuàng)建一個名為example的文本文件,并使用記事本打開后隨便添加一些內(nèi)容并保存。然后編寫案例代碼。Example02.java源代碼7.1.2File類的常用方法1.判斷和獲取方法案例的運行結果如下圖所示。7.1.2File類的常用方法2.創(chuàng)建和刪除方法除了判斷和獲取已存在文件或目錄的信息外,F(xiàn)ile類還提供了用于創(chuàng)建和刪除文件或目錄的方法。方法聲明功能描述booleancreateNewFile()當File對象對應的文件不存在時,該方法將新建一個文件,若創(chuàng)建成功則返回true,否則返回false。booleanmkdir()新建一個目錄,若創(chuàng)建成功則返回true,否則返回falsebooleanmkdirs()新建多級目錄(包括創(chuàng)建所需但不存在的父目錄),若創(chuàng)建成功則返回true,否則返回falsebooleandelete()刪除File對象對應的文件或目錄(不能刪除非空目錄),若刪除成功則返回true,否則返回false7.1.2File類的常用方法2.創(chuàng)建和刪除方法下面通過一個案例演示File類的創(chuàng)建和刪除方法的使用。Example03.java源代碼7.1.2File類的常用方法2.創(chuàng)建和刪除方法案例的運行結果如下圖所示。7.1.2File類的常用方法2.創(chuàng)建和刪除方法接著進入D盤下的file目錄,驗證文件和目錄的創(chuàng)建結果,如下圖所示。7.1.2File類的常用方法3.遍歷目錄通常目錄中可能會包含文件和子目錄,此時如果想要獲取目錄中的所有文件和子目錄的信息,就需要對目錄進行遍歷,F(xiàn)ile類用于遍歷目錄的方法如下表所示。方法聲明功能描述String[]list()獲取當前目錄下所有的一級目錄名稱和文件名稱到一個字符串數(shù)組中File[]listFiles()獲取當前目錄下所有的一級目錄名稱和文件對象到一個文件對象數(shù)組中上面表格中兩個方法都只能返回當前目錄下的一級目錄或文件,也就是說,無法直接獲取當前目錄中子目錄的內(nèi)容。7.1.2File類的常用方法3.遍歷目錄下面通過一個案例演示File類遍歷目錄方法的使用。Example04.java源代碼7.1.2File類的常用方法3.遍歷目錄案例的運行結果如下圖所示。7.1.2File類的常用方法3.遍歷目錄為了實現(xiàn)能夠獲取符合指定條件的文件,F(xiàn)ile類提供了一個重載的list(FilenameFilterfilter)方法,該方法接收一個FilenameFilter類型的參數(shù),用于過濾文件名。FilenameFilter是一個接口,被稱作文件過濾器,其中定義了一個抽象方法accept(Filefile,Stringname),用于依次對指定File的所有子目錄或文件進行迭代。7.1.2File類的常用方法3.遍歷目錄在調(diào)用list(FilenameFilterfilter)方法時,需要實現(xiàn)文件過濾器FilenameFilter,并在accept(Filefile,Stringname)方法中進行篩選,從而獲得指定條件的文件。list(FilenameFilterfilter)方法的工作原理如下:調(diào)用list(FilenameFilterfilter)方法,傳入FilenameFilter文件過濾器對象。遍歷當前File對象所對應目錄的所有子目錄和文件。把代表當前目錄的File對象和子目錄或文件的名稱作為參數(shù),調(diào)用accept(Filefile,Stringname)方法。如果accept(Filefile,Stringname)方法返回true,就將當前子目錄或文件添加入數(shù)組,否則不進行添加。7.1.2File類的常用方法3.遍歷目錄下面通過一個案例演示如何獲取指定目錄下所有擴展名為“.txt”的文件。Example05.java源代碼7.1.2File類的常用方法3.遍歷目錄案例的運行結果如下圖所示。7.1.3遞歸文件搜索
先定一個小目標!掌握遞歸文件搜索,能夠調(diào)用File類的常用方法實現(xiàn)文件的遞歸搜索7.1.3遞歸文件搜索7.1.2節(jié)中遍歷目錄時獲取的都是當前目錄下的文件及子目錄。如果想要獲取當前目錄下子目錄中的內(nèi)容,就可以使用listFiles()方法結合遞歸的方式進行遍歷。具體步驟如下:先調(diào)用listFiles()方法,獲取當前目錄下的一級目錄和文件,得到一個數(shù)組。遍歷數(shù)組,獲取數(shù)組中的File對象。判斷File對象的類別。如果當前File對象是文件,則獲取文件名或路徑并打??;如果File對象是目錄,則獲取目錄名或路徑并打印,然后遞歸執(zhí)行1、2、3步驟。7.1.3遞歸文件搜索案例演示下面通過一個案例演示如何使用遞歸的方式遍歷目錄下的所有文件及子目錄。Example06.java源代碼7.1.3遞歸文件搜索案例演示案例的運行結果如下圖所示。【案例7-1】文件搜索與刪除工具案例描述在日常工作中,經(jīng)常需要在大批量的文件中進行搜索、刪除等操作。如果手動去管理批量文件,會比較浪費時間,工作量也較大。本案例要求編寫一個文件搜索與刪除工具,實現(xiàn)對批量文件的搜索與刪除。具體要求如下:(1)輸入指令1,代表“指定關鍵字搜索文件”,輸入搜索的目錄和關鍵字(多個關鍵字用逗號分隔),系統(tǒng)在指定的目錄下搜索文件名包含關鍵字的文件,并展示其絕對路徑。(2)輸入指令2,代表“指定后綴名搜索文件”,輸入搜索的目錄和關鍵字,系統(tǒng)在指定的目錄下搜索出指定后綴名的所有文件,并展示其絕對路徑?!景咐?-1】文件搜索與刪除工具案例描述(3)用戶輸入指令3,代表“刪除文件/目錄”,此時需要用戶輸入需要刪除的文件/目錄,程序執(zhí)行后會將目錄以及目錄下的內(nèi)容全部刪除。(4)用戶輸入指令4,代表“退出”,即退出該文件管理器程序。【案例7-1】文件搜索與刪除工具案例效果I/O流概述7.27.2I/O流概述熟悉I/O流概述,能夠簡述I/O流的概念以及簡述I/O流的繼承體系
先定一個小目標!7.2I/O流概述File類主要用于操作文件的屬性和路徑,無法直接操作文件中的內(nèi)容。如果程序需要對文件中的內(nèi)容進行讀取或?qū)懭耄托枰褂肐/O流。I/O流以流的形式進行數(shù)據(jù)的輸入和輸出,可以對文件或網(wǎng)絡中的數(shù)據(jù)進行讀取和寫入操作。7.2I/O流概述Java中的I/O流有很多種,根據(jù)數(shù)據(jù)傳輸方向的不同,可以分為輸入流和輸出流;根據(jù)操作數(shù)據(jù)的不同,可以分為字節(jié)流和字符流。(1)輸入流和輸出流。輸入流:用于從磁盤、網(wǎng)絡等來源將數(shù)據(jù)讀取到程序中。通過輸入流,程序可以從文件或者網(wǎng)絡中讀取數(shù)據(jù)并在程序中進行處理。輸出流:則用于將程序中的數(shù)據(jù)寫入到磁盤、網(wǎng)絡等目標位置。通過輸出流,程序可以將數(shù)據(jù)寫入到磁盤或者發(fā)送到網(wǎng)絡中。7.2I/O流概述輸入流和輸出流的示意圖。7.2I/O流概述(2)字節(jié)流和字符流。在Java的I/O流中,數(shù)據(jù)本質(zhì)上是由一組二進制位構成的序列。為了方便對不同類型的數(shù)據(jù)進行處理,Java提供了字節(jié)流和字符流兩種類型的I/O流。字節(jié)流:以字節(jié)為單位來處理流上的數(shù)據(jù)。字節(jié)流適用于處理二進制數(shù)據(jù),如圖像、音頻等。字符流:以字符為單位來處理流上的數(shù)據(jù)。字符流適用于處理文本數(shù)據(jù),如對文本文件中的內(nèi)容進行讀寫。7.2I/O流概述I/O流的繼承體系(字節(jié)流)。7.2I/O流概述I/O流的繼承體系(字符流)。字節(jié)流7.37.3字節(jié)流在計算機中,無論是文本、圖片,還是音頻,它們在存儲設備中都是由一系列字節(jié)組成的。Java中用于處理二進制數(shù)據(jù),以字節(jié)為基本單位進行讀取和寫入操作的流稱為字節(jié)流,本節(jié)將對字節(jié)流進行講解。7.3.1InputStream掌握InputStream的使用,能夠使用InputStream讀取文件
先定一個小目標!7.3.1InputStreamInputStream是Java中所有字節(jié)輸入流的父類,它提供了一系列方法來讀取字節(jié)數(shù)據(jù),其中常用的方法如下表所示。方法聲明功能描述intread()從輸入流讀取一個字節(jié),把它轉(zhuǎn)換為0~255的整數(shù),并返回這一整數(shù)intread(byte[]b)從輸入流讀取若干字節(jié),把它們保存到參數(shù)b指定的字節(jié)數(shù)組中,返回值為讀取到的字節(jié)數(shù),如果已到達流的末尾,返回值將為-1intread(byte[]b,intoff,intlen)從輸入流讀取若干字節(jié),把它們保存到參數(shù)b指定的字節(jié)數(shù)組中,off指定字節(jié)數(shù)組開始保存數(shù)據(jù)的起始索引,len表示讀取的字節(jié)數(shù)目,返回值為讀取到的字節(jié)數(shù),如果已到達流的末尾,返回值將為-1voidclose()關閉此輸入流并釋放與該流關聯(lián)的所有系統(tǒng)資源7.3.1InputStream使用InputStream類的注意事項:InputStream是一個抽象類,需要通過實例化其子類的對象來使用字節(jié)輸入流。FileInputStream是InputStream的一個子類,專門用于從文件中讀取數(shù)據(jù)。FileInputStream的構造方法可以接收一個文件名或者一個File對象作為參數(shù),通過這個參數(shù)可以指定要讀取數(shù)據(jù)的文件。在創(chuàng)建FileInputStream對象時,如果文件不存在或者無法訪問,會拋出FileNotFoundException異常。7.3.1InputStream案例演示下面通過一個案例演示使用FileInputStream讀取文件中的數(shù)據(jù)。首先在Java項目的src目錄下創(chuàng)建一個名為file的包,在該包中創(chuàng)建一個文本文件test01.txt,在文件中輸入內(nèi)容“itheima”并保存。最后使用字節(jié)輸入流對象來讀取test01.text文件。Example07.java源代碼7.3.1InputStream案例演示案例的運行結果如下圖所示。7.3.1InputStream為了提高讀取效率,可以使用一次能讀取若干字節(jié)的read()方法。下面通過一個案例演示一次讀取指定長度的數(shù)據(jù)的方式完成文件的讀取。案例演示Example08.java源代碼7.3.1InputStream案例的運行結果如下圖所示。案例演示7.3.1InputStream腳下留心:中文亂碼問題由于一個中文字符在UTF-8編碼方案中占3個字節(jié),在讀取包含中文的文件時,采用一次讀取一個字節(jié)或一次讀取多個字節(jié)都可能因讀取不到完整的字符而出現(xiàn)亂碼問題。例如,將test01.txt中的內(nèi)容改為“itheima程序員”,運行Example08,結果如下圖所示。7.3.1InputStream腳下留心:中文亂碼問題為了避免中文亂碼問題,需要調(diào)整每次讀取的字節(jié)數(shù)以確保每個字符都能夠被完整讀取。此外,還可以使用InputStream類提供的readAllBytes()方法,一次性讀取文件中的全部字節(jié),并將其轉(zhuǎn)化為字符串輸出。例如,將文件Example08.java中的第7~13行代碼,修改為如下代碼。int[]arr; //聲明一個int[]類型的變量arr=newint[3]; //為arr分配3個數(shù)組元素的空間7.3.1InputStream腳下留心:中文亂碼問題修改完成后再次運行,結果如下圖所示。7.3.2OutputStream
先定一個小目標!掌握OutputStream,能夠使用OutputStream向文件中寫入數(shù)據(jù)7.3.2OutputStreamOutputStream是Java中所有字節(jié)輸出流類的父類。OutputStream提供了一些基本的方法來寫入字節(jié)數(shù)據(jù),常用的方法如下表所示。方法聲明功能描述voidwrite(intb)向輸出流寫入一個字節(jié)voidwrite(byte[]b)將字節(jié)數(shù)組b中的所有字節(jié)寫到輸出流voidwrite(byte[]b,intoff,intlen)將byte數(shù)組中從偏移量off開始的len個字節(jié)寫入輸出流voidflush()刷新輸出流并強制寫出所有緩沖的輸出字節(jié)voidclose()關閉輸出流并釋放與此流相關的所有系統(tǒng)資源7.3.2OutputStream使用OutputStream類的注意事項:與InputStream類類似,使用OutputStream類時必須先通過子類實例化對象。OutputStream類有多個子類,其中FileOutputStream子類是操作文件的字節(jié)輸出流。FileOutputStream的構造方法可以接收一個文件名或者一個File對象作為參數(shù),通過這個參數(shù)可以指定要寫入數(shù)據(jù)的文件。在創(chuàng)建FileOutputStream對象時,如果文件不存在,則會創(chuàng)建一個新的文件;如果文件已經(jīng)存在,如果沒有指定其他參數(shù),默認會覆蓋原有的文件內(nèi)容。7.3.2OutputStream案例演示下面通過一個案例演示如何使用FileOutputStream將數(shù)據(jù)寫入文件。Example09.java源代碼7.3.2OutputStream案例演示運行案例后,會在src\file目錄中生成一個新的文本文件test02.txt,打開該文本文件查看文件中的內(nèi)容,如下圖所示。7.3.2OutputStream案例演示如果希望在已存在的文件內(nèi)容之后追加新內(nèi)容,則可使用FileOutputStream的構造方法FileOutputStream(Stringfilename,booleanappend)創(chuàng)建文件輸出流對象,并把參數(shù)append的值設置為true。下面通過一個案例演示在已存在文件的內(nèi)容后追加內(nèi)容。Example10.java源代碼7.3.2OutputStream案例演示案例的運行結果如下圖所示?!景咐?-2】音頻加密解密案例描述音頻文件可以用來存儲音樂、語音等。在某些情況下,需要對這些音頻文件進行加密,以保護其中的內(nèi)容不被未授權的人獲取。例如,企業(yè)的商業(yè)機密文件或電話錄音的音頻文件,希望將其加密后傳輸。本案例要求編寫一個模擬音頻加密解密的程序,能夠?qū)σ纛l文件進行加密和解密。具體要求如下:進入程序后會顯示該程序的三個功能,分別是音頻加密、音頻解密和退出程序。要求原始音頻文件、加密音頻文件和解密音頻文件分別存儲在D:\audio目錄下的三個文件夾中?!景咐?-2】音頻加密解密案例描述選擇音頻加密功能后,系統(tǒng)會顯示原始音頻文件目錄中可以進行加密的所有文件名稱。接著需要用戶輸入想要加密的文件名稱(包括后綴名,本案例要求對mp3格式的音頻進行加密),輸入完成后對該文件進行加密(加密后的文件后綴仍為“.mp3”,但無法正常打開),完成后提示加密成功的信息和加密后文件的絕對路徑。選擇音頻解密功能后,系統(tǒng)會顯示所有已經(jīng)加密過的音頻文件名稱。接著需要用戶輸入需要解密的文件名稱,輸入完成后對該文件進行解密,完成后提示解密成功和解密后文件的絕對路徑。提示:案例要求既要加密又要解密。為了實現(xiàn)這一功能,可以使用異或操作進行加密,因為異或操作具有自反性,即對同一個數(shù)值進行兩次異或操作得到的還是原值,這樣可以簡化解密操作?!景咐?-2】音頻加密解密案例效果字符流7.47.4字符流InputStream類和OutputStream類在讀寫文件時操作的都是字節(jié),如果需要讀寫純文本數(shù)據(jù),Java虛擬機需要將字節(jié)轉(zhuǎn)換為字符,如果數(shù)據(jù)規(guī)模較大時這個轉(zhuǎn)換過程相對比較耗時,并且字符可以進行編碼的類型比較多,有時候不知道編碼類型很容易產(chǎn)生亂碼。對此,JavaI/O流中提供了字符流,使得直接操作字符變得更加方便。7.4.1Reader掌握Reader的使用,能夠使用Reader讀取文件中的內(nèi)容
先定一個小目標!7.4.1ReaderReader是字符輸入流的頂級父類,用于從網(wǎng)絡或磁盤等數(shù)據(jù)源中以字符為單位讀取數(shù)據(jù)程序中。Reader類定義了字符輸入流的基本共性功能方法,常用方法如下表所示。方法聲明功能描述intread()從輸入流中讀取一個字符,并返回其Unicode,如果到達流的末尾,則返回-1intread(charcbuf[])從輸入流中讀取若干個字符,并將其存儲到指定的字符數(shù)組cbuf中,返回值為讀取到的字符數(shù),如果已到達流的末尾,則返回-1intread(charcbuf[],intoff,intlen)從輸入流中讀取若干個字符,并將其存儲到指定的字符數(shù)組cbuf中;off參數(shù)表示從數(shù)組的哪個位置開始存儲,len參數(shù)表示最多讀取的字符數(shù)。返回值為讀取到的字符數(shù),如果到達流的末尾,則返回-1voidclose()用于關閉輸入流,釋放與之相關的系統(tǒng)資源longtransferTo(Writerout)用于將輸入流中的字符數(shù)據(jù)直接傳輸?shù)街付ǖ妮敵隽鱓riter中7.4.1Reader使用Reader類的注意事項:使用Reader類時,需要先使用其子類進行實例化。Reader類有多個子類,其中FileReader子類是用于操作文件的字符輸入流,開發(fā)者可以使用構造函數(shù)FileReader(StringfileName)或FileReader(Filefile)來創(chuàng)建一個FileReader對象,并指定要讀取的文件。7.4.1Reader案例演示下面通過一個案例演示如何使用FileReader讀取文件中的內(nèi)容。首先在src目錄下的file包中新建一個test04.txt文件,并在其中輸入內(nèi)容“黑馬程序員”,然后使用文件字符輸入流FileReader對象讀取test04.txt文件中的內(nèi)容。Example11.java源代碼7.4.1Reader案例演示案例的運行結果如下圖所示。7.4.1Reader案例演示為了提高讀取效率,可以使用一次可以讀取若干字符的read()方法。下面對Example11.java文件中的讀取方式進行改進。Example12.java源代碼7.4.1Reader案例演示案例的運行結果如下圖所示。7.4.2Writer掌握Writer的使用,能夠使用Writer向文件中寫入內(nèi)容
先定一個小目標!7.4.2WriterWriter是字符輸出流的頂級父類,用于以字符為單位將數(shù)據(jù)寫入到網(wǎng)絡或磁盤等各種目標中。Writer類定義了字符輸出流的基本共性功能方法,其中常用的方法如表7-8所示。方法聲明功能描述voidwrite(charcbuf[])將字符數(shù)組cbuf中的所有字符寫入到輸出流中voidwrite(charcbuf[],intoff,intlen)將字符數(shù)組cbuf中從偏移量off開始的len個字符寫入到輸出流中voidwrite(Stringstr)將字符串str寫入到輸出流中voidwirte(Stringstr,intoff,intlen)將字符串str中從偏移量off開始的len個字符寫入到輸出流中voidflush()強制將緩沖區(qū)的數(shù)據(jù)同步到輸出流中voidclose()關閉輸出流,釋放與之相關的資源7.4.2Writer使用Writer類的注意事項:在使用Writer類時,同樣需要通過其子類進行實例化。FileWriter是Writer類的一個子類,用于向文件中以字符為單位寫入數(shù)據(jù)。FileWriter提供了構造函數(shù)FileWriter(StringfileName)或FileWriter(Filefile)來創(chuàng)建一個FileWriter對象,并指定要寫入的文件。7.4.2Writer案例演示下面通過一個案例演示如何使用FileWriter將數(shù)據(jù)寫入文件中。Example13.java源代碼7.4.2Writer案例演示案例的運行結果如下圖所示。7.4.2WriterFileWriter同F(xiàn)ileOutputStream一樣,如果指定的文件不存在,就會先創(chuàng)建文件,再寫入數(shù)據(jù);如果文件存在,則向文件中寫入數(shù)據(jù)時,會默認覆蓋原文件的內(nèi)容。如果想在原文件末尾追加數(shù)據(jù),需要調(diào)用如下重載的構造方法創(chuàng)建FileWriter對象。或者FileWriter(Filefile,Booleanappend)FileWriter(Stringfilename,Booleanappend)7.4.2Writer下面,將文件Example13.java中的第5行代碼修改為如下代碼。Writerwriter=newFileWriter("src\\file\\test05.txt",true);修改完成后,再次運行文件Example13.java,查看test05.txt的內(nèi)容,如下圖所示。7.4.2Writer案例演示在字符輸入流和字符輸出流中,使用Reader類提供的transferTo()方法,可以更簡單直接的將文件中的內(nèi)容傳輸?shù)侥繕宋募?。下面通過一個案例演示使用transferTo()方法實現(xiàn)文件復制,將文件test05.txt中的內(nèi)容復制到文件test05copy.txt中。Example14.java源代碼7.4.2Writer案例演示運行文件Example14.java,程序會在src目錄下的file目錄中新建一個文件test05copy.txt,打開該文件查看復制結果,如下圖所示?!景咐?-3】日記本案例描述許多人都曾寫過日記,用文字留住一些值得記錄的事情。本案例要求編寫一個模擬日記本的程序,以一個文本文件為一個日記本,支持用戶新建日記本,寫日記、修改日記、查看日記的操作。具體要求如下:進入程序后會顯示該程序的五個功能,分別是新建日記本、寫日記、修改日記、查看日記和退出程序。日記本文件的存儲目錄為“D:\diary”?!景咐?-3】日記本案例描述寫日記。用戶輸入選擇寫日記的日記本名稱,若該日記本不存在,提示創(chuàng)建對應名稱的日記本;若該日記本存在,且已經(jīng)有內(nèi)容,可以讓用戶選擇覆蓋原來的內(nèi)容、追加內(nèi)容或者取消操作;若該日記本沒內(nèi)容,則直接寫入日記。修改日記。用戶輸入需要修改日記的日記本名稱,若該日記本不存在,給出用戶提示;若該日記本存在,且已經(jīng)有內(nèi)容,則讓用戶輸入修改內(nèi)容進行修改;若該日記本沒內(nèi)容,則給出用戶提示。查看日記。用戶輸入想要查看的日記。若該日記本不存在,給出用戶提示,否則輸出該日記本中的內(nèi)容。緩沖流7.57.5.1緩沖流概述熟悉緩沖流概述,能夠簡述緩沖流的好處,以及緩沖流讀寫數(shù)據(jù)的原理
先定一個小目標!7.5.1緩沖流概述在JavaIO中,每一次讀寫操作都會涉及到系統(tǒng)資源的調(diào)度,包括磁盤的訪問和內(nèi)存的申請等,這些調(diào)度都會占用一定時間,當讀寫量較大時可能會影響程序性能。為此,JavaIO提供了一種緩沖流,它通過在內(nèi)存中設置一個默認大小的數(shù)組作為緩沖區(qū),來提高讀寫數(shù)據(jù)的效率。7.5.1緩沖流概述緩沖流提高IO效率的關鍵在于利用了內(nèi)存和硬盤讀寫速度的差異。它通過一次性從硬盤讀取較大的數(shù)據(jù)塊到內(nèi)存中的緩沖區(qū),使得程序可以從緩沖區(qū)中讀取數(shù)據(jù),減少了對硬盤的頻繁訪問,從而提升了IO操作的效率。緩沖流讀寫數(shù)據(jù)的原理如下圖所示。7.5.1緩沖流概述需要說明的是,緩沖流是對原始流(字節(jié)流和字符流)的增強,它屬于處理流,需要套接在原始流之上。也就是說,緩沖流需要依賴于原始流進行使用。JavaIO中提供了字節(jié)緩沖流和字符緩沖流兩種緩沖流,使用緩沖流需要及時調(diào)用close()方法或flush()方法刷新緩沖區(qū),確保所有數(shù)據(jù)都被寫入或讀取。7.5.2字節(jié)緩沖流熟悉字節(jié)緩沖流,能夠使用BufferedInputStream和BufferedOutputStream讀寫數(shù)據(jù)
先定一個小目標!7.5.2字節(jié)緩沖流字節(jié)緩沖流包括字節(jié)緩沖輸入流BufferedInputStream和字節(jié)緩沖輸出流BufferedOutputStream。下面講解這兩個流。7.5.2字節(jié)緩沖流BufferedInputStream是InputStream的子類,當從BufferedInputStream中讀取字節(jié)時,BufferedInputStream會從底層輸入流中讀取一塊數(shù)據(jù)到內(nèi)部緩沖區(qū),然后根據(jù)需要從內(nèi)部緩沖區(qū)中讀取數(shù)據(jù)。BufferedOutputStream是OutputStream的子類,當向BufferedOutputStream中寫入字節(jié)時,它會先將數(shù)據(jù)存儲在內(nèi)部緩沖區(qū)中,只有當緩沖區(qū)滿了或調(diào)用了flush()、close()方法時,才會將緩沖區(qū)中的數(shù)據(jù)真正寫入到底層輸出流。7.5.2字節(jié)緩沖流由于緩沖流需要依賴于原始流進行使用,所以BufferedInputStream類和BufferedOutputStream類的構造方法分別接收InputStream和OutputStream類型的參數(shù)作為被包裝對象,從而在讀寫字節(jié)數(shù)據(jù)時提供緩沖功能。7.5.2字節(jié)緩沖流案例演示下面通過一個文件復制的案例來學習BufferedInputStream和BufferedOutputStream這兩個流的用法。在src目錄下的file目錄中新建一個文本文件test06.txt,作為源文件,并向該文件中添加內(nèi)容“字節(jié)緩沖流”。Example15.java源代碼7.5.2字節(jié)緩沖流案例演示案例的運行結果如下圖所示。7.5.3字符緩沖流熟悉字符緩沖流,能夠使用BufferedReader和BufferedWriter讀寫數(shù)據(jù)
先定一個小目標!7.5.3字符緩沖流字符緩沖流包括字符緩沖輸入流BufferedReader和字符緩沖輸出流BufferedWriter。下面講解這兩個流。7.5.3字符緩沖流BufferedReader是Reader的子類,當從BufferedReader中讀取字符時,BufferedReader會從底層輸入流中讀取一塊數(shù)據(jù),然后根據(jù)需要從內(nèi)部緩沖區(qū)中提取字符。BufferedReader提供了一個增強方法readLine(),可以更高效的讀取數(shù)據(jù)。BufferedWriter是Writer的子類,當向BufferedWriter中寫入字符時,它會先將數(shù)據(jù)存儲在內(nèi)部緩沖區(qū)中,只有當緩沖區(qū)滿了或調(diào)用了flush()方法時,才會將緩沖區(qū)中的數(shù)據(jù)真正寫入到底層輸出流。7.5.3字符緩沖流案例演示BufferedReader和BufferedWriter的構造方法分別接收Reader和Writer類型的參數(shù)作為被包裝對象。下面通過一個案例演示使用BufferedReader和BufferedWriter實現(xiàn)文件的復制。在src目錄下的file目錄中新建一個文本文件test07.txt,作為源文件,并向該文件中添加內(nèi)容“字符緩沖流”。Example16.java源代碼7.5.3字符緩沖流案例演示案例的運行結果如下圖所示。【案例7-4】異常簽到統(tǒng)計案例描述某公司要求所有員工在每天到崗時需要簽到,每天正常簽到時間在上午的9點以前,超過9點的簽到都視為遲到。為了方便統(tǒng)計員工的簽到情況,每天簽到的數(shù)據(jù)會保存在一個文件中,本案例要求編寫一個異常簽到統(tǒng)計的程序,讀取員工的簽到數(shù)據(jù),并將遲到的簽到信息作為異常簽到信息存儲到另一個文件中。本案例原始簽到信息的存儲位置為“src\file\sgindata.txt”,異常簽到信息的存儲位置為“src\file\latedata.txt”。【案例7-4】異常簽到統(tǒng)計案例效果數(shù)據(jù)流7.67.6數(shù)據(jù)流熟悉數(shù)據(jù)流的使用,能夠使用數(shù)據(jù)流讀取和寫入基本數(shù)據(jù)類型的數(shù)據(jù)
先定一個小目標!7.6數(shù)據(jù)流在Java編程中,如果希望將原始數(shù)據(jù)類型和字符串寫入流中,并在讀取時根據(jù)對應的數(shù)據(jù)類型進行讀取,可以使用JavaI/O提供的數(shù)據(jù)流。其中,DataInputStream和DataOutputStream是較為常用的數(shù)據(jù)流,常用于處理基本類型和字符串類型的數(shù)據(jù),將這些數(shù)據(jù)按順序?qū)懭氲捷敵隽髦?,讀取時,可以根據(jù)相同的順序讀取字節(jié)序列,并將其轉(zhuǎn)換成對應的數(shù)據(jù)類型。7.6數(shù)據(jù)流DataInputStream類提供了一系列方法,用于讀取特定類型的數(shù)據(jù),其中常用的方法如下表所示。方法聲明功能描述booleanreadBoolean()讀取boolean類型的數(shù)據(jù)并返回bytereadByte()讀取byte類型的數(shù)據(jù)并返回intreadInt()讀取int類型的數(shù)據(jù)并返回doublereadDouble()讀取double類型的數(shù)據(jù)并返回StringreadUTF()讀取編碼格式為UTF-8的String類型的數(shù)據(jù)并返回7.6數(shù)據(jù)流DataOutputStream類提供了一系列方法,用于讀取特定類型的數(shù)據(jù),其中常用的方法如下表所示。方法聲明功能描述voidwriteBoolean(booleanv)將boolean類型的數(shù)據(jù)寫入字節(jié)流voidwriteByte(intv)將byte類型的數(shù)據(jù)寫入字節(jié)流voidwriteInt(intv)將int類型的數(shù)據(jù)寫入字節(jié)流voidwriteDouble(doublev)將double類型的數(shù)據(jù)寫入字節(jié)流voidwriteUTF(Stringstr)將字符串數(shù)據(jù)以UTF-8編碼格式寫入字節(jié)流7.6數(shù)據(jù)流案例演示下面通過一個案例演示使用DataOutputStream和DataInputStream向文件中寫入數(shù)據(jù)和讀取數(shù)據(jù)。Example17.java源代碼7.6數(shù)據(jù)流案例演示案例的運行結果如下圖所示。對象流7.77.7對象流熟悉數(shù)據(jù)流的使用,能夠使用數(shù)據(jù)流讀取和寫入基本數(shù)據(jù)類型的數(shù)據(jù)
先定一個小目標!7.7對象流隨著對象在應用中的廣泛使用,有時候需要將對象存儲到文件或網(wǎng)絡中,同時也要能夠?qū)⒋鎯Φ膶ο笾匦禄謴统稍嫉膶ο鬆顟B(tài)。為了解決這個問題,可以使用對象流。對象流是JavaIOAPI提供的一種高級流,它包括ObjectInputStream和ObjectOutputStream兩個類,這兩個類分別用于將Java對象寫入輸出流,以及從輸入流中讀取Java對象。7.7對象流
對象流在進行對象的寫入操作時,需要將Java對象轉(zhuǎn)換成二進制流進行傳輸,這一過程稱為對象的序列化,而在讀取對象時,需要再將其反序列化為Java對象。因此,在使用對象流時,被傳輸?shù)膶ο蟮念愋枰獙崿F(xiàn)Serializable接口。7.7對象流案例演示ObjectInputStream類和ObjectOutputStream類提供的讀取對象的方法和寫入對象的方法分別為readObject()和writeObject(Objecto)。下面通過一個案例演示如何使用這兩個方法讀取和寫入對象類型的數(shù)據(jù)。首先定義一個User類,并實現(xiàn)Serializable接口,用于創(chuàng)建被讀寫的對象。User.java源代碼7.7對象流案例演示接著使用ObjectInputStream類和ObjectOutputStream類將User對象寫入文件中并讀取出來。Example18.java源代碼7.7對象流案例演示案例的運行結果如下圖所示。CommonsIO7.87.8CommonsIO
先定一個小目標!了解CommonsIO,能夠在項目中使用CommonsIO的工具類對文件進行操作7.8CommonsIOCommonsIO是一組用于簡化I/O操作的類庫,它包含一系列工具類,用于文件、流和目錄的操作,旨在提高開發(fā)人員在IO功能開發(fā)中的效率。其中,常用的工具類有FileUtils和IOUtils,分別用于文件操作和流操作,下面對CommonsIO中的FileUtils和IOUtils進行講解。7.8CommonsIOFileUtils類提供了一系列操作文件和目錄的方法,包括復制、移動、刪除、讀取、寫入等操作。FileUtils類的部分常用方法如下表所示。方法聲明功能描述voidcopyFile(FilesrcFile,FiledestFile)將源文件srcFile復制到目標文件destFilevoidcopyDirectory(FilesrcDir,FiledestDir)將源目錄srcDir下的所有文件和子目錄復制到目標目錄destDirvoidcopyFileToDirectory(FilesrcFile,FiledestDir)將源文件srcFile復制到目標目錄destDirvoiddeleteDirectory(Filedir)刪除指定目錄dir的所有內(nèi)容,包含子目錄和文件StringreadFileToString(Filefile,Charsetencoding)將文件file的內(nèi)容以encoding字符編碼讀取并返回為字符串voidwriteStringToFile(Filefile,Stringdata,Stringcharname,Charsetencoding,Booleanappend)將字符串data以encoding字符編碼寫入文件file中,append為true為追加模式,否則為覆蓋模式7.8CommonsIOIOUtils類提供了一系列處理I/O流的方法,包括讀取、寫入、復制、轉(zhuǎn)換等操作。IOUitls類的部分常用方法如下表所示。方法聲明功能描述byte[]readBytes(InputStreaminput)將輸入流
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度二手房購置與物業(yè)服務合同3篇
- 2025年度水利工程土地征用與補償合同6篇
- 2025年度借車合同范本:車輛使用過程中的駕駛培訓及考核規(guī)定3篇
- 2024年環(huán)境監(jiān)測設備安裝居間協(xié)議合同
- 2024年自卸車砂石料運輸合同
- 解除設計合同協(xié)議書的范文
- 二零二五年度不銹鋼門安裝與建筑安全評估合同3篇
- 2024年科普教育視頻制作服務合同范本3篇
- 2024年汽車維修行業(yè)技師崗位勞動合同范本3篇
- 涂料裝修合同
- 學術不端行為治理研究
- 企業(yè)文化、戰(zhàn)略與電力能源知識參考題庫練習卷含答案(一)
- 福建南平武夷高新技術產(chǎn)業(yè)控股集團有限公司招聘筆試沖刺題2024
- 2024年設備維修部管理制度(6篇)
- GB/T 45083-2024再生資源分揀中心建設和管理規(guī)范
- 精神科護理工作計劃例文
- 河北省承德市2023-2024學年高一上學期期末物理試卷(含答案)
- 出租車行業(yè)服務質(zhì)量提升方案
- 沖上云霄-飛機鑒賞智慧樹知到期末考試答案2024年
- 江蘇省常州市溧陽市2023-2024學年八年級上學期1月期末英語試題
- 電力設備典型消防規(guī)程.ppt
評論
0/150
提交評論