Java面向?qū)ο蟪绦蛟O(shè)計案例教程(第二版) 課件 第9章 Java中的文件操作_第1頁
Java面向?qū)ο蟪绦蛟O(shè)計案例教程(第二版) 課件 第9章 Java中的文件操作_第2頁
Java面向?qū)ο蟪绦蛟O(shè)計案例教程(第二版) 課件 第9章 Java中的文件操作_第3頁
Java面向?qū)ο蟪绦蛟O(shè)計案例教程(第二版) 課件 第9章 Java中的文件操作_第4頁
Java面向?qū)ο蟪绦蛟O(shè)計案例教程(第二版) 課件 第9章 Java中的文件操作_第5頁
已閱讀5頁,還剩31頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)

文檔簡介

第9章Java中的文件操作《Java面向?qū)ο蟪绦蛟O(shè)計案例教程(第2版)》目錄/Contents9.19.29.3I/O概述文件管理文件字節(jié)流9.4

文件字符流9.5

文件處理思政要點/Point數(shù)據(jù)安全

在文件操作中保護數(shù)據(jù)安全和個人隱私的重要性,遵守相關(guān)法律法規(guī)資源節(jié)約

在文件操作中合理利用系統(tǒng)資源,減少不必要的磁盤讀寫,提高程序效率的環(huán)保意識。代碼規(guī)范

遵循良好的代碼規(guī)范和編寫詳細(xì)文檔,確保代碼的可讀性和可維護性。版權(quán)意識

在文件操作中遵守版權(quán)法和知識產(chǎn)權(quán)法,合法使用第三方庫和開源軟件I/O概述9.1

在Java中,把所有的輸入和輸出都當(dāng)作流(stream)來處理。流是按一定的順序排列的數(shù)據(jù)集合。例如,從鍵盤或文件輸入的數(shù)據(jù),向顯示器或者文件輸出的數(shù)據(jù)等都可以看作是一個個的數(shù)據(jù)流。輸入數(shù)據(jù)時,一個程序打開數(shù)據(jù)源上的一個流(文件或內(nèi)存等),然后按照順序輸入這個流中的數(shù)據(jù),這樣的流稱為輸入流,如圖9-1上部分所示。輸出數(shù)據(jù)時,一個程序可以打開一個目的地的流(如文件或內(nèi)存等),然后按順序向這個目的地輸出數(shù)據(jù),這樣的流稱為輸出流,如圖9-1下部分所示。9.1.1輸入/輸出流圖9-1輸入與輸出流

輸入輸出流的方向還可以這樣理解,他們是以內(nèi)存為基準(zhǔn)的。數(shù)據(jù)向內(nèi)存中寫入,稱為輸入流。數(shù)據(jù)由內(nèi)存向外輸出,稱為輸出流。因此,我們把數(shù)據(jù)流向內(nèi)存的動作稱為讀取(read),而把從內(nèi)存流向外設(shè)的操作稱為寫入(write)。

計算機中常見的輸入操作有:鍵盤輸入、光盤讀取、攝像頭拍攝、掃描儀掃描文件、錄音等等。常見的輸出操作有:揚聲器發(fā)聲、顯示器播放影片、光盤刻錄、打印機打印輸出等等。正確地判斷輸入與輸出對于程序設(shè)計過程中所用的類和方法的選擇至關(guān)重要。

輸入/輸出流根據(jù)處理數(shù)據(jù)的類型不同,可分為兩類:一類是字節(jié)流,另一類是字符流。字節(jié)流表示按照字節(jié)的形式讀寫數(shù)據(jù),字符流表示按照字符的形式讀寫數(shù)據(jù)。9.1.1輸入/輸出流

字節(jié)是現(xiàn)代計算機中數(shù)據(jù)的最基本存儲單位和傳輸單位,字節(jié)流可以理解為在設(shè)備與內(nèi)存的管道中,數(shù)據(jù)以一小組的0和1的形式順序排列并流動。如圖9-2所示,箭頭所示管道中傳輸?shù)氖且詢山M8位二進制方式編碼的數(shù)字97和98,一共兩個字節(jié)。9.1.2字節(jié)流圖9-2字節(jié)流示意圖

InputStream類的主要派生子類包括:FileInputStream(按字節(jié)讀取文件中的數(shù)據(jù))、BufferedInputStream(按字節(jié)形式讀取數(shù)據(jù)并保存進入緩沖區(qū))等,其層次結(jié)構(gòu)如圖9-3所示。9.1.2字節(jié)流圖9-3InputStream類派生結(jié)構(gòu)圖

(1)?publicabstractintread()throwsIOException:每次執(zhí)行方法時,順序讀取字節(jié)輸入流中的第一個字節(jié),并以int型返回,如果輸入流中沒有可讀取的字節(jié),則返回?-1。這種方法是最基本的讀取方法,效率比較低。

(2)?publicintread(byteb[])throwsIOException:每次執(zhí)行方法前,需要預(yù)先聲明并初始化byte型數(shù)組b,初始化長度應(yīng)該以2的N次方較為合適。方法執(zhí)行時,從輸入流中順序讀取數(shù)組b默認(rèn)長度個數(shù)的字節(jié)存入數(shù)組b中,返回值為當(dāng)次讀取到的字節(jié)個數(shù),如果輸入流中沒有可讀取的字節(jié),則返回?-1。與上一種方法相比,效率有所提高,但存在數(shù)組b默認(rèn)長度不好確定的弊端。

(3)?publicintread(byteb[],intoff,intlen)throwsIOException:每次執(zhí)行方法前,同樣需要預(yù)先聲明并初始化byte型數(shù)組b,初始化長度應(yīng)該以2的N次方較為合適。方法執(zhí)行時,從輸入流中順序讀取len-off個字節(jié),依次存入數(shù)組b的第off下標(biāo)開始的位置上,返回值為當(dāng)次讀取到的字節(jié)個數(shù),如果輸入流中沒有可讀取的字節(jié),則返回?-1。與上一種方法相比,靈活度最高,效率也有很大提高。9.1.2字節(jié)流讀取方法

OutputStream類的主要派生子類包括:FileOutoutStream(按字節(jié)讀取文件中的數(shù)據(jù))、BufferedOutoutStream(按字節(jié)形式讀取數(shù)據(jù)并保存進入緩沖區(qū))等,其層次結(jié)構(gòu)如圖9-4所示。9.1.2字節(jié)流圖9-4OutputStream類派生結(jié)構(gòu)圖

(1)?publicabstractvoidwrite(intb)throwsIOException:每次執(zhí)行方法時,將參數(shù)b以字節(jié)形式寫入輸出流中,由輸出流順序流向目的地。

(2)?publicvoidwrite(byteb[])throwsIOException:每次執(zhí)行方法時,將參數(shù)數(shù)組b中的元素,順序?qū)懭胼敵隽髦校奢敵隽黜樞蛄飨蚰康牡?。實際應(yīng)用中,這個方法經(jīng)常需要配合String類的getBytes方法使用。

(3)?publicvoidwrite(byteb[],intoff,intlen)throwsIOException:每次執(zhí)行方法時,將數(shù)組b中,從第off下標(biāo)開始,累計len長度為止的元素,寫入輸出流中,由輸出流順序流向目的地。實際應(yīng)用中,多數(shù)與InputStream的第3個read方法聯(lián)合使用。9.1.2字節(jié)流寫入方法

字符是現(xiàn)代計算機中字母、符號和數(shù)字的集合。字符流可以理解為在設(shè)備與內(nèi)存的管道中,數(shù)據(jù)以單個字符的形式順序排列并流動。如圖9-5所示,箭頭所示管道中傳輸?shù)氖且宰址绞骄幋a的小寫英文字母a和b,一共兩個字符。9.1.3字符流圖9-5字符流

在Java語言中,字符流相關(guān)類的表示形式多數(shù)以Reader或者Writer結(jié)尾表示,我們常用抽象類Reader和Writer及其派生子類來處理字符流的輸入輸出。

字符輸入流類Reader用于以字符形式,從數(shù)據(jù)源中讀取數(shù)據(jù),其主要派生子類包括InputStreamReader(讀取字節(jié)數(shù)據(jù)并將其解碼為字符)、FileReader(用于讀取字符文件的內(nèi)容)、BufferedReader(從字符出入流中讀取文本字符,緩沖個個字符,從而實現(xiàn)字符、數(shù)組和行的高效讀取)等。其層次結(jié)構(gòu)如圖9-6所示。9.1.3字符流圖9-5字符流

(1)?publicintread()throwsIOException:每次執(zhí)行方法時,從輸入流中順序讀取一個字符,返回值為該字符的Unicode碼值,如果讀取結(jié)束或沒有讀取到字符,返回值為?-1。

(2)?publicintread(charcbuff[])throwsIOException:每次執(zhí)行方法前,需要預(yù)先聲明并初始化char型數(shù)組cbuff,初始化長度應(yīng)該以2的N次方較為合適,方法執(zhí)行時,從輸入流中順序讀取cbuff數(shù)組長度個字符,按照下標(biāo)順序存放到cbuff數(shù)組中,返回值為當(dāng)次讀取到的字符個數(shù),如果讀取結(jié)束或沒有讀取到字符,返回值為?-1。

(3)?abstractpublicintread(charcbuff[],intoff,intlen)throwsIOException:每次執(zhí)行方法前,需要預(yù)先聲明并初始化char型數(shù)組cbuff,初始化長度應(yīng)該以2的N次方較為合適,方法執(zhí)行時,從輸入流中,順序讀取len-off個長度的字符,順次存放于cbuff數(shù)組的第off下標(biāo)開始的位置上,返回值為當(dāng)次讀取到的字符個數(shù),如果讀取結(jié)束或沒有讀取到字符,返回值為-1。9.1.3字符流讀取方法

字符輸出流Writer用于以字符的形式將數(shù)據(jù)寫入目的地。Writer類是所有字符輸出流的父類,其主要派生子類包括OutputStreamWriter(將字符以字節(jié)形式寫入輸出流)、FileWriter(將字符數(shù)據(jù)寫入文件)、BufferedWriter(將字符數(shù)據(jù)寫入緩沖區(qū))、PrintWriter(格式化輸出字符數(shù)據(jù))等子類。其層次結(jié)構(gòu)如圖9-7所示。9.1.3字符流圖9-7Writer類派生結(jié)構(gòu)圖

1.?publicvoidwrite(Stringstr)throwsIOException:每次執(zhí)行方法時,將指定字符串直接寫入輸出流。2.publicvoidwrite(Stringstr,intoff,intlen)throwsIOException:每次執(zhí)行方法時,將執(zhí)行字符串從第off位置起,長度為len的字符串寫入到輸出流。經(jīng)過上面內(nèi)容的對比,我們不難發(fā)現(xiàn),無論是字節(jié)流還是字符流,無論是輸入操作還是輸出操作,其操作方式基本上可以歸納為如下步驟:1.分清方向,找準(zhǔn)目標(biāo),決定讀取操作還是寫入操作。2.根據(jù)讀寫的目標(biāo),確定所用的類。3.根據(jù)所選擇的類,結(jié)合計算機內(nèi)存和Java虛擬機內(nèi)存的可用情況,在逐個讀寫、整體一次性讀寫或小范圍多次讀寫之間選擇合適的讀寫方法重載。4.根據(jù)讀取方法返回值為-1的情況,決定操作何時停止。9.1.3字符流典型方法

Java的輸入輸出流之間可以通過套用,提高讀寫的效率,以輸入流的套用方式為例,參看圖9-7來形成I/O流套用的初步印象,具體代碼操作在后續(xù)章節(jié)中會詳細(xì)介紹。9.1.3字符流圖9-8字節(jié)輸入流與字符輸入流套用示意圖文件管理9.2

廣義的“文件”指公文書信或指有關(guān)政策、理論等方面的文章。文件的范疇很廣泛,電腦上運行的如殺毒、游戲等軟件或程序都可以叫文件。計算機文件屬于文件的一種,與普通文件載體不同,計算機文件是以計算機硬盤為載體存儲在計算機上的信息集合。文件可以是文本文檔、圖片、程序等等。在不同的操作系統(tǒng)中,計算機文件的范圍所指也有不同。例如,微軟的Windows系統(tǒng)中,文件特指單獨意義上的單體文件,而文件目錄也就是文件夾另外的叫法,而在Linux/UNIX系統(tǒng)中,單體文件和文件夾(包括目錄、軟連接、硬連接等)都被統(tǒng)一地認(rèn)為是文件,嵌入式操作系統(tǒng)中,大部分的硬件的I/O端口同樣也被認(rèn)為是文件。

Java語言作為可以跨平臺運行的語言,必須全面考慮到各操作系統(tǒng)平臺對于文件的操作。因此,在Java語言中,文件、文件夾、軟連接、硬連接、快捷方式、硬件I/O端口都按照文件統(tǒng)一對待。本書中以Windows平臺為例。9.2.1文件的概念

在Java中,F(xiàn)ile類既可以表示文件,又可以表示文件夾(目錄),其位于java.io包下。Java中用于輸入輸出操作的類基本都位于這個包下。一個File類型的對象可以表示Java語言中的一個文件或文件夾。1.構(gòu)造方法(1)?File(Stringpathname):通過給定路徑創(chuàng)建一個新的File類對象。(2)?File(Stringparent,Stringchild):通過給定的文件夾目錄和文件名創(chuàng)建一個新的File類對象。(3)??File(Fileparent,Stringchild):通過給定的文件對象和文件名創(chuàng)建一個新的File類對象。2.路徑(1)相對路徑:指由這個文件或文件夾所在的路徑引起的跟其他文件或文件夾的路徑關(guān)系。(2)絕對路徑:指目錄下的絕對位置,通常是從盤符開始的路徑。完整地描述文件位置的路徑就是絕對路徑,絕對路徑名的指定是從樹型目錄結(jié)構(gòu)頂部的根目錄開始到某個目錄或文件的路徑,由一系列連續(xù)的目錄組成,中間用斜線分隔,直到要指定的目錄或文件,路徑中的最后一個名稱即為要指向的目錄或文件。之所以稱為絕對,意指當(dāng)任何文件需要引用同一個文件時,所使用的路徑都是一樣的。9.2.2File類(1)?publicStringgetName():返回文件對象的XXXXXXX。(2)?publicStringgetPath():返回文件對象所在路徑名。(3)?publicStringgetAbsolutePath():返回文件對象的絕對路徑名。(4)??publicStringgetParent():返回文件對象所在父目錄路徑。如果文件對象沒有父目錄,則返回null。(5)?publicbooleanexists():判斷文件對象所表示的文件或文件夾是否存在,存在返回true,不存在返回false。(6)publicbooleanisDirectory():判斷文件對象所表示的是否為目錄(文件夾),如果是返回true,否則返回false。(7)?publicbooleanisFile():判斷文件對象所表示的是否為一個標(biāo)準(zhǔn)文件,如果是返回true,否則返回false。9.2.3File類的常用方法(8)?publicbooleanisHidden():判斷文件對象是否是一個隱藏文件,如果是返回true,否則返回false。文件屬性可以通過鼠標(biāo)右擊文件查看。(9)??publicbooleancreateNewFile():當(dāng)且僅當(dāng)文件對象所代表的標(biāo)準(zhǔn)文件不存在時,創(chuàng)建一個空文件,如果創(chuàng)建成功返回true,否則返回false。(10)??publicbooleanmkdir():創(chuàng)建文件對象所指向的文件夾,如果路徑中包含多層文件夾,必須保證所有路徑都是正確的。如果創(chuàng)建成功返回true,否則返回false。(11)??publicbooleandelete():刪除文件對象所對應(yīng)的文件或目錄,如果文件對象代表的是一個目錄,則目錄必須是空的才能刪除。在Linux系統(tǒng)下,必須保證對當(dāng)前文件或文件夾有刪除權(quán)限才能執(zhí)行。如果刪除成功返回true,否則返回false。(12)?publicString[]list():列出此文件對象中所包含的文件或文件夾列表,如果文件對象表示一個獨立文件,則返回null。9.2.3File類的常用方法文件字節(jié)流9.39.3文件字節(jié)流

在程序運行過程中,經(jīng)常需要從文件中讀取、寫入數(shù)據(jù)。在Java中,系統(tǒng)提供了FileInputStream和FileOutputStream類,以字節(jié)形式從文件中讀取和寫入數(shù)據(jù)。文件字節(jié)輸入/輸出流實現(xiàn)了對文件的順序訪問,并且以字節(jié)為單位進行讀/寫操作。在Java中,對文件的讀/寫操作主要步驟是:1.創(chuàng)建文件輸入/輸出流對象,此時文件自動打開或創(chuàng)建。2.用文件讀寫方法讀寫數(shù)據(jù)。關(guān)閉數(shù)據(jù)流,同時關(guān)閉文件。9.3.1FileInputStream類FileInputStream類的構(gòu)造方法如下:1.?FileInputStream(Stringfilename)。2.FileInputStream(Filefile)。其中,filename表示要打開的文件名,file對象表示要打開的文件對象。FileInputStreamins=newFileInputStream("d:/test.txt");如果d盤下的test.txt文件不存在或沒有權(quán)限訪問,系統(tǒng)會拋出FileNotFoundException異常。9.3.2FileOutputStream類FileOutputStream類的構(gòu)造方法如下:1.FileOutputStream(Stringfilename)。2.FileOutputStream(Filefile)。3.?FileOutputStream(Stringfilename,booleanboo)。4.FileOutputStream(Filefile,booleanboo)。其中filename參數(shù)和file參數(shù)的含義與FileInputStream相同。其中boolean型參數(shù)boo表示是否可以向文件中追加寫入字節(jié),默認(rèn)值為false。如果boo的值為true,則每次寫入內(nèi)容會自動追加在文件中已有內(nèi)容之后,否則將從文件開頭開始寫入,文件原有內(nèi)容將被清空。文件字符流9.49.4.1文件字符流在Java中,系統(tǒng)提供了FileReader和FileWriter類,以字符形式從文件中讀取和寫入數(shù)據(jù)。文件字符輸入/輸出流實現(xiàn)了對文件的順序訪問,并且以字符為單位進行讀/寫操作。在Java中,對文件的讀/寫操作主要步驟是:1.創(chuàng)建文件輸入/輸出流對象,此時文件自動打開或創(chuàng)建。2.用文件讀寫方法讀寫數(shù)據(jù)。3.關(guān)閉數(shù)據(jù)流,同時關(guān)閉文件。文件字符流和文件字節(jié)流在使用上區(qū)別并不大,主要是根據(jù)實際情況選用。9.4.1FileReader類FileReader類的構(gòu)造方法如下:1.?FileReader(Stringfilename)。2.FileReader(Filefile)。其中,filename表示要打開的文件名,file對象表示要打開的文件對象。FileReaderinr=newFileReader("d:/test.txt");如果d盤下的test.txt文件不存在或沒有權(quán)限訪問,系統(tǒng)會拋出FileNotFoundException異常。其read方法針對字符操作,與文件字節(jié)輸入流沒有太大區(qū)別。實際使用中,F(xiàn)ileReader多與BufferedReader聯(lián)合使用,更加高效地讀取字符文件,下面用一些文字來介紹BufferedReader類。9.4.2FileWriter類FileWriter類的構(gòu)造方法如下:1.FileWriter(Stringfilename)。2.?FileWriter(Filefile)。3.?FileWriter(Stringfilename,booleanboo)。4.?FileWriter(Filefile,booleanboo)。FileWriterfr=newFileWriter("d:/test.txt",true);FileWriter的構(gòu)造方法還可以創(chuàng)建目標(biāo)文件,代碼執(zhí)行過后,在d盤下,就會出現(xiàn)名為test.txt的獨立文件,fr對象可以以追加的方法向文件中寫入內(nèi)容。FileWriter同樣可以與BufferedWriter類聯(lián)合使用,提高寫入效率。文件處理9.59.5.1順序訪問文件雖然讀取或者寫入文件的形式各有不同,但都遵循了一個原則,就是無論讀寫,都要按照文件中內(nèi)容排列的先后順序進行。無論本次讀取或?qū)懭胍粋€字節(jié),還是多個字節(jié),一個字符或者多個字符,下一次讀取或?qū)懭攵家獜纳弦淮巫x取或?qū)懭氲奈恢美^續(xù)進行,不允許在文件中任意指定位置進行操作。這也是流(Stream)的概念的體現(xiàn)。9.5.2隨機訪問文件在實際應(yīng)用中,Java語言還提供了一種可以更加快速讀寫文件的方式,就是使用RandomAccessFIle類隨機讀寫文件。這個類提供了隨機訪問文件的方法,與之前的輸入/輸出流類相比,有兩點不同:1.?RandomAccessFile類直接繼承了對象類Object,同時實現(xiàn)了DataInput接口和DataOutput接口,所以RandomAccessFile類既可以作為輸入流、又可以作為輸出流。??RandomAccessFile類之所以允許隨機訪問文件,是由于它定義了一個文檔當(dāng)前位置的指針,文件的存取都是從文件當(dāng)前位置指針指示的位置開始的。通過移動

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論