




已閱讀5頁,還剩51頁未讀, 繼續(xù)免費閱讀
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
第10章 Java數(shù)據(jù)流,Java數(shù)據(jù)流,本章主要介紹Java語言如何利用數(shù)據(jù)流的思想處理字節(jié)和字符的輸入輸出(包括stdin、stdout和stderr)。本章后面的幾個小節(jié)還將介紹一些對文件和文件中的數(shù)據(jù)進行處理的具體方法。,數(shù)據(jù)流的基本概念,數(shù)據(jù)流是指一組有順序的、有起點和終點的字節(jié)集合,流的不同層次,流被組織成不同的層次。最粗略的,數(shù)據(jù)流可以分為輸入數(shù)據(jù)流(input stream)和輸出數(shù)據(jù)流(output stream)。輸入數(shù)據(jù)流只能讀不能寫,而輸出數(shù)據(jù)流只能寫不能讀,Java開發(fā)環(huán)境數(shù)據(jù)流,java.io包提供數(shù)據(jù)流 在JDK1.1之前,java.io包中的流只有以byte為單位的流 對于以16位的Unicode碼表示的字符流處理很不方便 JDK1.1開始,java.io包中加入了專門用于字符流處理的類,這是以Reader和Writer為基礎(chǔ)派生的一系列的類 ,還有用于對象的永久化保存狀態(tài)的機制,它們通過實現(xiàn)ObjectInput和ObjectOutput接口來達到要求,import java.io.*,輸入數(shù)據(jù)流,輸入數(shù)據(jù)流(Input Stream)是指只能讀不能寫的數(shù)據(jù)流,用于向計算機內(nèi)輸入信息而用 java.io包中所有輸入數(shù)據(jù)流都是由抽象類InputStream繼承而來 從數(shù)據(jù)流中讀取數(shù)據(jù)時,必須有一個數(shù)據(jù)源與該數(shù)據(jù)流相連,主要數(shù)據(jù)操作方法,int read() 從輸入流中讀一個字節(jié)的二進制數(shù)據(jù),然后以此數(shù)據(jù)為低位字節(jié),配上一個全零字節(jié),形成一個0255之間的整數(shù)返回。它是一個抽象方法,需要在子類中具體實現(xiàn)。讀取結(jié)束時,它會得到-1 int read(byte b) 將多個字節(jié)讀到數(shù)組中,填滿整個數(shù)組 int read(byte b, int off , int len) 從輸入流中讀取長度為len的數(shù)據(jù),從數(shù)組b中索引為off的位置開始放置讀入的數(shù)據(jù),讀畢返回讀取的字節(jié)數(shù),主要數(shù)據(jù)操作方法,void close() 數(shù)據(jù)流關(guān)閉,同時釋放與該數(shù)據(jù)流相關(guān)的資源 也可以由運行時系統(tǒng)自動關(guān)閉 int available() 返回目前可以從數(shù)據(jù)流中讀取的字節(jié)數(shù)(實際的讀操作所讀得的字節(jié)數(shù)可能大于該返回值) long skip(long l) 跳過數(shù)據(jù)流中指定數(shù)量的字節(jié)不讀,返回值表示實際跳過的字節(jié)數(shù),主要數(shù)據(jù)操作方法,boolean markSupported() 用于指示數(shù)據(jù)流是否支持回推操作,當(dāng)數(shù)據(jù)流支持mark()和reset()方法時返回true,反之返回false void mark(int markarea) 標(biāo)記數(shù)據(jù)流的當(dāng)前位置,并劃出一個緩沖區(qū),其大小至少為指定參數(shù)的大小 void reset() 執(zhí)行完read()操作后,調(diào)用方法reset()將回到輸入數(shù)據(jù)流中被標(biāo)記的位置,輸出數(shù)據(jù)流,輸出數(shù)據(jù)流(Output Stream)是指只能寫不能讀的流,用于從計算機中輸出數(shù)據(jù) java.io包中所有輸出數(shù)據(jù)流大多是從抽象類OutputStream繼承而來,主要數(shù)據(jù)操作方法,void write(int i) 將字節(jié)i寫入到數(shù)據(jù)流中,它只輸出低位字節(jié)。該方法是抽象方法,需要在其輸出流子類中加以實現(xiàn),然后才能使用 void write(byte b) 將數(shù)組b中的全部b.length個字節(jié)寫入數(shù)據(jù)流 void write(byte b, int off, int len) 將數(shù)組b中從第off個字節(jié)開始的len個字節(jié)寫入數(shù)據(jù)流,主要數(shù)據(jù)操作方法,void close() 當(dāng)結(jié)束對輸出數(shù)據(jù)流的操作時將其關(guān)閉 void flush() 輸出數(shù)據(jù)流會在提交數(shù)據(jù)之前把所要輸出的數(shù)據(jù)先鎖定在內(nèi)存緩沖區(qū)中,然后成批地進行輸出,每次傳輸過程都以某特定數(shù)據(jù)長度為單位進行傳輸。這種方式下,在數(shù)據(jù)的末尾一般都會有一部分?jǐn)?shù)據(jù)由于數(shù)量不夠一個批次,而存留在緩沖區(qū)里, flush()可以將留在緩沖區(qū)里的數(shù)據(jù)強制提交,緩沖存儲,基本字節(jié)數(shù)據(jù)流類,文件數(shù)據(jù)流 包括FileImputStream和FileOutputStream, 用來進行文件的I/O處理,其數(shù)據(jù)源都應(yīng)當(dāng)是文件 對本機上的文件進行操作,但是它們不支持方法mark()和reset() 在構(gòu)造文件數(shù)據(jù)流時,可以直接給出文件名,FileInputStream fis = new FileInputStream(“myFile“);,例10-2,在“myFile.dat”文件中會保存字符串HELLO!,FileOutputStream out = new FileOutputStream(“myFile.dat“); out.write(H); out.write(69); out.write(76); out.write(L); out.write(O); out.write(!); out.close();,文件I/O操作異常,類FileInputStream的實例對象,如果所指定的文件不存在,產(chǎn)生FileNotFoundException異常 類FileOutputStream的實例對象,如果所指定的文件不存在,則創(chuàng)建一個新文件;如果存在,那么新寫入的內(nèi)容將會覆蓋原有數(shù)據(jù) 如果在讀、寫或生成新文件時發(fā)生錯誤,則會產(chǎn)生IOException異常,文件數(shù)據(jù)流I/O操作,程序10-1異常捕獲并處理 FileInputStream來讀取FileOutputStream輸出的數(shù)據(jù) 程序10-2,過濾流,過濾器數(shù)據(jù)流在創(chuàng)建時與一個已經(jīng)存在的數(shù)據(jù)流相連,這樣在從這樣的數(shù)據(jù)流中讀取數(shù)據(jù)時,它提供的是對一個原始輸入數(shù)據(jù)流的內(nèi)容進行了特定處理的數(shù)據(jù)。,緩沖區(qū)數(shù)據(jù)流,BufferedInputStream和BufferedOutputStream 都屬于過濾器數(shù)據(jù)流,都是在數(shù)據(jù)流上增加了一個緩沖區(qū) 讀寫數(shù)據(jù)時,數(shù)據(jù)以塊為單位先進入緩沖區(qū)(塊的大小可以進行設(shè)置),其后的讀寫操作則作用于緩沖區(qū) 降低了不同硬件設(shè)備之間速度的差異,提高了I/O操作的效率 提供了對mark()、reset()、skip()等方法的支持,創(chuàng)建該類的實例對象,取缺省緩沖區(qū)的大小 自行設(shè)置緩沖區(qū)的大小 關(guān)閉一個緩沖區(qū)輸出流之前,使用flush()方法,FileInputStream fis = new FileInputStream(“myFile“); InputStream is = new BufferedInputStream(fis); FileOutputStream fos = new FileOutputStream(“myFile“); OutputStream os = new BufferedOutputStream(fos);,FileInputStream fis = new FileInputStream(“myFile“); InputStream is = new BufferedInputStream(fis,1024); FileOutputStream fos = new FileOutputStream(“myFile“); OutputStream os = new BufferedOutputStream(fos,1024);,數(shù)據(jù)數(shù)據(jù)流,DataInputStream和DataOutputStream 允許通過數(shù)據(jù)流來讀寫Java原始類型 布爾型(Boolean)、浮點型(float)等等 創(chuàng)建方式:,DataInputStream dis = new DataInputStream(is); DataOutputStream dos = new DataOutputStream(os);,DataInputStream類方法,byte readByte() long readLong() double readDouble() boolean readBoolean() String readUTF() int readInt() float readFloat() short readShort() char readChar(),DataOutputStream類方法,void writeByte(int aByte) void writeLong(long aLong) void writeDouble(double aDouble) void writeBoolean(boolean aBool) void writeUTF(String aString) void writeInt(int anInt) void writeFloat(float aFloat) void writeShort(short aShort) void writeChar(char aChar),DataInputStream的方法與DataOutputStream的方法都是成對出現(xiàn)的,管道數(shù)據(jù)流,管道數(shù)據(jù)流主要用于線程間的通信 一個線程中的PipedInputStream對象從另一個線程中互補的PipedOutputStream對象中接收輸入 類PipedInputStream必須和類PipedOutputStream一起使用,來建立一個通信通道 管道數(shù)據(jù)流必須同時具備可用的輸入端和輸出端,創(chuàng)建一個通信通道,創(chuàng)建一個通信通道2,直接將輸入流與輸出流連接起來,PipedInputStream pis = new PipedInputStream(); PipedOutputStream pos = new PipedOutputStream(pis);,PipedOutputStream pos = new PipedOutputStream(); PipedInputStream pis = new PipedInputStream(pos);,管道通信程序,管道的兩端建立連接以后就可以進行數(shù)據(jù)的通信了,見程序10-3,對象流,能夠輸入輸出對象的流稱為對象流 通過java.io包中ObjectInputStream和ObjectOutputStream兩個類實現(xiàn)的,寫對象數(shù)據(jù)流,將一個java.util.Date對象實例送入文件,Date d = new Date(); FileOutputStream f = new FileOutputStream(“date.ser“); ObjectOutputStream s = new ObjectOutputStream(f); try s.writeObject(d); s.close(); catch(IOException e) e.printStackTrace(); ,讀對象數(shù)據(jù)流,readObject()把數(shù)據(jù)流以O(shè)bject類型返回,應(yīng)該在轉(zhuǎn)換為正確的類名之后再執(zhí)行,Date d = null; FileInputStream f = new FileInputStream(“date.ser“); ObjectInputStream s = new ObjectInputStream(f); try d = (Date)s.readObject(d); s.close(); catch(IOException e) e.printStackTrace(); System.out.println(“Date serialized at“ “+d);,可持續(xù)性概念,能夠記錄自己的狀態(tài)以便將來再生的能力,叫對象的持續(xù)性(Persistence) 一個對象是可持續(xù)的,意味著可以把這個對象存入磁盤、磁帶,或傳入另一臺機器保存在它的內(nèi)存或磁盤中。也就是說把對象存為某種永久存儲類型。 對象通過寫出描述自己狀態(tài)的數(shù)值來記錄自己的過程叫持續(xù)化(或串行化,Serialization) 持續(xù)化的主要任務(wù)是寫出對象實例變量的數(shù)值,如果變量是另一個對象的引用,則引用的對象也要串行化。這個過程是遞歸的。,Java的可持續(xù)性,一個類聲明實現(xiàn)Serializable接口時,表明該類加入了對象串行化協(xié)議 Serializable接口中沒有定義任何方法,只是作為一個標(biāo)記來指示實現(xiàn)該接口的類可以被持續(xù)化 Java中,允許可串行化的對象通過對象流進行傳輸 例10-5,串行化對象,要串行化一個對象,必須與一定的對象輸出/輸入流聯(lián)系起來 通過對象輸出流將對象狀態(tài)保存下來 通過對象輸入流將對象狀態(tài)恢復(fù)。 通過java.io包中的ObjectOutputStream和ObjectInputStream兩個類實現(xiàn) 前者用writeObject()方法可以直接將對象保存到輸出流中,而后者用readObject()方法可以直接從輸入流中讀取一個對象,串行化對象例,對象的存儲 程序10-4 對象的恢復(fù) 程序10-5,對象結(jié)構(gòu)表,串行化只能保存對象的非靜態(tài)成員變量,而不能保存任何成員方法和靜態(tài)成員變量,并且保存的只是變量的值,對于變量的任何修飾符都不能保存,訪問權(quán)限(public,protected,private)對于數(shù)據(jù)域的持續(xù)化沒有影響 數(shù)據(jù)會經(jīng)常變化,狀態(tài)只是瞬時的對象無法保存其狀態(tài),不具有可持續(xù)性。如Thread對象或流對象。對于這樣的成員變量,必須用transient關(guān)鍵字標(biāo)明,否則編譯器將報錯。任何用transient關(guān)鍵字標(biāo)明的成員變量,都不會被保存,對象結(jié)構(gòu)表,串行化可能涉及將對象存放到磁盤上或在網(wǎng)絡(luò)上發(fā)送數(shù)據(jù),這時會產(chǎn)生安全問題。對于一些需要保密的數(shù)據(jù),不應(yīng)保存在永久介質(zhì)中(或者不應(yīng)簡單地不加處理地保存下來),為了保證安全,應(yīng)在這些變量前加上transient關(guān)鍵字 數(shù)據(jù)變量是一個對象時,該對象的數(shù)據(jù)成員也可以被持續(xù)化。對象的數(shù)據(jù)結(jié)構(gòu)或結(jié)構(gòu)樹,包括其子對象樹在內(nèi),構(gòu)成了這個對象的結(jié)構(gòu)表 如果一個對象圖表中包含了一個對不可持續(xù)化對象的引用,而這個引用已用關(guān)鍵字transient加以標(biāo)記,則這個對象仍可以被持續(xù)化,例10-6,于myThread域有transient修飾,所以盡管它為不可持續(xù)化元素,但其整個對象仍可持續(xù)化,public class MyClass implements Serializable public transient Thread myThread; private String customerID; private int total; ,transient例,盡管變量customerID是可持續(xù)化元素,但由于有transient修飾,所以,整個對象在持續(xù)化時不會對它進行持續(xù)化,public class MyClass implements Serializeble public transient Thread myThread; private transient String customerID; private int total; ,基本字符流,從JDK1.1開始,java.io包中加入了專門用于字符流處理的類 以Reader和Writer為基礎(chǔ)派生的一系列類 Reader和Writer也是抽象類,只提供了一系列用于字符流處理的接口。它們的方法與類InputStream和OutputStream類似,只不過其中的參數(shù)換成字符或字符數(shù)組 字節(jié)流中類DataInputStream的readLine方法,可以以字節(jié)形式讀入,以Unicode形式輸出(String readLine()),讀者和寫者,讀者(Readers)和寫者(Writers)提供對不同平臺之間數(shù)據(jù)流數(shù)據(jù)進行轉(zhuǎn)換的功能 同其他程序設(shè)計語言使用ASCII字符集不同,Java使用Unicode來表示字符串和字符 ASCII字符集是以一個字節(jié)(8bit)來表示一個字符,所以可以認為一個字符就是一個字節(jié)(byte).Unicode是一種大字符集,要用兩個字節(jié)(16bit)來表示一個字符,InputStreamReaderOutputStreamWriter,這兩個類是字節(jié)流和讀者、寫者的接口,用來在字節(jié)流和字符流之間作為中介 構(gòu)造方法,InputStreamReader(InputStream in); /缺省規(guī)范 InputStreamReader(InputStream in, String enc);/指定規(guī)范enc OutputStreamWriter(OutputStream out); /缺省規(guī)范 OutputStreamWriter(OutputStream out, String enc);/指定規(guī)范enc,構(gòu)造映射到ASCII碼的標(biāo)準(zhǔn)的InputStreamReader的方法如下 ir = new InputStreamReader(System.in,“8859_1“);,讀者提供的方法,void close() void mark(int readAheadLimit) boolean markSupported() : int read() int read(char cbuf) int read(char cbuf, int off, int len) boolean ready() void reset() long skip(long n),寫者提供的方法,void close() void flush() void write(char cbuf) void write(char cbuf, int off, int len) void write(int c) void write(String str) void write(String str, int off, int len),緩沖區(qū)讀者和寫者,BufferedReader和BufferedWriter, 構(gòu)造方法與BufferedInputStream,BufferedOutputStream相類似 整行字符處理方法 public String readLine():BufferedReader的方法,從輸入流中讀取一行字符,行結(jié)束標(biāo)志為n、r或兩者一起 public void newLine():BufferedWriter的方法,向輸出流中寫入一個行結(jié)束標(biāo)志,程序10-6,程序10-6 每從文件“file1.txt”中讀出一行,就將其顯示出來,并在行首加上字符串“read:”,程序10-7,程序10-7 從標(biāo)準(zhǔn)輸入通道讀取字符串信息進行輸出。將標(biāo)準(zhǔn)輸入流(System.in)串接到一個InputStreamReader上,而后又將其串接到一個BufferedReader上,把鍵盤輸入的內(nèi)容經(jīng)過處理顯示在屏幕上,程序10-8,程序10-8中使用PrintWriter類中的print()或println()方法,輸出文本格式的內(nèi)容 程序10-9使用readLine()方法從文本文件中緩沖讀取內(nèi)容,文件的處理,File類提供了獲得文件基本信息及操作文件的一些工具 創(chuàng)建一個新的File對象,File myFile; myFile = new File(“mymotd“);,myFile = new File(“/“,“mymotd“);,File myDir = new File(“/“); myFile = new Fle(myDir,“mymotd“);,與文件名相關(guān)的方法,String getName() 獲取文件名 String getPath() 獲取文件路徑 String getAbsolutePath() 獲取文件絕對路徑 String getParent() 獲取文件父目錄名稱 boolean renameTo(File newName) 更改文件名,成功則返回true,否則返回false,文件測定方法,boolean exists() 文件對象是否存在 boolean canWrite() 文件對象是否可寫 boolean canRead() 文件對
溫馨提示
- 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)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 一般火災(zāi)處理程序試題及答案
- 2024年外語能力培訓(xùn)的趨勢與機會試題及答案
- 企業(yè)審計流程優(yōu)化試題及答案
- 2024年中級審計師跨越式提高試題及答案
- 2025年入團考試關(guān)鍵試題及答案
- 2024-2025公司及項目部安全培訓(xùn)考試試題附答案(黃金題型)
- 2025年企業(yè)安全管理人員安全培訓(xùn)考試試題及答案考點提分
- 2025公司級員工安全培訓(xùn)考試試題及答案可打印
- 2025年中考語文模擬試題及答案
- 2025年高考政治總復(fù)習(xí)必修4《哲學(xué)與文化》綜合測試題及答案
- GB/T 36447-2018多媒體教學(xué)環(huán)境設(shè)計要求
- GB/T 14832-2008標(biāo)準(zhǔn)彈性體材料與液壓液體的相容性試驗
- 校園青年志愿者培訓(xùn)(服務(wù)禮儀講解)
- 手機拍照技巧大全課件
- 送達地址確認書(訴訟類范本)
- 博士后研究人員進站審核表
- 電機檢測報告
- 高效水泥助磨劑PPT課件(PPT 66頁)
- 生物防治第三講
- 旁站監(jiān)理實施細則(完整版)
- 學(xué)業(yè)水平考試復(fù)習(xí)高中語文文言文課本翻譯
評論
0/150
提交評論