Java語言程序設計(自考)課件 第七章 輸入和輸出流_第1頁
Java語言程序設計(自考)課件 第七章 輸入和輸出流_第2頁
Java語言程序設計(自考)課件 第七章 輸入和輸出流_第3頁
Java語言程序設計(自考)課件 第七章 輸入和輸出流_第4頁
Java語言程序設計(自考)課件 第七章 輸入和輸出流_第5頁
已閱讀5頁,還剩53頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第7章Java語言的高級特性學習目標掌握數(shù)據(jù)流的基本概念和主要的操作方法,能夠?qū)崿F(xiàn)基本的輸入輸出功能掌握字節(jié)數(shù)據(jù)流的基本概念,包括文件數(shù)據(jù)流、過濾器數(shù)據(jù)流、緩沖數(shù)據(jù)流等,能夠使用字節(jié)數(shù)據(jù)流的主要操作方法實現(xiàn)基本的輸入輸出功能。能夠使用串接功能完成輸入輸出功能掌握字符流的基本概念,包括字符輸入流和字符輸出流。能夠使用緩沖區(qū)輸入輸出方法實現(xiàn)基本的輸入輸出功能掌握文件操作的基本方法,熟悉對文件操作的File類和RandomAccessFile隨機存取文件類。能夠創(chuàng)建File對象,使用文件對話框打開和保存文件,能夠編寫文件輸入和輸出應用程序本章內(nèi)容數(shù)據(jù)流的基本概念1基本字節(jié)數(shù)據(jù)流類2基本字符流3文件的處理4第一節(jié)數(shù)據(jù)流的基本概念數(shù)據(jù)流是指一組有順序的、有起點和終點的字節(jié)集合,程序從鍵盤接收數(shù)據(jù)或向文件中寫數(shù)據(jù),都可以使用數(shù)據(jù)流來完成

流被組織成不同的層次用于字節(jié)傳輸(如二進制)用于字符傳輸

(如文本或ASCII)數(shù)據(jù)流分為輸入數(shù)據(jù)流和輸出數(shù)據(jù)流輸入數(shù)據(jù)流只能讀不能寫輸出數(shù)據(jù)流只能寫不能讀從數(shù)據(jù)流中讀取數(shù)據(jù)時,必須有一個數(shù)據(jù)源與該數(shù)據(jù)流相連java.io包中提供了表示數(shù)據(jù)流的4個基本抽象類InputStream和OutputStreamReader和Writer要使用引入語句:importjava.io.*;輸入數(shù)據(jù)流輸入數(shù)據(jù)流(InputStream)是指只能讀不能寫的數(shù)據(jù)流,用于向計算機內(nèi)輸入信息而用java.io包中所有輸入數(shù)據(jù)流都是由抽象類InputStream繼承而來讀取數(shù)據(jù)、標記位置、重置讀寫指針、獲取數(shù)據(jù)量從數(shù)據(jù)流中讀取數(shù)據(jù)時,必須有一個數(shù)據(jù)源與該數(shù)據(jù)流相連輸入數(shù)據(jù)流中的主要數(shù)據(jù)操作方法以下3個方法提供了訪問數(shù)據(jù)流中數(shù)據(jù)的方法,所讀取的數(shù)據(jù)都默認為字節(jié)類型intread()從輸入流中讀取一個字節(jié)的二進制數(shù)據(jù)intread(byte[]b)將多個字節(jié)讀到數(shù)組中,填滿整個數(shù)組intread(byte[]b,intoff,intlen)從輸入流中讀取長度為len的數(shù)據(jù),從數(shù)組b中下標為off的位置開始放置讀入的數(shù)據(jù),讀畢返回讀取的字節(jié)數(shù)read()方法將讀取的一個字節(jié)作為低位,形成一個0~255之間的int類型的數(shù)值返回。它是一個抽象方法,需要在子類中具體實現(xiàn)輸入數(shù)據(jù)流中的主要數(shù)據(jù)操作方法voidclose()關閉數(shù)據(jù)流,同時釋放與該數(shù)據(jù)流相關的資源也可以由運行時系統(tǒng)自動關閉intavailable()返回目前可以從數(shù)據(jù)流中讀取的字節(jié)數(shù)(實際的讀操作所讀得的字節(jié)數(shù)可能大于該返回值)longskip(longl)跳過數(shù)據(jù)流中指定數(shù)量的字節(jié)不讀,返回值表示實際跳過的字節(jié)數(shù)輸入數(shù)據(jù)流中的主要數(shù)據(jù)操作方法booleanmarkSupported()用于測試數(shù)據(jù)流是否支持回推操作,當一個數(shù)據(jù)流支持mark()和reset()方法時返回true,否則返回false。voidmark(intmarkarea)用于標記數(shù)據(jù)流的當前位置,并劃出一個緩沖區(qū),其大小至少為指定參數(shù)的大小。voidreset()將輸入流重新定位到對此流最后調(diào)用mark方法時的位置輸出數(shù)據(jù)流輸出數(shù)據(jù)流是指只能寫不能讀的流,用于從計算機中輸出數(shù)據(jù)java.io包中所有輸出數(shù)據(jù)流大多是從抽象類OutputStream繼承而來,并且實現(xiàn)了其中的所有方法,這些方法主要提供了關于數(shù)據(jù)輸出方面的支持輸出數(shù)據(jù)流中的主要數(shù)據(jù)操作方法voidwrite(inti)將字節(jié)i寫入到數(shù)據(jù)流中,它只輸出所讀入?yún)?shù)的最低8位。該方法是抽象方法,需要在其輸出流子類中加以實現(xiàn),然后才能使用。voidwrite(byteb[])將數(shù)組b[]中的全部b.length個字節(jié)寫入數(shù)據(jù)流。voidwrite(byteb[],intoff,intlen)將數(shù)組b[]中從下標off開始的len個字節(jié)寫入數(shù)據(jù)流。元素b[off]是此操作寫入的第一個字節(jié),b[off+len-1]是此操作寫入的最后一個字節(jié)輸出數(shù)據(jù)流中的主要數(shù)據(jù)操作方法voidclose()當結(jié)束對輸出數(shù)據(jù)流的操作時應該將其關閉。voidflush()刷新此輸出流并強制寫出所有緩沖的輸出字節(jié)緩存技術為加快數(shù)據(jù)傳輸速度,提高數(shù)據(jù)輸出效率,有時輸出數(shù)據(jù)流會在提交數(shù)據(jù)之前把所要輸出的數(shù)據(jù)先暫時保存在內(nèi)存緩沖區(qū)中,然后成批進行輸出,每次傳輸過程都以某特定數(shù)據(jù)長度為單位進行傳輸這種方式下,在數(shù)據(jù)的末尾一般都會有一部分數(shù)據(jù)由于數(shù)量不夠一個批次,而存留在緩沖區(qū)里,調(diào)用方法flush()可以將這部分數(shù)據(jù)強制提交…緩沖區(qū)單位的容量末尾剩余部分第二節(jié)基本字節(jié)數(shù)據(jù)流類文件數(shù)據(jù)流包括FileImputStream和FileOutputStream,用來進行文件的I/O處理,其數(shù)據(jù)源都應當是文件

對本機上的文件進行操作,但是它們不支持方法mark()和reset()

在構(gòu)造文件數(shù)據(jù)流時,可以直接給出文件名

FileInputStreamfis=newFileInputStream("myFile");

輸入輸出時處理異常示例使用文件數(shù)據(jù)流進行I/O操作時,對于類FileInputStream的實例對象,如果所指定的文件不存在,則產(chǎn)生FileNotFoundException異常,必須加以捕獲或聲明對于類FileOutputStream的實例對象,如果所指定的文件不存在,則系統(tǒng)創(chuàng)建一個新文件;如果存在,那么新寫入的內(nèi)容將會覆蓋原有數(shù)據(jù)如果在讀、寫文件或生成新文件時發(fā)生錯誤,則會產(chǎn)生IOException異常,也需要由程序員捕獲并處理程序7.1示例可以使用FileInputStream來讀取FileOutputStream輸出的數(shù)據(jù)程序7.2過濾器數(shù)據(jù)流過濾器數(shù)據(jù)流在創(chuàng)建時與一個已經(jīng)存在的數(shù)據(jù)流相連,這樣在從這樣的數(shù)據(jù)流中讀取數(shù)據(jù)時,它提供的是對一個原始輸入數(shù)據(jù)流的內(nèi)容進行了特定處理的數(shù)據(jù)緩沖區(qū)數(shù)據(jù)流數(shù)據(jù)輸入流和數(shù)據(jù)輸出流

緩沖區(qū)數(shù)據(jù)流BufferedInputStream和BufferedOutputStream

都屬于過濾器數(shù)據(jù)流,都是在數(shù)據(jù)流上增加了一個緩沖區(qū)

讀寫數(shù)據(jù)時,數(shù)據(jù)以塊為單位先進入緩沖區(qū)(塊的大小可以進行設置),其后的讀寫操作則作用于緩沖區(qū)

降低了不同硬件設備之間速度的差異,提高了I/O操作的效率

提供了對mark()、reset()、skip()等方法的支持

創(chuàng)建該類實例對象的方法一使用默認緩沖區(qū)的大小

FileInputStreamfis=newFileInputStream("myFile");InputStreamis=newBufferedInputStream(fis);FileOutputStreamfos=newFileOutputStream("myFile");OutputStreamos=newBufferedOutputStream(fos);

創(chuàng)建該類實例對象的方法二自行設置緩沖區(qū)的大小FileInputStreamfis=newFileInputStream("myFile");InputStreamis=newBufferedInputStream(fis,1024);FileOutputStreamfos=newFileOutputStream("myFile");OutputStreamos=newBufferedOutputStream(fos,1024);關閉一個緩沖區(qū)輸出流之前,應使用flush()方法,強制輸出剩余數(shù)據(jù),以確保緩沖區(qū)內(nèi)的所有數(shù)據(jù)全部寫入輸出流

數(shù)據(jù)輸入流和數(shù)據(jù)輸出流DataInputStream和DataOutputStream允許通過數(shù)據(jù)流來讀寫Java基本數(shù)據(jù)類型布爾型(Boolean)浮點型(float)等等

數(shù)據(jù)流的創(chuàng)建方式DataInputStreamdis=newDataInputStream(is);DataOutputStreamdos=newDataOutputStream(os);DataInputStream類中的一些方法bytereadByte()longreadLong()doublereadDouble()booleanreadBoolean()StringreadUTF()intreadInt()floatreadFloat()shortreadShort()charreadChar()DataOutputStream類中的一些方法voidwriteByte(intaByte)voidwriteLong(longaLong)voidwriteDouble(doubleaDouble)voidwriteBoolean(booleanaBool)voidwriteUTF(StringaString)voidwriteInt(intanInt)voidwriteFloat(floataFloat)voidwriteShort(shortaShort)voidwriteChar(charaChar)對象流Java中的數(shù)據(jù)流不僅能對基本數(shù)據(jù)類型的數(shù)據(jù)進行操作,而且也提供了把對象寫入文件數(shù)據(jù)流或從文件數(shù)據(jù)流中讀出的功能通過java.io包中ObjectInputStream和ObjectOutputStream兩個類實現(xiàn)能夠輸入輸出對象的流稱為對象流寫對象數(shù)據(jù)流將一個java.util.Date對象實例寫入文件

讀對象數(shù)據(jù)流readObject()把數(shù)據(jù)流以Object類型返回,應該在轉(zhuǎn)換為正確的類名之后再執(zhí)行序列化的概念能夠記錄自己的狀態(tài)以便將來得到復原的能力,叫對象的持久性(Persistence)稱一個對象是可持久的,意味著可以把這個對象存入磁盤、磁帶,或傳入另一臺機器保存在它的內(nèi)存或磁盤中。也就是說把對象存為某種永久存儲類型

序列化的概念對象通過數(shù)值來描述自己的狀態(tài),記錄對象也就是記錄下這些數(shù)值把對象轉(zhuǎn)換為字節(jié)序列的過程稱為對象的序列化把字節(jié)序列恢復為對象的過程稱為對象的反序列化序列化的主要任務是寫出對象實例變量的數(shù)值序列化序列化是一種用來處理對象流的機制,所謂對象流也就是將對象的內(nèi)容進行流化。序列化是為了解決在對對象流進行讀寫操作時所引發(fā)的問題如果變量是另一個對象的引用,則引用的對象也要序列化。這個過程是遞歸的,保存的結(jié)果可以看作是一個對象網(wǎng)JDK1.1新增加了接口java.io.Serializable,并對Java虛擬機作了改動以支持將Java對象存為數(shù)據(jù)流的功能只有實現(xiàn)Serializable接口的類才能被序列化當一個類聲明實現(xiàn)Serializable接口時,表明該類加入了對象序列化協(xié)議序列化示例示例程序7.3程序7.4對象結(jié)構(gòu)表序列化只能保存對象的非靜態(tài)成員變量,而不能保存任何成員方法和靜態(tài)成員變量,并且保存的只是變量的值,對于變量的任何修飾符都不能保存,訪問權(quán)限(public,protected,private)對于數(shù)據(jù)域的序列化沒有影響有一些對象類不具有可持久性,因為其數(shù)據(jù)的特性決定了它會經(jīng)常變化,其狀態(tài)只是瞬時的,這樣的對象是無法保存其狀態(tài)的,如Thread對象或流對象。對于這樣的成員變量,必須用transient關鍵字標明,否則編譯器將報錯。任何用transient關鍵字標明的成員變量,都不會被保存對象結(jié)構(gòu)表當數(shù)據(jù)變量是一個對象時,該對象的數(shù)據(jù)成員也可以被持久化。對象的數(shù)據(jù)結(jié)構(gòu)或結(jié)構(gòu)樹,包括其子對象樹在內(nèi),構(gòu)成了這個對象的結(jié)構(gòu)表如果一個對象結(jié)構(gòu)表中包含了一個對不可持久化對象的引用,而這個引用已用關鍵字transient加以標記,則這個對象仍可以被持久化示例整個對象的序列化publicclassMyClassimplementsSerializable{publictransientThreadmyThread;privateStringcustomerID;privateinttotal;}數(shù)據(jù)不被序列化publicclassMyClassimplementsSerializable{publictransientThreadmyThread;privatetransientStringcustomerID;privateinttotal;}第三節(jié)基本字符流從JDK1.1開始,java.io包中加入了專門用于字符流處理的類,它們是以Reader和Writer為基礎派生的一系列類Reader和Writer也是抽象類,只提供了一系列用于字符流處理的接口它們的方法與類InputStream和OutputStream類似,只不過其中的參數(shù)換成字符或字符數(shù)組字符輸入流和字符輸出流字符輸入流(Readers)和字符輸出流(Writers)提供對不同平臺之間數(shù)據(jù)流數(shù)據(jù)進行轉(zhuǎn)換的功能同其他程序設計語言使用ASCII字符集不同,Java使用Unicode來表示字符串和字符ASCII字符集是以一個字節(jié)(8bit)來表示一個字符,所以可以認為一個字符就是一個字節(jié)(byte)Unicode是一種大字符集,要用兩個字節(jié)(16bit)來表示一個字符

為實現(xiàn)與其他程序語言及不同平臺的交互,Java提供一種新的數(shù)據(jù)流處理方案,稱作字符輸入流(Reader)和字符輸出流(Writer)像數(shù)據(jù)流一樣,在java.io包中有許多不同類對其進行支持,其中最重要的是InputStreamReader和OutputStreamWriter這兩個類是字節(jié)流和字符輸入流、字符輸出流的接口,用來在字節(jié)流和字符流之間作為中介使用這兩個類進行字符處理時,在構(gòu)造方法中應指定一定的平臺規(guī)范,以便把以字節(jié)方式表示的流轉(zhuǎn)換為特定平臺上的字符表示構(gòu)造方法InputStreamReader(InputStreamin)默認規(guī)范InputStreamReader(InputStreamin,Stringenc)指定規(guī)范encOutputStreamWriter(OutputStreamout)默認規(guī)范OutputStreamWriter(OutputStreamout,Stringenc)指定規(guī)范enc字符輸入流提供的方法voidclose()voidmark(intreadAheadLimit)booleanmarkSupported()intread()intread(char[]cbuf)intread(char[]cbuf,intoff,intlen)booleanready()voidreset()longskip(longn)字符輸出流提供的方法voidclose()voidflush()voidwrite(char[]cbuf)voidwrite(char[]cbuf,intoff,intlen)voidwrite(intc)voidwrite(Stringstr)voidwrite(Stringstr,intoff,intlen)緩沖區(qū)字符輸入流和緩沖區(qū)字符輸出流如果格式轉(zhuǎn)換以較大數(shù)據(jù)塊為單位進行,那么會提高效率java.io中提供了緩沖流BufferedReader和BufferedWriter其構(gòu)造方法與BufferedInputStream和BufferedOutputStream相類似除了read()和write()方法外,它還提供了整行字符處理方法publicStringreadLine()BufferedReader的方法,從輸入流中讀取一行字符,行結(jié)束標志為‘\n’、‘\r’或兩者一起publicvoidnewLine()BufferedWriter的方法,向輸出流中寫入一個行結(jié)束標志把BufferedReader或BufferedWriter正確連接到InputStreamReader或OutputStreamWriter的末尾是一個很好的方法要在BufferedWriter中使用flush()方法,以強制清空緩沖區(qū)中的剩余內(nèi)容,防止遺漏程序7.5程序7.6示例輔助類程序7.7程序7.8第四節(jié)文件的處理Java提供了File類,用于處理與文件相關的操作File對象可以用來生成與文件(及其所在的路徑)或目錄結(jié)構(gòu)相關的對象使用File類可以達到與系統(tǒng)無關的目的,使用的是抽象的路徑表示法類java.io.File提供了獲得文件基本信息及操作文件的一些方法File類創(chuàng)建一個新的File對象可以使用以下3種構(gòu)造方法第1種方法FilemyFile;myFile=newFile("mymotd");第2種方法myFile=newFile("/","mymotd");第3種方法FilemyDir=newFile("/");myFile=newFile(myDir,"mymotd");與文件名相關的方法StringgetName()獲取文件名StringgetPath()獲取文件路徑StringgetAbsolutePath()獲取文件絕對路徑StringgetParent()獲取文件父目錄名稱booleanrenameTo(FilenewName)更改文件名,成功則返回true,否則返回false文件測定方法booleanexists()文件對象是否存在booleancanWrite()文件對象是否可寫booleancanRead

溫馨提示

  • 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

提交評論