




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第7章Java語言的高級特性學習目標掌握數據流的基本概念和主要的操作方法,能夠實現基本的輸入輸出功能掌握字節數據流的基本概念,包括文件數據流、過濾器數據流、緩沖數據流等,能夠使用字節數據流的主要操作方法實現基本的輸入輸出功能。能夠使用串接功能完成輸入輸出功能掌握字符流的基本概念,包括字符輸入流和字符輸出流。能夠使用緩沖區輸入輸出方法實現基本的輸入輸出功能掌握文件操作的基本方法,熟悉對文件操作的File類和RandomAccessFile隨機存取文件類。能夠創建File對象,使用文件對話框打開和保存文件,能夠編寫文件輸入和輸出應用程序本章內容數據流的基本概念1基本字節數據流類2基本字符流3文件的處理4第一節數據流的基本概念數據流是指一組有順序的、有起點和終點的字節集合,程序從鍵盤接收數據或向文件中寫數據,都可以使用數據流來完成
流被組織成不同的層次用于字節傳輸(如二進制)用于字符傳輸
(如文本或ASCII)數據流分為輸入數據流和輸出數據流輸入數據流只能讀不能寫輸出數據流只能寫不能讀從數據流中讀取數據時,必須有一個數據源與該數據流相連java.io包中提供了表示數據流的4個基本抽象類InputStream和OutputStreamReader和Writer要使用引入語句:importjava.io.*;輸入數據流輸入數據流(InputStream)是指只能讀不能寫的數據流,用于向計算機內輸入信息而用java.io包中所有輸入數據流都是由抽象類InputStream繼承而來讀取數據、標記位置、重置讀寫指針、獲取數據量從數據流中讀取數據時,必須有一個數據源與該數據流相連輸入數據流中的主要數據操作方法以下3個方法提供了訪問數據流中數據的方法,所讀取的數據都默認為字節類型intread()從輸入流中讀取一個字節的二進制數據intread(byte[]b)將多個字節讀到數組中,填滿整個數組intread(byte[]b,intoff,intlen)從輸入流中讀取長度為len的數據,從數組b中下標為off的位置開始放置讀入的數據,讀畢返回讀取的字節數read()方法將讀取的一個字節作為低位,形成一個0~255之間的int類型的數值返回。它是一個抽象方法,需要在子類中具體實現輸入數據流中的主要數據操作方法voidclose()關閉數據流,同時釋放與該數據流相關的資源也可以由運行時系統自動關閉intavailable()返回目前可以從數據流中讀取的字節數(實際的讀操作所讀得的字節數可能大于該返回值)longskip(longl)跳過數據流中指定數量的字節不讀,返回值表示實際跳過的字節數輸入數據流中的主要數據操作方法booleanmarkSupported()用于測試數據流是否支持回推操作,當一個數據流支持mark()和reset()方法時返回true,否則返回false。voidmark(intmarkarea)用于標記數據流的當前位置,并劃出一個緩沖區,其大小至少為指定參數的大小。voidreset()將輸入流重新定位到對此流最后調用mark方法時的位置輸出數據流輸出數據流是指只能寫不能讀的流,用于從計算機中輸出數據java.io包中所有輸出數據流大多是從抽象類OutputStream繼承而來,并且實現了其中的所有方法,這些方法主要提供了關于數據輸出方面的支持輸出數據流中的主要數據操作方法voidwrite(inti)將字節i寫入到數據流中,它只輸出所讀入參數的最低8位。該方法是抽象方法,需要在其輸出流子類中加以實現,然后才能使用。voidwrite(byteb[])將數組b[]中的全部b.length個字節寫入數據流。voidwrite(byteb[],intoff,intlen)將數組b[]中從下標off開始的len個字節寫入數據流。元素b[off]是此操作寫入的第一個字節,b[off+len-1]是此操作寫入的最后一個字節輸出數據流中的主要數據操作方法voidclose()當結束對輸出數據流的操作時應該將其關閉。voidflush()刷新此輸出流并強制寫出所有緩沖的輸出字節緩存技術為加快數據傳輸速度,提高數據輸出效率,有時輸出數據流會在提交數據之前把所要輸出的數據先暫時保存在內存緩沖區中,然后成批進行輸出,每次傳輸過程都以某特定數據長度為單位進行傳輸這種方式下,在數據的末尾一般都會有一部分數據由于數量不夠一個批次,而存留在緩沖區里,調用方法flush()可以將這部分數據強制提交…緩沖區單位的容量末尾剩余部分第二節基本字節數據流類文件數據流包括FileImputStream和FileOutputStream,用來進行文件的I/O處理,其數據源都應當是文件
對本機上的文件進行操作,但是它們不支持方法mark()和reset()
在構造文件數據流時,可以直接給出文件名
FileInputStreamfis=newFileInputStream("myFile");
輸入輸出時處理異常示例使用文件數據流進行I/O操作時,對于類FileInputStream的實例對象,如果所指定的文件不存在,則產生FileNotFoundException異常,必須加以捕獲或聲明對于類FileOutputStream的實例對象,如果所指定的文件不存在,則系統創建一個新文件;如果存在,那么新寫入的內容將會覆蓋原有數據如果在讀、寫文件或生成新文件時發生錯誤,則會產生IOException異常,也需要由程序員捕獲并處理程序7.1示例可以使用FileInputStream來讀取FileOutputStream輸出的數據程序7.2過濾器數據流過濾器數據流在創建時與一個已經存在的數據流相連,這樣在從這樣的數據流中讀取數據時,它提供的是對一個原始輸入數據流的內容進行了特定處理的數據緩沖區數據流數據輸入流和數據輸出流
緩沖區數據流BufferedInputStream和BufferedOutputStream
都屬于過濾器數據流,都是在數據流上增加了一個緩沖區
讀寫數據時,數據以塊為單位先進入緩沖區(塊的大小可以進行設置),其后的讀寫操作則作用于緩沖區
降低了不同硬件設備之間速度的差異,提高了I/O操作的效率
提供了對mark()、reset()、skip()等方法的支持
創建該類實例對象的方法一使用默認緩沖區的大小
FileInputStreamfis=newFileInputStream("myFile");InputStreamis=newBufferedInputStream(fis);FileOutputStreamfos=newFileOutputStream("myFile");OutputStreamos=newBufferedOutputStream(fos);
創建該類實例對象的方法二自行設置緩沖區的大小FileInputStreamfis=newFileInputStream("myFile");InputStreamis=newBufferedInputStream(fis,1024);FileOutputStreamfos=newFileOutputStream("myFile");OutputStreamos=newBufferedOutputStream(fos,1024);關閉一個緩沖區輸出流之前,應使用flush()方法,強制輸出剩余數據,以確保緩沖區內的所有數據全部寫入輸出流
數據輸入流和數據輸出流DataInputStream和DataOutputStream允許通過數據流來讀寫Java基本數據類型布爾型(Boolean)浮點型(float)等等
數據流的創建方式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中的數據流不僅能對基本數據類型的數據進行操作,而且也提供了把對象寫入文件數據流或從文件數據流中讀出的功能通過java.io包中ObjectInputStream和ObjectOutputStream兩個類實現能夠輸入輸出對象的流稱為對象流寫對象數據流將一個java.util.Date對象實例寫入文件
讀對象數據流readObject()把數據流以Object類型返回,應該在轉換為正確的類名之后再執行序列化的概念能夠記錄自己的狀態以便將來得到復原的能力,叫對象的持久性(Persistence)稱一個對象是可持久的,意味著可以把這個對象存入磁盤、磁帶,或傳入另一臺機器保存在它的內存或磁盤中。也就是說把對象存為某種永久存儲類型
序列化的概念對象通過數值來描述自己的狀態,記錄對象也就是記錄下這些數值把對象轉換為字節序列的過程稱為對象的序列化把字節序列恢復為對象的過程稱為對象的反序列化序列化的主要任務是寫出對象實例變量的數值序列化序列化是一種用來處理對象流的機制,所謂對象流也就是將對象的內容進行流化。序列化是為了解決在對對象流進行讀寫操作時所引發的問題如果變量是另一個對象的引用,則引用的對象也要序列化。這個過程是遞歸的,保存的結果可以看作是一個對象網JDK1.1新增加了接口java.io.Serializable,并對Java虛擬機作了改動以支持將Java對象存為數據流的功能只有實現Serializable接口的類才能被序列化當一個類聲明實現Serializable接口時,表明該類加入了對象序列化協議序列化示例示例程序7.3程序7.4對象結構表序列化只能保存對象的非靜態成員變量,而不能保存任何成員方法和靜態成員變量,并且保存的只是變量的值,對于變量的任何修飾符都不能保存,訪問權限(public,protected,private)對于數據域的序列化沒有影響有一些對象類不具有可持久性,因為其數據的特性決定了它會經常變化,其狀態只是瞬時的,這樣的對象是無法保存其狀態的,如Thread對象或流對象。對于這樣的成員變量,必須用transient關鍵字標明,否則編譯器將報錯。任何用transient關鍵字標明的成員變量,都不會被保存對象結構表當數據變量是一個對象時,該對象的數據成員也可以被持久化。對象的數據結構或結構樹,包括其子對象樹在內,構成了這個對象的結構表如果一個對象結構表中包含了一個對不可持久化對象的引用,而這個引用已用關鍵字transient加以標記,則這個對象仍可以被持久化示例整個對象的序列化publicclassMyClassimplementsSerializable{publictransientThreadmyThread;privateStringcustomerID;privateinttotal;}數據不被序列化publicclassMyClassimplementsSerializable{publictransientThreadmyThread;privatetransientStringcustomerID;privateinttotal;}第三節基本字符流從JDK1.1開始,java.io包中加入了專門用于字符流處理的類,它們是以Reader和Writer為基礎派生的一系列類Reader和Writer也是抽象類,只提供了一系列用于字符流處理的接口它們的方法與類InputStream和OutputStream類似,只不過其中的參數換成字符或字符數組字符輸入流和字符輸出流字符輸入流(Readers)和字符輸出流(Writers)提供對不同平臺之間數據流數據進行轉換的功能同其他程序設計語言使用ASCII字符集不同,Java使用Unicode來表示字符串和字符ASCII字符集是以一個字節(8bit)來表示一個字符,所以可以認為一個字符就是一個字節(byte)Unicode是一種大字符集,要用兩個字節(16bit)來表示一個字符
為實現與其他程序語言及不同平臺的交互,Java提供一種新的數據流處理方案,稱作字符輸入流(Reader)和字符輸出流(Writer)像數據流一樣,在java.io包中有許多不同類對其進行支持,其中最重要的是InputStreamReader和OutputStreamWriter這兩個類是字節流和字符輸入流、字符輸出流的接口,用來在字節流和字符流之間作為中介使用這兩個類進行字符處理時,在構造方法中應指定一定的平臺規范,以便把以字節方式表示的流轉換為特定平臺上的字符表示構造方法InputStreamReader(InputStreamin)默認規范InputStreamReader(InputStreamin,Stringenc)指定規范encOutputStreamWriter(OutputStreamout)默認規范OutputStreamWriter(OutputStreamout,Stringenc)指定規范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)緩沖區字符輸入流和緩沖區字符輸出流如果格式轉換以較大數據塊為單位進行,那么會提高效率java.io中提供了緩沖流BufferedReader和BufferedWriter其構造方法與BufferedInputStream和BufferedOutputStream相類似除了read()和write()方法外,它還提供了整行字符處理方法publicStringreadLine()BufferedReader的方法,從輸入流中讀取一行字符,行結束標志為‘\n’、‘\r’或兩者一起publicvoidnewLine()BufferedWriter的方法,向輸出流中寫入一個行結束標志把BufferedReader或BufferedWriter正確連接到InputStreamReader或OutputStreamWriter的末尾是一個很好的方法要在BufferedWriter中使用flush()方法,以強制清空緩沖區中的剩余內容,防止遺漏程序7.5程序7.6示例輔助類程序7.7程序7.8第四節文件的處理Java提供了File類,用于處理與文件相關的操作File對象可以用來生成與文件(及其所在的路徑)或目錄結構相關的對象使用File類可以達到與系統無關的目的,使用的是抽象的路徑表示法類java.io.File提供了獲得文件基本信息及操作文件的一些方法File類創建一個新的File對象可以使用以下3種構造方法第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. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- GB/T 45696-2025公共汽電車場站分類及等級劃分
- 2025年新材料技術考試卷及答案
- 2025年網絡與信息安全工程師考試試題及答案
- TWS119-Standard-生命科學試劑-MCE
- SHP099-Standard-生命科學試劑-MCE
- 2025年口腔醫學專業成人教育考試試卷及答案
- 2025年環境工程師職業水平考試試卷及答案
- 2025年個人理財與投資分析專業期末考試內容及試卷及答案
- 夢想成真追逐夢想的演講稿(5篇)
- 儲備林建設管理實施方案
- 2023年養老服務有限公司簡介(4個范本)
- 紅色文化知識競賽試題及答案
- 老舊住宅屋面防水工程施工方案
- 操作規程儲氣罐安全操作規程
- 電廠物資管理系統解決方案
- 初一數學(下)難題百道及答案
- 七年級下實數及實數的計算
- 中國古典文獻學(全套)
- 《抖音平臺商品銷售策略研究10000字(論文)》
- 兩用物項-最終用戶用途證明
- 2023-2024學年貴州省銅仁市小學數學五年級下冊期末高分預測題
評論
0/150
提交評論