第9章輸入輸出流和文件操作_第1頁
第9章輸入輸出流和文件操作_第2頁
第9章輸入輸出流和文件操作_第3頁
第9章輸入輸出流和文件操作_第4頁
第9章輸入輸出流和文件操作_第5頁
已閱讀5頁,還剩82頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1第9章輸入/輸出流和文件操作文件是信息的一種組織形式,是存儲在外部存儲介質(zhì)上的具有標識名的一組相關(guān)信息集合.流是指一組有順序的,有起點和終點的字節(jié)集合,是對數(shù)據(jù)傳輸?shù)目偡Q或抽象.

29.1

文件和流的概念9.2

字節(jié)輸入/輸出流類9.3字符輸入/輸出流類9.4文件操作第9章輸入/輸出流和文件操作39.1文件和流的概念9.1.1

操作系統(tǒng)中的文件和目錄概念9.1.2流的概念9.1.3Java的輸入/輸出流與文件操作概述41.

文件與文件系統(tǒng)9.1.1操作系統(tǒng)中的文件和目錄概念文件:信息的一種組織形式,是存儲在外部存儲介質(zhì)上的具有標識名的一組相關(guān)信息集合。文件具有保存性,其內(nèi)容可以被長期保存和多次使用。文件管理:操作系統(tǒng)不可或缺的重要功能。操作系統(tǒng)中的文件系統(tǒng)負責存取和管理文件。文件系統(tǒng)用文件概念來組織和管理存放在各種介質(zhì)上的信息。文件系統(tǒng)提供“按名存取”實現(xiàn)文件的存儲和檢索。文件擴展名表示文件類型。在操作系統(tǒng)中,對設(shè)備的訪問也都是基于文件進行的。59.1.1操作系統(tǒng)中的文件和目錄概念2.

目錄結(jié)構(gòu)與文件檢索目錄:文件系統(tǒng)組織和管理文件的基本單位,目錄中保存它所管理的每個文件的基本屬性信息。文件目錄項:包括文件名字、文件所有者、文件長度、文件類型、文件保護級別、文件控制屬性、文件創(chuàng)建時間、最后修改時間等文件屬性。目錄的多級樹型結(jié)構(gòu):根目錄、子目錄和文件構(gòu)成。文件全名:文件的路徑名和文件名組成,區(qū)分文件的唯一標識。目錄機制提供文件的組織、管理和檢索功能,同時對用戶隱藏了硬件的實現(xiàn)細節(jié),使用戶不必了解文件存儲方法、在存儲介質(zhì)上的具體物理位置以及設(shè)備實際運行方式,便可檢索到文件并讀取文件信息。6文件是文件系統(tǒng)中最小的數(shù)據(jù)組織單位。目錄機制提供文件之間的分類和組織方式。文件的組織是指文件中信息的配置和構(gòu)造方式。文件的組織包含兩方面:邏輯結(jié)構(gòu)和存儲結(jié)構(gòu)。文件的邏輯結(jié)構(gòu):從用戶角度所觀察到的文件中信息的組織方式;文件的存儲結(jié)構(gòu):文件在外存儲器上的實際存放方式。9.1.1操作系統(tǒng)中的文件和目錄概念3.

文件的邏輯結(jié)構(gòu)7(1)流式文件9.1.1操作系統(tǒng)中的文件和目錄概念3.

文件的邏輯結(jié)構(gòu)(2)記錄式文件流式文件由字節(jié)序列或字符序列組成。流式文件內(nèi)的信息不再劃分結(jié)構(gòu),只是具有順序關(guān)系的一系列字節(jié)或字符集合,

字節(jié)或字符是信息的最小單位。例如:源程序、文本文件等是字符流式文件。記錄式文件是一種有結(jié)構(gòu)的文件,它包含若干記錄。記錄是文件中按信息在邏輯上的獨立含義劃分的一個信息單位,記錄在文件中的排列具有順序關(guān)系。記錄是文件內(nèi)獨立的最小信息單位,操作系統(tǒng)每次操作至少存儲、檢索或更新一個記錄。89.1.1操作系統(tǒng)中的文件和目錄概念3.

文件的邏輯結(jié)構(gòu)(2)記錄式文件記錄還可以被進一步劃分成若干個更小的數(shù)據(jù)項。數(shù)據(jù)項是具有標識名的最小的不可分割的數(shù)據(jù)單位。數(shù)據(jù)項的集合構(gòu)成記錄,相關(guān)記錄的集合構(gòu)成文件。對記錄的劃分以及對數(shù)據(jù)項的類型描述,均由應用程序完成。當應用程序從文件中獲得一個記錄后,再進一步分解出數(shù)據(jù)項并進行相關(guān)處理。例如:在學生基本信息文件中,每個學生信息為一個記錄,文件由若干學生記錄組成。每個學生記錄又可由學號、姓名、性別等數(shù)據(jù)項組成。99.1.1操作系統(tǒng)中的文件和目錄概念4.

文件的存取方法(1)順序存取順序存?。褐赴从涗涰樞蜻M行讀/寫操作的存取方法。讀操作總是讀取文件的當前記錄,同時,自動讓文件記錄讀指針推進,指向下一個記錄位置。如果文件是可讀寫的,再設(shè)置一個文件記錄寫指針,它總是指向下一次要寫入記錄的位置,執(zhí)行寫操作時,將一個記錄寫到文件寫指針指向的記錄位置。109.1.1操作系統(tǒng)中的文件和目錄概念4.

文件的存取方法(2)隨機存取隨機存?。褐赴从涗浳恢眯蛱栠M行讀/寫操作的存取方法。給定一個記錄位置序號,文件的讀/寫指針將跳過若干記錄位置,直接定位在指定記錄位置處,進行讀/寫操作。因此,對文件中記錄的操作可以采用任意次序,不一定是從前向后的次序。119.1.1操作系統(tǒng)中的文件和目錄概念5.使用文件的用戶接口(1)操作接口(2)應用程序接口(API)操作系統(tǒng)通過用戶接口把它的服務和功能提供給用戶。通過這些接口,用戶能夠獲得文件系統(tǒng)提供的各種服務。

操作接口:操作系統(tǒng)為用戶操作控制計算機工作和提供服務的手段集合,通常可借助操作控制命令、圖形操作界面等來實現(xiàn)。例如:MS-DOS系統(tǒng),Windows系統(tǒng)應用程序接口:由一組系統(tǒng)調(diào)用組成,系統(tǒng)調(diào)用是為了擴充機器功能、增強系統(tǒng)能力、方便用戶使用而在系統(tǒng)中建立的過程或函數(shù)。文件系統(tǒng)提供的一組系統(tǒng)調(diào)用包括建立文件、打開文件、讀/寫文件、文件控制、關(guān)閉和撤銷文件等。129.1.1操作系統(tǒng)中的文件和目錄概念5.使用文件的用戶接口程序設(shè)計語言通常將系統(tǒng)調(diào)用設(shè)計成庫函數(shù),目的是隱藏操作系統(tǒng)內(nèi)部結(jié)構(gòu)和硬件細節(jié),使系統(tǒng)調(diào)用更像函數(shù)調(diào)用。應用程序通過調(diào)用庫函數(shù)就可以訪問系統(tǒng)管理的各種軟/硬件資源,調(diào)用操作系統(tǒng)功能,獲得操作系統(tǒng)的服務。139.1.2流的概念1.

流的定義和作用(1)流的定義、方向和讀/寫操作流(stream):指一組有順序的、有起點和終點的字節(jié)集合,是對數(shù)據(jù)傳輸?shù)目偡Q或抽象。

即數(shù)據(jù)在兩個對象之間的傳輸稱為流。數(shù)據(jù)流動具有方向,數(shù)據(jù)流動方向由計算機的硬件結(jié)構(gòu)及外部設(shè)備的特性決定。數(shù)據(jù)輸入:數(shù)據(jù)由外部輸入設(shè)備流向內(nèi)存。——輸入流數(shù)據(jù)輸出:數(shù)據(jù)由內(nèi)存流向外部設(shè)備。——輸出流流的基本操作:讀操作和寫操作。讀操作:從流中取得數(shù)據(jù)的操作。—對輸入流只能進行讀操作寫操作:向流中添加數(shù)據(jù)的操作?!獙敵隽髦荒苓M行寫操作一個流只能進行讀或?qū)懼幸环N操作,不能同時讀和寫。149.1.2流的概念(2)流采用緩沖區(qū)技術(shù)對流進行讀/寫操作的最小單位是字節(jié),即一次可以寫入一個字節(jié),或讀取一個字節(jié),顯然這樣數(shù)據(jù)傳輸效率很低。提高數(shù)據(jù)傳輸效率的辦法是:將一塊內(nèi)存空間設(shè)計成緩沖區(qū),暫時存放待傳送的數(shù)據(jù)。這樣可以一次讀/寫若干字節(jié),緩沖區(qū)使數(shù)據(jù)能夠以足夠大的數(shù)據(jù)塊形式傳送,從而能夠顯著地提高數(shù)據(jù)傳輸效率。當向一個流寫入數(shù)據(jù)時,系統(tǒng)將數(shù)據(jù)發(fā)送到緩沖區(qū),而不是直接發(fā)送到外部設(shè)備。緩沖區(qū)自動記錄數(shù)據(jù),當緩沖區(qū)滿時,系統(tǒng)將數(shù)據(jù)全部發(fā)送到相應的設(shè)備。如果在緩沖區(qū)寫滿之前就要進行數(shù)據(jù)傳輸,稱為立即傳輸操作。159.1.2流的概念(3)流的作用設(shè)計流的目的是:使數(shù)據(jù)傳輸操作獨立于相關(guān)設(shè)備。程序中需要根據(jù)待傳輸數(shù)據(jù)的不同特性而使用不同的流,數(shù)據(jù)傳輸給指定設(shè)備后的操作由系統(tǒng)執(zhí)行設(shè)備驅(qū)動程序完成。這樣,程序中不需要關(guān)注設(shè)備實現(xiàn)細節(jié),使得一個源程序能夠用于多種輸入/輸出設(shè)備,從而增強了程序的可重用性。例如:向打印機輸出數(shù)據(jù)與向文件輸出數(shù)據(jù)的操作是一樣的。169.1.2流的概念2.

流的存在在標準輸入/輸出操作中存在數(shù)據(jù)流動問題,流的方向是從內(nèi)存角度看的。標準輸入過程中,輸入流:數(shù)據(jù)從鍵盤等輸入設(shè)備流向內(nèi)存。標準輸出過程中,輸出流:數(shù)據(jù)從內(nèi)存流向顯示器或打印機等輸出設(shè)備。在文件的讀/寫操作中也存在數(shù)據(jù)流動問題。讀文件操作中存在輸入流:數(shù)據(jù)從磁盤流向內(nèi)存。寫文件操作中存在輸出流:數(shù)據(jù)從內(nèi)存流向磁盤。179.1.2流的概念2.

流的存在數(shù)據(jù)還可以從內(nèi)存流向內(nèi)存,從一臺計算機通過網(wǎng)絡流向另一臺計算機等。圖9.1

標準輸入/輸出操作和文件操作與流的關(guān)系189.1.3Java的輸入/輸出流與文件操作概述1.

流類字節(jié)流(binarystream):

以字節(jié)作為流中元素的基本類型,每次讀/寫的最小單位是一個字節(jié)。字節(jié)輸入流類:InputStream類及其子類字節(jié)輸出流類:OutputStream類及其子類字符流(characterstream):

以字符作為流中元素的基本類型,每次讀/寫的最小單位是一個字符,即2字節(jié)的Unicode碼。字符輸入流類:Reader類及其子類字符輸出流類:Writer類及其子類199.1.3Java的輸入/輸出流與文件操作概述2.

文件操作類Java支持對文件的順序存取和隨機存取操作。提供File類記載文件屬性信息,對文件的讀/寫操作通過流實現(xiàn);RandomAccessFile類以隨機存取方式進行文件讀/寫操作。209.2字節(jié)輸入/輸出流類9.2.1

抽象字節(jié)流9.2.2Java標準輸入/輸出9.2.3文件字節(jié)流9.2.4數(shù)據(jù)字節(jié)流9.2.5對象字節(jié)流9.2.6管道字節(jié)流219.2.1抽象字節(jié)流1.

InputStream類及其子類publicabstractclassInputStreamextendsObjectimplementsCloseable{publicabstractintread()throwsIOException;

//返回讀取的一個字節(jié),抽象方法publicintread(byte[]b)throwsIOException

//讀取多字節(jié)到緩沖區(qū)b,返回讀取字節(jié)數(shù)

publicvoidclose()throwsIOException{}

//關(guān)閉輸入流

}229.2.1抽象字節(jié)流1.

InputStream類及其子類抽象方法read()方法從輸入流中每次讀取一個字節(jié),返回讀取的該字節(jié)。read(byte[])方法每次讀取若干字節(jié)到指定緩沖區(qū)b,返回實際讀取的字節(jié)數(shù);如果b的長度是0,則返回0;如果輸入流結(jié)束,則返回-1。圖9.2字節(jié)輸入流類及其子類的層次結(jié)構(gòu)232.

OutputStream類及其子類9.2.1抽象字節(jié)流publicabstractclassOutputStreamextendsObjectimplementsCloseable,Flushable{publicabstractvoidwrite(intb)throwsIOException; //寫入一個字節(jié),抽象方法publicvoidwrite(byte[]b)throwsIOException //將字節(jié)緩沖區(qū)b中內(nèi)容寫入輸出流

publicvoidwrite(byte[]b,intoff,intlen)throwsIOException //寫入b從off開始的len個元素

publicvoidflush()throwsIOException//立即傳輸

publicvoidclose()throwsIOException//關(guān)閉輸出流}242.

OutputStream類及其子類9.2.1抽象字節(jié)流圖9.3字節(jié)輸出流類及其子類的層次結(jié)構(gòu)259.2.2Java標準輸入/輸出1.

標準輸入/輸出常量publicfinalclassSystemextendsObject

{publicfinalstaticInputStreamin=nullInputStream;

//標準輸入常量publicfinalstaticPrintStreamout=nullPrintStream;

//標準輸出常量

publicfinalstaticPrintStreamerr=nullPrintStream;

//標準錯誤輸出常量

}Java支持標準輸入/輸出操作。Java.lang.System類中有3個常量in、out和err,用于實現(xiàn)標準輸入/輸出功能,聲明如下:計算機系統(tǒng)中,標準輸入指從鍵盤等外部輸入設(shè)備中獲得數(shù)據(jù),標準輸出指向顯示器或打印機等外設(shè)發(fā)送數(shù)據(jù)。269.2.2Java標準輸入/輸出1.

標準輸入/輸出常量System.in是InputStream類的常量對象,調(diào)用read()方法可以從鍵盤接收數(shù)據(jù);System.out是PrintStream類的常量對象,調(diào)用print()和println()方法可以向顯示器輸出數(shù)據(jù);System.err以PrintStream類的對象實現(xiàn)標準錯誤輸出功能。279.2.2Java標準輸入/輸出2.

PrintStream類publicclassPrintStreamextendsFilterOutputStream{publicPrintStream(OutputStreamout)publicPrintStream(OutputStreamout,booleanautoFlush)

publicPrintStream(StringfileName)

throwsFileNotFoundExceptionpublicPrintStream(Filefile)

throwsFileNotFoundException

PrintStream類聲明print()和println()的重載方法,參數(shù)分別是8種基本數(shù)據(jù)類型及數(shù)組、字符串和對象等,Java自動將各數(shù)據(jù)類型參數(shù)值按照指定格式轉(zhuǎn)換成對應的字符串輸出。289.2.2Java標準輸入/輸出2.

PrintStream類

publicvoidprint

(booleanb)publicvoidprint

(charc)

publicvoidprint

(inti)

publicvoidprint(longl)

publicvoidprint

(floatf)

publicvoidprint(doubled)

publicvoidprint

(chars[])

publicvoidprint

(Strings)

publicvoidprint(Objectobj)

publicvoidprintln

()}當參數(shù)是對象時,自動調(diào)用該對象toString()方法,顯示該對象對應的字符串。println()在輸出時自動追加回車換行符,重載方法參數(shù)同print().29【例9.1】

標準輸入/輸出.9.2.2Java標準輸入/輸出——演示從鍵盤讀取數(shù)據(jù)的標準輸入操作,以及向顯示器輸出數(shù)據(jù)的標準輸出操作,通過System.in調(diào)用read()方法從鍵盤輸入的標準輸入流中讀取若干字節(jié)數(shù)據(jù);再通過System.out調(diào)用print()方法向標準輸出流寫入數(shù)據(jù),使得這些數(shù)據(jù)能在顯示器上顯示輸出。309.2.2Java標準輸入/輸出圖9.5標準輸入過程319.2.2Java標準輸入/輸出圖9.6標準輸出過程329.2.3文件字節(jié)流1.

FileInputStream類在對文件進行讀/寫操作中的數(shù)據(jù)傳輸功能,由文件字節(jié)輸入/輸出流類FileInputStream和FileOnputStream類實現(xiàn),其數(shù)據(jù)源都是文件。publicclassFileInputStreamextendsInputStream{publicFileInputStream

(Stringname)throwsFileNotFoundExceptionpublicFileInputStream

(Filefile)throwsFileNotFoundException}

339.2.3文件字節(jié)流1.

FileInputStream類FileInputStream類的構(gòu)造方法為指定文件創(chuàng)建文件字節(jié)輸入流對象,兩種參數(shù)的構(gòu)造方法意味著,既可以用name指定的文件名創(chuàng)建流對象,也可以用file指定的文件類File對象創(chuàng)建流對象。例如下列語句以InputFile.txt文件名創(chuàng)建文件字節(jié)輸入流對象fin:

FileInputStreamfin=newFileInputStream(“InputFile.txt”);如果指定文件不存在,無法讀取數(shù)據(jù),將拋出

FileNotFoundException異常。

FileInputStream類繼承父類InputStream中的close()等方法,并覆蓋read()方法。349.2.3文件字節(jié)流2.

FileOutputStream類publicclassFileOutputStreamextendsOutputStream{publicFileOutputStream

(Stringname)throwsFileNotFoundExceptionpublicFileOutputStream(Filefile)throwsFileNotFoundExceptionpublicFileOutputStream

(Stringname,booleanappend)throwsFileNotFoundException}

359.2.3文件字節(jié)流FileOutputStream類的構(gòu)造方法為指定文件創(chuàng)建文件字節(jié)輸出流對象。其中,append參數(shù)指定文件是否為添加的寫入方式,當append取值為true時,為添加方式,數(shù)據(jù)添加在原文件末尾;當append取值為false時,為重寫方式,數(shù)據(jù)從原文件開始處寫入,默認值為false。如果指定文件不存在,則創(chuàng)建一個新文件寫入數(shù)據(jù);否則,當沒有指定append參數(shù)或append取值為false時,使用重寫方式從文件開始處寫入數(shù)據(jù),這樣會覆蓋文件中的原有數(shù)據(jù),原有數(shù)據(jù)將丟失。FileOutputStream類繼承父類OutputStream中的close()等方法,并覆蓋read()方法。2.

FileOutputStream類36【例9.2】使用字節(jié)流讀寫文件。9.2.3文件字節(jié)流——演示在文件輸入/輸出操作中存在的數(shù)據(jù)流,使用文件字節(jié)輸入流實現(xiàn)文件輸入操作,使用文件字節(jié)輸出流實現(xiàn)文件輸出操作。①文件輸入操作。②文件輸出操作。③文件復制操作。379.2.4數(shù)據(jù)字節(jié)流記錄式文件是一種有結(jié)構(gòu)的文件,它將若干字節(jié)組合起來看成是一種結(jié)構(gòu),稱為一個記錄。在同一個記錄式文件中,記錄的

數(shù)據(jù)類型是相同的;在不同的記錄式文件中,記錄的數(shù)據(jù)類型可以是不同的。例如:整數(shù)文件是一種記錄式文件,由4字節(jié)組成的一個int整數(shù)構(gòu)成一個基本結(jié)構(gòu),即一個記錄;同樣,浮點數(shù)文件也是一種記錄式文件,每個記錄是由8字節(jié)組成的一個double浮點數(shù)。從邏輯結(jié)構(gòu)上看,記錄式文件的基本單位是記錄;而從存儲結(jié)構(gòu)上看,任何文件都是以字節(jié)為單位的流式文件,包括記錄式文件。因此,F(xiàn)ileInputStream和FileInputStream類,可以實現(xiàn)記錄式文件中數(shù)據(jù)的讀/寫操作。389.2.4數(shù)據(jù)字節(jié)流但是,使用字節(jié)流,即使采用緩沖區(qū),讀/寫數(shù)據(jù)的基本單位仍然是字節(jié)。如果需要對一個基本數(shù)據(jù)類型的數(shù)據(jù)進行讀/寫操作,程序?qū)崿F(xiàn)很麻煩,需要將整數(shù)、浮點數(shù)轉(zhuǎn)換成若干字節(jié)寫入輸出流;反之,從字節(jié)輸入流中讀取的若干字節(jié)也需要轉(zhuǎn)換成一個基本數(shù)據(jù)類型的數(shù)據(jù)。Java已將基本數(shù)據(jù)類型數(shù)據(jù)的讀寫問題封裝成了數(shù)據(jù)字節(jié)流。數(shù)據(jù)字節(jié)輸入流DataInputStream類和數(shù)據(jù)字節(jié)輸出流

DataOutputStream類提供直接讀或?qū)?種基本數(shù)據(jù)類型數(shù)據(jù)的方法,在讀或?qū)懸环N基本數(shù)據(jù)類型數(shù)據(jù)時,不必關(guān)心它的實際長度是多少字節(jié)。399.2.4數(shù)據(jù)字節(jié)流1.DataInputStream類publicclassDataInputStreamextendsFilterInputStreamimplementsDataInput{publicDataInputStream

(InputStreamin)

//構(gòu)造方法

publicfinalshortreadShort()throwsIOExceptionpublicfinalbytereadByte()throwsIOExceptionpublicfinalintreadInt()throwsIOException//讀取一個整型publicfinallongreadLong()throwsIOExceptionpublicfinalfloatreadFloat()throwsIOExceptionpublicfinaldoublereadDouble()throwsIOExceptionpublicfinalcharreadChar()throwsIOException//讀取一個字符publicfinalbooleanreadBoolean()throwsIOException}

409.2.4數(shù)據(jù)字節(jié)流2.DataOutputStream類publicclassDataOutputStreamextendsFilterOutputStreamimplementsDataOutput{publicDataOutputStream

(OutputStreamout)

//構(gòu)造方法

publicfinalvoidwriteByte(intv)throwsIOExceptionpublicfinalvoidwriteShort(intv)throwsIOExceptionpublicfinalvoidwriteInt()throwsIOException//寫入一個整型publicfinalvoidwriteLong(longv)throwsIOExceptionpublicfinalvoidwriteFloat(floatv)throwsIOException

數(shù)據(jù)字節(jié)輸出流DataOutputStream類提供了9個write()方法,分別用于向字節(jié)輸出流中寫入8種基本數(shù)據(jù)類型和字符串值,由各方法反映寫入的數(shù)據(jù)類型。419.2.4數(shù)據(jù)字節(jié)流2.DataOutputStream類publicfinalvoidwriteDouble(doublev)throwsIOExceptionpublicfinalvoidwriteChar(intv)throwsIOException

//寫入一個字符publicfinalvoidwriteBoolean(booleanv)throwsIOExceptionpublicfinalvoidwriteChars(Strings)throwsIOException

publicfinalintsize()

//返回實際寫入的字節(jié)數(shù)}

42【例9.3】使用數(shù)據(jù)流讀寫整數(shù)文件。

9.2.4數(shù)據(jù)字節(jié)流——將Fibonacci序列值寫入一個整數(shù)類型文件,演示在流中讀或?qū)懸粋€整數(shù)的方法。①數(shù)據(jù)寫入文件的思路同標準輸出。②捕獲異??刂戚斎虢Y(jié)束。439.2.5對象字節(jié)流1.ObjectInputStream類publicclassObjectInputStreamextendsInputStreamimplementsObjectInput,ObjectStreamConstants{publicObjectInputStream(InputStreamin)throwsIOException//構(gòu)造方法publicfinalObjectreadObject()throwsIOException,ClassNotFoundException//讀取一個對象}

449.2.5對象字節(jié)流2.ObjectOutputStream類publicclassObjectOutputStreamextendsOutputStreamimplementsObjectOutput,ObjectStreamConstants{publicObjectOutputStream

(OutputStreamout)throwsIOException//構(gòu)造方法publicfinalvoidwriteObject

(Objectobj)throwsIOException//寫入一個對象}

java.io.Serializable序列化接口是標記接口,其中沒有方法。

對象序列化就是把一個對象轉(zhuǎn)化成字節(jié)流。只有聲明實現(xiàn)序列化接口的類,其對象才能通過字節(jié)流進行讀寫操作。45【例9.4】使用對象流讀寫紀錄式文件。

9.2.5對象字節(jié)流圖9.7各種輸入/輸出流及其讀/寫方法469.2.6管道字節(jié)流數(shù)據(jù)可以在內(nèi)存與外部設(shè)備之間流動,還可以在內(nèi)存的兩個對象之間流動。管道流提供在對象之間傳輸數(shù)據(jù)的基本手段。管道流分為輸入流和輸出流,既可以是字節(jié)流,也可以是字符流。一次數(shù)據(jù)傳輸操作需要兩個管道流對象,一個輸入流對象和一個輸出流對象,并且這兩個管道流對象需要建立連接,之后,一個對象可以向管道輸出流對象寫入數(shù)據(jù),另一個對象可以從管道輸入流對象中讀取數(shù)據(jù)。圖9.8線程對象間的管道流479.2.6管道字節(jié)流1.PipedInputStream類提供管道輸入流對象的構(gòu)造方法和連接方法。publicclassPipedInputStreamextendsInputStream{publicPipedInputStream(){}//構(gòu)造方法

publicPipedInputStream(PipedOutputStreamsrc)throwsIOException//src為一個管道輸出流對象publicvoidconnect(PipedOutputStreamsrc)throwsIOException//連接方法

}

沒有參數(shù)的構(gòu)造方法只創(chuàng)建一個管道流對象,沒有與管道流進行連接;而帶參數(shù)的構(gòu)造方法,在創(chuàng)建一個管道流對象的同時與管道輸出流進行連接。489.2.6管道字節(jié)流2.PipedOutputStream類提供管道輸出流對象的構(gòu)造方法和連接方法。publicclassPipedOutputStreamextendsOutputStream{publicPipedOutputStream(){}//構(gòu)造方法

publicPipedOutputStream(PipedInputStreamsnk)throwsIOException//src為一個管道輸入流對象publicvoidconnect(PipedOutputStreamsnk)throwsIOException//連接方法}

499.2.6管道字節(jié)流創(chuàng)建兩個連接的管道流對象,可以先分別創(chuàng)建一個輸入流對象和一個輸出流對象,再建立連接;也可以在創(chuàng)建對象的同時建立連接。

PipedInputStreamin=newPipedInputStream();PipedOutputStreamout=newPipedOutputStream();

try{in.connect(out);}catch(IOExceptionioe){}

509.2.6管道字節(jié)流其中,連接方法也可以采用如下語句:

out.connect(in);

PipedInputStreamin=newPipedInputStream();try{PipedOutputStreamout=newPipedOutputStream(in);}catch(IOExceptionioe){}

或者在創(chuàng)建對象的同時建立連接,語句如下:51【例9.5】

使用管道流實現(xiàn)的發(fā)牌程序?!菔竟艿懒鞯氖褂梅椒?,實現(xiàn)例7.9中的發(fā)牌程序功能。9.2.6管道字節(jié)流529.3字符輸入/輸出流類采用字節(jié)流類可以對以字符為基本類型的流式文件進行數(shù)據(jù)讀/寫操作,方法如下:①采用文件字節(jié)流類,將字節(jié)緩沖區(qū)數(shù)組中的字節(jié)數(shù)據(jù)轉(zhuǎn)化為字符。②采用數(shù)據(jù)字節(jié)流類,readChar()方法讀取一個字符,writeChar(intc)方法寫入一個字符,writeChars(Strings)方法寫入一個字符串。Java提供字符流類對字符流式文件進行數(shù)據(jù)讀寫操作。字符輸入流類是Reader類及其子類;字符輸出流類是Writer類及其子類。539.3字符輸入/輸出流類9.3.1抽象字符流9.3.2

文件字符流9.3.3緩沖字符流549.3.1抽象字符流1.

Reader類及其子類Reader和Writer類是字符輸入/輸出流的抽象類,約定字符流的基本輸入/輸出操作方法,它們的每個子類實現(xiàn)一種特定的字符流輸入或輸出操作。publicabstractclassReaderextendsObjectimplements

Readable,Closeable{publicint

read()throwsIOException

//讀取一個字符,返回值范圍為0-65535(0x0000-0xffff)publicint

read(charcbuf[])throwsIOExceptionabstractpublicint

read

(charcbuf[],intoff,intlen) throwsIOException;abstractpublicvoid

close()throwsIOException;}559.3.1抽象字符流圖9.10字符輸入流Reader類及其子類的層次結(jié)構(gòu)Reader字符輸入流InputStreamReader字節(jié)輸入流轉(zhuǎn)成字符輸入流FilterReader過濾器字符輸入流PipedReader管道字符輸入流BufferedReader緩沖字符輸入流

FileReader文件字符輸入流1.

Reader類及其子類569.3.1抽象字符流2.

Writer類publicabstractclassWriterimplementsAppendable,Closeable,Flushable{publicvoidwrite(intc)throwsIOException//寫入一個字符publicvoidwrite(char[]cbuf)throwsIOException

//將字符數(shù)組所有元素寫入輸出流publicabstractvoidwrite(charcbuf[],intoff,intlen)

throwsIOException;publicvoidwrite(Stringstr)throwsIOException //將字符串str寫入輸出流publicvoidwrite(Stringstr,intoff,intlen)throwsIOException//將str從off開始長度為len的子串寫入輸出流publicabstractvoidflush()throwsIOException //將緩沖區(qū)內(nèi)容立即寫入輸出流

publicabstractvoidclose()throwsIOException}579.3.1抽象字符流圖9.11字符輸出流Writer類及其子類的層次結(jié)構(gòu)2.

Writer類及其子類Writer字符輸出流OutputStreamWriter字節(jié)輸出流轉(zhuǎn)成字符輸出流FilterWriter過濾器字符輸出流PrintWriter格式化字符輸出流BufferedWriter緩沖字符輸出流

FileWriter文件字符輸出流PipedWriter管道字符輸出流58FileReader和FileWriter類用于文本文件的輸入/輸出處理。文件字符輸入流FileReader類聲明如下:publicclassFileReaderextendsInputStreamReader{public

FileReader(StringfileName)throwsFileNotFoundException //構(gòu)造方法publicFileReader(Filefile)throwsFileNotFoundException}9.3.2文件字符流59FileReader和FileWriter類用于文本文件的輸入/輸出處理。文件字符輸出流FileWriter類聲明如下:publicclassFileWriterextendsOutputStreamWriter{publicFileWriter

(StringfileName)throws IOException //構(gòu)造方法

publicFileWriter

(StringfileName,booleanappend)

throwsIOExceptionpublicFileWriter

(Filefile)throwsIOExceptionpublicFileWriter(Filefile,booleanappend)throws IOException}9.3.2文件字符流609.3.3緩沖字符流FileReader和FileWriter類以字符為單位進行數(shù)據(jù)讀/寫操作,數(shù)據(jù)的傳輸效率很低。BufferedReader和BufferedWriter類以緩沖流方式進行數(shù)據(jù)讀/寫操作,提供讀取或?qū)懭胍恍凶址姆椒ǎ鼈冏约号溆芯彌_區(qū)。619.3.3緩沖字符流字符緩沖輸入流BufferedReader類聲明如下:publicclassBufferedReaderextendsReader{publicBufferedReader

(Readerin)//構(gòu)造方法publicBufferedReader(Readerin,intsz)//sz指定字符緩沖區(qū)長度publicStringreadLine()throwsIOException //讀取一行字符串,輸入流結(jié)束時返回null}629.3.3緩沖字符流字符緩沖輸出流Buffered類聲明如下:publicclassBufferedWriterextendsWriter{publicBufferedWriter

(Writerout)//構(gòu)造方法publicBufferedWriter(Writerout,intsz)//sz指定字符緩沖區(qū)長度publicvoidnewLine()throwsIOException //寫入一個換行符}63【例9.6】

將Fibonacci序列值寫入文本文件.9.3.3緩沖字符流——演示文本文件的讀/寫操作方法,讀/寫操作以字符串為單位。

649.4.1

文件操作類9.4.2

文件過濾器接口9.4.3文件對話框組件9.4.4隨機存取文件類9.4文件操作659.4.1文件操作類File類:1.保存文件或目錄的各種屬性,

包括文件名、文件長度、最后修改時間、是否可讀等;2.提供獲得當前文件的路徑名,判斷指定文件是否存在,獲得當前目錄中所有文件列表,創(chuàng)建文件、刪除文件、創(chuàng)建目錄、刪除目錄等操作的方法.661.

File類的構(gòu)造方法publicclassFileextendsObjectimplements

Serializable,Comparable<File>{publicFile(Stringpathname)publicFile(Stringparent,Stringchild)publicFile(Fileparent,Stringchild)}其中pathname和child指定文件名;parent指定目錄名,目錄名可以是字符串,也可以是File對象。9.4.1文件操作類679.4.1文件操作類例如:Filefile=newFile("myfile.txt");

//在當前目錄中,以指定文件名創(chuàng)建一個文件對象在操作系統(tǒng)中,目錄也是以文件形式保存的,稱為目錄文件。所以,一個file對象也可以表示一個目錄。例如:下列語句創(chuàng)建目錄文件對象。Filedir=newFile(“.”,“”);

//創(chuàng)建一個目錄文件對象,表示當前目錄Filedir=newFile(“../”,“”);

//表示當前目錄的上一級目錄Filedir=newFile(““,””);

//表示當前目錄的所在盤的根目錄689.4.1文件操作類例如,下列語句在指定目錄中創(chuàng)建文件對象:Filefile=newFile(dir,"myfile.txt");

//在dir指定目錄中,以指定文件名創(chuàng)建文件對象操作系統(tǒng)約定,文件或目錄的路徑名由斜線(/)或反斜線(\)分隔。而在Java的字符串中,\之后是轉(zhuǎn)義字符。所以,使用\作為路徑分隔符時,需要使用兩個“\\”。例如,一下3條語句同義:Filedir=newFile(“C:”,“”);

//表示C盤根目錄C:\Filedir=newFile(“C:/”,“”);

Filedir=newFile(“C:\\”,“”);

692.

File類提供的方法創(chuàng)建一個文件對象后,可以用File類提供的方法來獲得文件的屬性信息。(1)訪問文件對象方法publicStringgetName()

//返回文件名,不包含路徑名publicStringgetPath()

//返回相對路徑名,包含文件名publicStringgetAbsolutePath()//返回絕對路徑名,包含文件名publicStringgetParent()

//返回父文件對象的路徑名publicFilegetParentFile()

//返回父文件對象9.4.1文件操作類70(2)獲得或設(shè)置文件屬性

publiclonglength()

//返回文件字節(jié)長度publiclonglastModified()

//返回文件最后修改時間publicbooleanexists()

//判斷當前文件或目錄是否存在publicbooleancanRead()//判斷當前文件是否可讀publicbooleancanWrite()//判斷當前文件是否能修改publicbooleanisHidden()//判斷文件是否是隱藏的publicbooleanisFile()

//判斷當前文件對象是否為文件publicbooleanisDirectory()//判斷當前文件對象是否為目錄publicbooleansetReadOnly()//設(shè)置文件屬性為只讀publicbooleansetLastModified(longtime)

//設(shè)置文件的最后修改時間9.4.1文件操作類71(3)

文件操作方法publicintcompareTo(Filepathname);

//比較兩個文件對象的內(nèi)容

publicbooleanrenameTo(Filedest);

//文件重命名publicbooleancreateNewFile()throwsIOException;

//創(chuàng)建新文件publicbooleandelete();

//刪除文件或空目錄9.4.1文件操作類(4)目錄操作方法

publicbooleanmkdir();

//創(chuàng)建指定目錄,正常建立時返回truepublicString[]list();

//返回目錄中的所有文件名字符串

publicFile[

]listFiles();

//返回目錄中所有文件對象72【例9.7】

當前目錄及子目錄的文件列表.——演示File類的使用方法。

將當前目錄中的文件或子目錄列表顯示,顯示每個文件或子目錄的名稱、最后修改時間等屬性,并統(tǒng)計文件數(shù)、所有文件總字節(jié)數(shù)和子目錄數(shù)。其中,文件有長度屬性,子目錄沒有長度屬性;9.4.1文件操作類739.4.2文件過濾器接口在查看目錄中文件信息時,如果只希望查看一部分文件,可以指定一個過濾條件。操作系統(tǒng)中約定了通配符?和*,例如:“*.txt”表示擴展名為.txt的一些文件。在Java程序中,可以通過指定文件過濾條件來實現(xiàn)獲得部分文件的功能。該功能需要使用過濾器接口和File類的方法共同完成。749.4.2文件過濾器接口1.

FileFilter和FilenameFilter接口publicinterfaceFileFilter{//pathname指定文件對象publicbooleanaccept(Filepathname)}publicinterfaceFilenameFilter{//dir指定目錄,filename指定文件名publicbooleanaccept(Filedir,Stringname)}一個類如果要具有文件過濾功能,則需要先指定文件過濾條件,再實現(xiàn)接口中的accept()方法,accept()方法實現(xiàn)具體的過濾操作。759.4.2文件過濾器接口2.

獲得文件列表時使用過濾器publicString[]list(FilenameFilterfilter)

//返回過濾后的文件列表publicFile[]listFiles(FilenameFilterfilter)publicFile[]listFiles(FileFilterfilter)參數(shù)filter是一個實現(xiàn)了指定過濾器接口的對象,該對象包含accept()方法的具體實現(xiàn)。以上方法功能相同,只是參數(shù)不同。當調(diào)用上述方法時:首先獲得全部文件列表;再對這個列表按指定條件進行過濾,即對全部列表中的每個數(shù)據(jù)項調(diào)用執(zhí)行filter的accept()方法;最終得到經(jīng)過過濾的文件新列表。769.4.2文件過濾器接口【例9.8】

帶過濾器的文件名列表.——演示設(shè)置文件過濾條件、實現(xiàn)文件過濾操作方法.設(shè)置文件過濾條件實現(xiàn)文件過濾操作方法

779.4.3文件對話框組件1.

文件選擇對話框——javax.swing.JFileChooserpublicclassJFileChooserextendsponentimplementsAccessible{publicstaticfinalintAPPROVE_OPTION=0;//單擊對話框的“打開”或“保存”按鈕publicstaticfinalintCANCEL_OPTION=1;//單擊對話框的“撤銷”按鈕publicstaticfinalintERROR_OPTION=-1;//出錯publicJFileChooser() publicJFileChooser(StringcurrentDirectoryPath)//參數(shù)指定對話框的初始路徑789.4.3文件對話框組件publicJFileChooser(FilecurrentDirectory)

publicvoid

setFileFilter(FileFilterfilter)//設(shè)置文件過濾器

publicint

showOpenDialog(Componentparent)throwsHeadlessException//顯示打開文件對話框

publicint

showSaveDialog(Componentparent)throwsHeadlessException//顯示保存文件對話框

publicFile

getSelectedFile()//返回選中文件}799.4.3文件對話框組件其中,showOpenDialog()方法顯示“打開”文件對話

溫馨提示

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

最新文檔

評論

0/150

提交評論