




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
9.1文件9.2I/O流概述9.3字節(jié)流9.4字符流9.5文件的隨機(jī)訪問和標(biāo)準(zhǔn)輸入輸出9.6對象流9.7案例分析與實(shí)現(xiàn)(續(xù)6)第9章文件和數(shù)據(jù)流本章教學(xué)內(nèi)容:本章教學(xué)目標(biāo):掌握File類的使用理解流的不同分類掌握InputStream和OutputStream的使用掌握常用過濾流的使用掌握Reader和Writer的使用掌握利用RandomAccessFile類對文件隨機(jī)訪問的過程理解序列化和反序列化的概念掌握對象流的使用9.1文件9.1.1文件概述文件是存儲在硬盤、光盤、移動(dòng)存儲設(shè)備上的數(shù)據(jù)的集合。文件存儲形式可以是文本文檔、圖片、程序等,而且可以通過網(wǎng)絡(luò)傳輸。
9.1.2File類
在java.io包中提供的File類能對文件及目錄進(jìn)行操作。File類是文件和目錄路徑名的抽象表示形式,在Java程序中,一個(gè)File對象可以代表一個(gè)文件或目錄。利用File對象可以對文件或目錄及其屬性進(jìn)行基本操作,可以獲取與文件相關(guān)的信息,如名稱、最后修改日期、文件大小等。通過調(diào)用File類提供的各種方法,能夠完成創(chuàng)建、刪除文件,重命名文件,判斷文件的讀寫權(quán)限及是否存在,設(shè)置和查詢文件的最近修改時(shí)間、獲取當(dāng)前文件路徑、獲取當(dāng)前目錄文件列表等操作。
1.File類構(gòu)造方法File(StringdirectoryPath)其中參數(shù)“directoryPath”是文件的路徑名。如:Filefile1=newFile(“f:\\demo.txt”);//只是在堆中創(chuàng)建了一個(gè)File對象,并將其引用賦給了file1變量,并不是在f盤上真正創(chuàng)建demo.txt文件。
2.File類常用方法方法名功能說明booleancanRead()判斷文件或目錄是否可讀booleancreateNewFile()自動(dòng)創(chuàng)建一個(gè)File對象指定文件名的空文件,只有在指定文件名文件不存在的時(shí)候才能成功booleandelete()刪除File對象對應(yīng)的文件或目錄booleanexists()判斷File對象對應(yīng)的文件或目錄是否存在StringgetAbsolutePath()獲取File對象對應(yīng)的文件或目錄的絕對路徑StringgetName()獲取File對象對應(yīng)的文件或目錄的名稱StringgetPath()獲取File對象對應(yīng)的文件或目錄的路徑booleanisDirectory()判斷File對象指向的是否為一個(gè)目錄booleanisFile()判斷File對象指向的是否為一個(gè)文件longlength()返回File對象對應(yīng)的文件的大小,單位為字節(jié)booleanmkdir()新建一個(gè)File對象所定義的一個(gè)路徑,如果新建成功,返回true,否則返回false,此時(shí)File對象必須是目錄對象booleanrenameTo(Filedest)重命名File對象對應(yīng)的文件,如果命名成功,返回true,否則返回falselonglastModified()返回此File對象的最后一次被修改的時(shí)間實(shí)例9-1創(chuàng)建一個(gè)File對象,檢驗(yàn)文件是否存在,若不存在就創(chuàng)建,然后對File類的部分操作進(jìn)行演示,如文件的名稱、大小等。
3.文件列表器在File類中,還可以使用list()方法,把某個(gè)目錄中的文件或子目錄依次列舉出來。方法名功能說明String[]list()當(dāng)File對象為目錄時(shí),返回該目錄下的所有文件及子目錄
File[]listFiles()返回File對象對應(yīng)的路徑的下的所有文件對象數(shù)組
String[]list(FilenameFilterfilter)返回一個(gè)字符串?dāng)?shù)組,這些字符串為此File對象對應(yīng)的目錄中滿足指定過濾條件的文件和子目錄
File[]listFiles(FilenameFilterfilter)返回File對象數(shù)組,這些File對象為此File對象對應(yīng)的目錄中滿足指定過濾條件的文件和子目錄實(shí)例9-2利用list()方法將JDK根目錄下的目錄或文件的名稱列舉出來。實(shí)例9-3利用listFile()方法將JDK根目錄下的目錄或文件的名稱列舉出來,并標(biāo)明文件或目錄。實(shí)例9-4利用list(FilenameFilterfilter)方法列舉出JDK根目錄下的所有以.html或.htm為后綴的網(wǎng)頁文件。9.2I/O流概述
IO流指的是輸入輸出流,用來處理設(shè)備上的數(shù)據(jù)。這里的設(shè)備指硬盤、內(nèi)存、鍵盤錄入、網(wǎng)絡(luò)傳輸?shù)?。按照流的方向,可以將流分為兩類:輸入流和輸出流。通常把輸入流的指向稱為源,程序從指向源的輸入流中讀取源中的數(shù)據(jù)。而輸出流的指向是數(shù)據(jù)要到達(dá)的一個(gè)目的地,程序通過向輸出流中寫入數(shù)據(jù)把信息傳遞到目的地。程序只能從輸入流中讀取數(shù)據(jù),而不能向其寫入數(shù)據(jù)。反之,程序只能向輸出流中寫入數(shù)據(jù),而不能從中讀取數(shù)據(jù)。
流的分類:
按照流的方向,可以將流分為如下兩類:輸入流:只能從中讀取數(shù)據(jù),不能向其寫入數(shù)據(jù)的流。輸出流:只能向其寫入數(shù)據(jù),不能從中讀取數(shù)據(jù)的流。按照IO流所處理的數(shù)據(jù)類型,可以將流分為如下兩類:字節(jié)流:在流中處理的基本單位為字節(jié)的流。字符流:在流中處理的基本單位為字符的流。按照流的角色分,可以將流分為如下兩類:節(jié)點(diǎn)流:可以從/向一個(gè)特定的IO設(shè)備(如磁盤或網(wǎng)絡(luò))讀/寫數(shù)據(jù)的流,節(jié)點(diǎn)流又常被稱為低級流。過濾流:對流進(jìn)行處理的流又稱為過濾流。實(shí)現(xiàn)對一個(gè)已經(jīng)存在的流的連接和封裝,通過所封裝的流的功能調(diào)用實(shí)現(xiàn)數(shù)據(jù)讀/寫功能的流。9.3字節(jié)流9.3.1字節(jié)輸入流InputStream類是一個(gè)抽象類,是所有字節(jié)輸入流的父類,主要用于從數(shù)據(jù)源按照字節(jié)的方式向內(nèi)存讀入數(shù)據(jù)。常用方法如下:方法名功能說明abstractintread()讀取一個(gè)字節(jié),并將它返回。如果遇到源的末尾,則返回-1。可以通過返回值是否為-1來判斷流是否到達(dá)了末尾
intread(byte[]b)將數(shù)據(jù)讀入到一個(gè)字節(jié)數(shù)組,同時(shí)返回實(shí)際讀取的字節(jié)數(shù),如果到達(dá)流的末尾,則返回-1intread(byte[]b,intoffset,intlen)將數(shù)據(jù)讀入到一個(gè)字節(jié)數(shù)組,放到數(shù)組offset指定的位置開始,并用len來指定讀取的最大字節(jié)數(shù)。同樣到達(dá)流的末尾,則返回-1intavailable()用于返回在不發(fā)生阻塞的情況下,從這個(gè)流中可以讀取的字節(jié)數(shù)voidclose()關(guān)閉此輸入流并釋放與該流關(guān)聯(lián)的所有系統(tǒng)資源InputStream類的常用子類類名構(gòu)造方法的主要參數(shù)功能描述FileInputStream類File的對象或字符串表示的文件名以文件作為數(shù)據(jù)源ByteArrayInputStream字節(jié)數(shù)組以字節(jié)數(shù)組作為輸入源。FilterInputStreamInputStream的對象用于裝飾另一輸入流以提供對輸入數(shù)據(jù)的附加處理功能,子類見表9-6SequeueInputStream一系列InputStream的對象將兩個(gè)其他流首尾相接,合并為一個(gè)完整的輸入流。ObjectInputStreamInputStream的對象用于從輸入流讀取串行化對象??蓪?shí)現(xiàn)輕量級對象持久性。PipedInputStreamPipedOutputStream的對象與另一輸出管道相連,讀取寫入到輸出管道中的數(shù)據(jù),用于程序中線程間通信
FileInputStream類是InputStream的子類,可以處理簡單的文件輸入操作。例如:為了讀取f盤上的test1.txt文件,創(chuàng)建一個(gè)文件輸入流對象的代碼如下:FileInputStreamfis=newFileInputStream("f:\\test1.txt");或Filefile=newFile("f:\\test1.txt");FileInputStreamfis=newFileInputStream(file);實(shí)例9-5利用FileInputStream類把f盤中test.txt文件中的內(nèi)容讀取并在控制臺顯示出來。
9.3.2字節(jié)輸出流OutputStream類是所有字節(jié)輸出流的父類,主要是用于把內(nèi)容按照字節(jié)的方式寫入到目的端。常用方法如下:方法名功能說明voidwrite(intc)將參數(shù)c的低字節(jié)寫入到流中voidwrite(byte[]b)將字節(jié)數(shù)組b中的數(shù)據(jù)寫入到流中voidwrite(byte[]b,intoffset,intlen)將字節(jié)數(shù)組b中的從offset開始的len個(gè)字節(jié)寫入到流中voidclose()關(guān)閉此輸入流并釋放與該流關(guān)聯(lián)的所有系統(tǒng)資源voidflush()將緩沖中的字節(jié)立即發(fā)送到流中,同時(shí)清空緩沖
OutputStream類也是抽象類,要想將數(shù)據(jù)進(jìn)行寫入,也必須使用該類的子類,通過子類創(chuàng)建輸出流對象來調(diào)用write()方法進(jìn)行數(shù)據(jù)寫入。與FileInputStream類相對應(yīng)的類是FileOutputStream類。該類用于處理簡單的文本寫入操作。實(shí)例9-6利用FileInputStream類和FileOutputStream類完成文件的復(fù)制功能。
9.3.3字節(jié)過濾流過濾流是為某種目的過濾字節(jié)或字符的數(shù)據(jù)流?;咀止?jié)輸入/輸出流提供的讀取/寫入方法,只能用來讀取/寫入字節(jié)。如果想要讀取整數(shù)值、雙精度值或字符串,需要一個(gè)輸入過濾類來包裝輸入流。反之,則需要一個(gè)輸出過濾類來包裝輸出流。例如:當(dāng)需要處理基本數(shù)據(jù)類型時(shí),使用FilterInputStream和FilterOutputStream過濾字節(jié)。
9.3.3.1緩沖數(shù)據(jù)流1.BufferedInputStream和BufferedOutputStream這兩個(gè)流提供帶緩存的讀寫,提高了系統(tǒng)讀寫效率。(1)BufferedInputStream類的構(gòu)造方法publicBufferedInputStream(InputStreamin):創(chuàng)建一個(gè)使用默認(rèn)大小輸入緩沖區(qū)的緩沖字節(jié)輸入流。publicBufferedInputStream(InputStreamin,intsize):創(chuàng)建一個(gè)使用指定大小輸入緩沖區(qū)的緩沖字節(jié)輸入流。其中
size指輸入緩沖區(qū)的大小,如果size<=0,則拋出llegalArgumentException異常。
(2)BufferedOutputStream類的構(gòu)造方法publicBufferedOutputStream(OutputStreamout):創(chuàng)建一個(gè)使用默認(rèn)大小輸出緩沖區(qū)的緩沖字節(jié)輸出流。publicBufferedOutputStream(OutputStreamout,intsize):創(chuàng)建一個(gè)使用給定大小輸出緩沖區(qū)的新緩沖字節(jié)輸出流。其中size指輸入緩沖區(qū)的大小,如果size<=0,則拋出IllegalArgumentException.異常。實(shí)例9-7利用BufferedInputStream類和BufferedOutputStream類完成文件的復(fù)制功能。9.4字符流9.4.1字符輸入流Reader類是表示字符輸入流的所有類的父類,主要是用于從數(shù)據(jù)源按照字符的方式讀取數(shù)據(jù)。該類的所有方法在出錯(cuò)情況下都將引發(fā)IOException異常。由于Reader類是抽象類,要想對文件中的字符進(jìn)行讀取,還必須使用該類的子類,通過其子類創(chuàng)建流對象來調(diào)用read()方法進(jìn)行字符的讀取。
為了讀取一個(gè)文件,需要使用FileReader類的構(gòu)造方法來打開一個(gè)到達(dá)該文件的輸入流(該文件就是數(shù)據(jù)源,輸入流指向該文件)。FileReader最常用的構(gòu)造方法顯示如下:FileReader(StringfilePath)FileReader(FilefileObj)這里,filePath是一個(gè)文件的完整路徑,fileObj是描述該文件的
File對象。實(shí)例9-8利用FileReader類把f盤中test3.txt文件中的內(nèi)容讀取并在控制臺顯示出來。
8.4.2字符輸出流Writer類是表示字符輸出流的所有類的父類,主要是按照字符的方式把數(shù)據(jù)寫入到流中。Writer類提供的方法與OutputStream類似,只是將基于Byte的參數(shù)改為基于Char。與FileOutputStream相似,如果用戶的文件讀取需求比較簡單,可以使用Writer類的子類FileWriter(字符文件輸出流)來實(shí)現(xiàn)。該類用于向文件寫字符信息。為了向一個(gè)文件寫信息,需要使用FileWriter類的構(gòu)造方法來打開一個(gè)輸出流。
常用的構(gòu)造方法如下:FileWriter(StringfilePath)FileWriter(StringfilePath,booleanappend)FileWriter(FilefileObj)實(shí)例9-8利用FileWriter類將“你好welcome!”輸出到f盤中test4.txt文件中。
8.4.3字符緩沖流Java提供了字符緩沖流BufferedReader類和BufferedWriter類來對字符進(jìn)行緩沖處理。緩沖字符流的出現(xiàn)提高了對流的操作效率。如果沒有緩存,例如FileReader對象,每次調(diào)用read()方法進(jìn)行讀操作時(shí),都會直接去文件中讀取字節(jié),轉(zhuǎn)換成字符并返回,這樣頻繁的讀取文件效率很低。如果利用緩存將數(shù)據(jù)先緩沖起來,然后一起寫入或者讀取出來,則可以大量減少訪問文件的次數(shù),提高訪問效率??傊?,使用緩沖流的好處是:能夠更高效的讀寫信息。
1.字符緩沖輸入流BufferedReader類的構(gòu)造方法:publicBufferedReader(Readin):創(chuàng)建一個(gè)使用默認(rèn)大小輸入緩沖區(qū)的緩沖字符輸入流。publicBufferedReader(Readerin,intsize):創(chuàng)建一個(gè)使用指定大小輸入緩沖區(qū)的緩沖字符輸入流。其中
size指輸入緩沖區(qū)的大小,如果size<=0,則拋出llegalArgumentException異常。BufferedReader類的常用方法:publicStringreadLine()throwsIOException:讀取一個(gè)文本行。
2.字符緩沖輸出流BufferedWriter類的構(gòu)造方法:publicBufferedWriter(writerout):創(chuàng)建一個(gè)使用默認(rèn)大小輸出緩沖區(qū)的緩沖字符輸出流。publicBufferedWriter(Writerout,intsize):創(chuàng)建一個(gè)使用給定大小輸出緩沖區(qū)的新緩沖字符輸出流。BufferedWriter類的常用方法:publicvoidnewLine()throwIOException:寫入一個(gè)行分隔符,行分隔符字符串由系統(tǒng)屬性line.separator定義,而不是單個(gè)新行(\n)符。實(shí)例9-9將f盤上的文件“test4.txt”中的內(nèi)容按行讀出,并寫入到另一個(gè)文件“test5.txt”中,且給每一行按序加上行號。
9.4.4字節(jié)流與字符流的轉(zhuǎn)換Java提供的InputStreamReader類和OutputStreamWriter類就是字節(jié)流和字符流之間轉(zhuǎn)換的類,其中InputStreamReader從輸入流中讀取字節(jié)數(shù)據(jù),并按照一定的編碼方式將其轉(zhuǎn)換為字符數(shù)據(jù);OuputStreamWriter可以將字符數(shù)據(jù)編碼成字節(jié)數(shù)據(jù)后寫入到字節(jié)輸出流中。
1.InputStreamReader類該類是Reader類的子類,它在字節(jié)輸入流和字符輸入流間架起了一道橋梁。InputStreamReader類有兩個(gè)主要的構(gòu)造方法:InputStreamReader(InputStreamin):用默認(rèn)字符集創(chuàng)建一個(gè)
InputStreamReader對象。InputStreamReader(InputStreamin,StringCharsetName):接受已指定字符集名的字符串,并用該字符集創(chuàng)建對象。
2.OutputStreamWriter類該類是Writer的子類,它將UTF-16字符轉(zhuǎn)換為指定的字符編碼形式寫入到字節(jié)輸出流。OutputStreamWriter也有對應(yīng)的兩個(gè)主要的構(gòu)造函數(shù):OutputStreamWriter(OutputStreamin):用默認(rèn)字符集創(chuàng)建一個(gè)
OutputStreamWriter對象。OutputStreamWriter(OutputStreamin,StringCharsetNarme):接受已指定字符集名的字符串,并用該字符集創(chuàng)建
OutputStreamWriter對象。實(shí)例9-10利用OutputStreamWriter類在f盤上創(chuàng)建一個(gè)文件“test6.txt”,按照“GBK”編碼方式向其寫入“你好,歡迎進(jìn)入Java編程世界!”;然后利用InputStreamReader類將“test6.txt”中的內(nèi)容復(fù)制到文件“test7.txt”中。
9.5文件的隨機(jī)訪問和標(biāo)準(zhǔn)輸入輸出9.5.1文件的隨機(jī)訪問RandomAccessFile是IO包的類,但是其自成一派,從Object直接繼承而來,是一個(gè)完全獨(dú)立的類,它實(shí)現(xiàn)了DataInput和DataOutput接口。RandomAccessFile有強(qiáng)大的文件讀寫功能,其內(nèi)部是大型byte[],,getFilePointer()等方法操作的指針,可以對文件進(jìn)行隨機(jī)讀取和寫入。RandomAccessFile類支持“隨機(jī)訪問”方式,可以跳轉(zhuǎn)到文件的任意位置處讀寫數(shù)據(jù)。在訪問一個(gè)文件的時(shí)候,如果不想將文件從頭讀到尾,而是希望像訪問一個(gè)數(shù)據(jù)庫一樣地訪問一個(gè)文本文件,這時(shí),使用
RandomAccessFile類就是最佳選擇。
RandomAccessFile類的構(gòu)造方法如下:publicRandomAccessFile(Stringname,Stringmode)publicRandomAccessFile(Filefile,Stringmode)
其中參數(shù)mode的可選值為:“r”或“rw”。當(dāng)模式為r時(shí),如果文件不存在則會報(bào)異常;當(dāng)模式為rw時(shí),如果文件不存在會自動(dòng)創(chuàng)建文件,當(dāng)文件已經(jīng)存在時(shí),不會對原有文件進(jìn)行覆蓋。
RandomAccessFile類的常用方法:publiclonggetFilePointer():獲取文件位置指針
publicvoidseek(longpos):文件位置指針定位publicintskipBytes(intcount):跳過多少字節(jié)數(shù)publiclonglength():獲取文件長度
9.5.2標(biāo)準(zhǔn)輸入輸出Java的標(biāo)準(zhǔn)輸入/輸出分別通過System.in和System.out來代表,在默認(rèn)的情況下分別代表鍵盤和顯示器,當(dāng)程序通過System.in來獲得輸入時(shí),實(shí)際上是通過鍵盤獲得輸入。當(dāng)程序通過System.out執(zhí)行輸出時(shí),程序總是輸出到屏幕。因此,對鍵盤的輸入操作稱為標(biāo)準(zhǔn)輸入操作;向顯示器的輸出操作稱為標(biāo)準(zhǔn)輸出操作。
Java通過java.lang包中的System類提供標(biāo)準(zhǔn)輸入輸出,該類包括in、out、err幾個(gè)成員方法,其基本功能如下:System.out:類型為java.io.PrintStream,提供向“標(biāo)準(zhǔn)輸出”寫出數(shù)據(jù)的能力。System.in:類型為java.io.InputStream,提供從“標(biāo)準(zhǔn)輸入”讀入數(shù)據(jù)的能力。System.err:類型為java.io.PrintStream,提供向“標(biāo)準(zhǔn)錯(cuò)誤輸出”寫出數(shù)據(jù)的能力。實(shí)例9-11利用RandomAccessFile類在f盤上創(chuàng)建一個(gè)文件“rtest.dat”并向其寫入10個(gè)double類型的數(shù)據(jù);然后利用seek()方法將文件指針第5個(gè)數(shù)據(jù)后面,重寫第6個(gè)數(shù)據(jù),最后輸出文件中的10個(gè)數(shù)據(jù)。9.6對象流Java提供了對象的序列化和反序列化機(jī)制,保證對象流在對象層次上進(jìn)行輸入輸出。所謂對象序列化,就是將一個(gè)對象轉(zhuǎn)換為二進(jìn)制的數(shù)據(jù)流。通過將對象序列化,可以方便的實(shí)現(xiàn)對象的傳輸及保存。如果一個(gè)類的對象要想實(shí)現(xiàn)序列化,就必須保證該類實(shí)現(xiàn)serializable或Externalizable接口。在此接口中沒有任何的方法,只是作為一個(gè)標(biāo)識,表示本類的對象具備了序列化的能力而已。
所謂對象反序列化,就是將對象的二進(jìn)制數(shù)據(jù)流轉(zhuǎn)換成相應(yīng)的對象。在Java中,利用ObjectOutputStream和ObjectInputStream這兩個(gè)類來實(shí)現(xiàn)對象的序列化和反序列化;其中利用ObjectOutputStr
溫馨提示
- 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年中國電鍍口琴市場調(diào)查研究報(bào)告
- 2025年中國燒杯市場調(diào)查研究報(bào)告
- 2025年中國沙灘折疊桌椅市場調(diào)查研究報(bào)告
- 車子委托轉(zhuǎn)讓合同范本
- 2025年中國棉滌綸布市場調(diào)查研究報(bào)告
- 2025年中國有機(jī)系過濾膜市場調(diào)查研究報(bào)告
- 賣買房合同范本
- 2025年中國微晶投影屏幕市場調(diào)查研究報(bào)告
- 采購借用合同范本
- 廢鋼購銷合同范本
- 新能源汽車底盤概論課件
- 全腦血管造影術(shù)的護(hù)理查房
- 學(xué)習(xí)弘揚(yáng)紅船精神課件
- 消防工程施工組織設(shè)計(jì)方案
- 敦刻爾克大撤退課件
- 農(nóng)藥殘留監(jiān)測
- 新生兒敗血癥(共22張課件)
- 頌缽療愈師培訓(xùn)
- 2025蛇年春節(jié)習(xí)俗大賞體驗(yàn)感受家的溫馨課件
- 投資居間協(xié)議合同模板
- 多重耐藥菌的預(yù)防及護(hù)理課件
評論
0/150
提交評論