




已閱讀5頁,還剩51頁未讀, 繼續(xù)免費閱讀
版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第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為基礎派生的一系列的類 ,還有用于對象的永久化保存狀態(tài)的機制,它們通過實現(xiàn)ObjectInput和ObjectOutput接口來達到要求,import java.io.*,輸入數(shù)據(jù)流,輸入數(shù)據(jù)流(Input Stream)是指只能讀不能寫的數(shù)據(jù)流,用于向計算機內輸入信息而用 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)。讀取結束時,它會得到-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ù)流關閉,同時釋放與該數(shù)據(jù)流相關的資源 也可以由運行時系統(tǒng)自動關閉 int available() 返回目前可以從數(shù)據(jù)流中讀取的字節(jié)數(shù)(實際的讀操作所讀得的字節(jié)數(shù)可能大于該返回值) long skip(long l) 跳過數(shù)據(jù)流中指定數(shù)量的字節(jié)不讀,返回值表示實際跳過的字節(jié)數(shù),主要數(shù)據(jù)操作方法,boolean markSupported() 用于指示數(shù)據(jù)流是否支持回推操作,當數(shù)據(jù)流支持mark()和reset()方法時返回true,反之返回false void mark(int markarea) 標記數(shù)據(jù)流的當前位置,并劃出一個緩沖區(qū),其大小至少為指定參數(shù)的大小 void reset() 執(zhí)行完read()操作后,調用方法reset()將回到輸入數(shù)據(jù)流中被標記的位置,輸出數(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() 當結束對輸出數(shù)據(jù)流的操作時將其關閉 void flush() 輸出數(shù)據(jù)流會在提交數(shù)據(jù)之前把所要輸出的數(shù)據(jù)先鎖定在內存緩沖區(qū)中,然后成批地進行輸出,每次傳輸過程都以某特定數(shù)據(jù)長度為單位進行傳輸。這種方式下,在數(shù)據(jù)的末尾一般都會有一部分數(shù)據(jù)由于數(shù)量不夠一個批次,而存留在緩沖區(qū)里, flush()可以將留在緩沖區(qū)里的數(shù)據(jù)強制提交,緩沖存儲,基本字節(jié)數(shù)據(jù)流類,文件數(shù)據(jù)流 包括FileImputStream和FileOutputStream, 用來進行文件的I/O處理,其數(shù)據(jù)源都應當是文件 對本機上的文件進行操作,但是它們不支持方法mark()和reset() 在構造文件數(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)建一個新文件;如果存在,那么新寫入的內容將會覆蓋原有數(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ù)流的內容進行了特定處理的數(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ū)的大小 自行設置緩沖區(qū)的大小 關閉一個緩沖區(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ù)流以Object類型返回,應該在轉換為正確的類名之后再執(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ù)的,意味著可以把這個對象存入磁盤、磁帶,或傳入另一臺機器保存在它的內存或磁盤中。也就是說把對象存為某種永久存儲類型。 對象通過寫出描述自己狀態(tài)的數(shù)值來記錄自己的過程叫持續(xù)化(或串行化,Serialization) 持續(xù)化的主要任務是寫出對象實例變量的數(shù)值,如果變量是另一個對象的引用,則引用的對象也要串行化。這個過程是遞歸的。,Java的可持續(xù)性,一個類聲明實現(xiàn)Serializable接口時,表明該類加入了對象串行化協(xié)議 Serializable接口中沒有定義任何方法,只是作為一個標記來指示實現(xiàn)該接口的類可以被持續(xù)化 Java中,允許可串行化的對象通過對象流進行傳輸 例10-5,串行化對象,要串行化一個對象,必須與一定的對象輸出/輸入流聯(lián)系起來 通過對象輸出流將對象狀態(tài)保存下來 通過對象輸入流將對象狀態(tài)恢復。 通過java.io包中的ObjectOutputStream和ObjectInputStream兩個類實現(xiàn) 前者用writeObject()方法可以直接將對象保存到輸出流中,而后者用readObject()方法可以直接從輸入流中讀取一個對象,串行化對象例,對象的存儲 程序10-4 對象的恢復 程序10-5,對象結構表,串行化只能保存對象的非靜態(tài)成員變量,而不能保存任何成員方法和靜態(tài)成員變量,并且保存的只是變量的值,對于變量的任何修飾符都不能保存,訪問權限(public,protected,private)對于數(shù)據(jù)域的持續(xù)化沒有影響 數(shù)據(jù)會經(jīng)常變化,狀態(tài)只是瞬時的對象無法保存其狀態(tài),不具有可持續(xù)性。如Thread對象或流對象。對于這樣的成員變量,必須用transient關鍵字標明,否則編譯器將報錯。任何用transient關鍵字標明的成員變量,都不會被保存,對象結構表,串行化可能涉及將對象存放到磁盤上或在網(wǎng)絡上發(fā)送數(shù)據(jù),這時會產(chǎn)生安全問題。對于一些需要保密的數(shù)據(jù),不應保存在永久介質中(或者不應簡單地不加處理地保存下來),為了保證安全,應在這些變量前加上transient關鍵字 數(shù)據(jù)變量是一個對象時,該對象的數(shù)據(jù)成員也可以被持續(xù)化。對象的數(shù)據(jù)結構或結構樹,包括其子對象樹在內,構成了這個對象的結構表 如果一個對象圖表中包含了一個對不可持續(xù)化對象的引用,而這個引用已用關鍵字transient加以標記,則這個對象仍可以被持續(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為基礎派生的一系列類 Reader和Writer也是抽象類,只提供了一系列用于字符流處理的接口。它們的方法與類InputStream和OutputStream類似,只不過其中的參數(shù)換成字符或字符數(shù)組 字節(jié)流中類DataInputStream的readLine方法,可以以字節(jié)形式讀入,以Unicode形式輸出(String readLine()),讀者和寫者,讀者(Readers)和寫者(Writers)提供對不同平臺之間數(shù)據(jù)流數(shù)據(jù)進行轉換的功能 同其他程序設計語言使用ASCII字符集不同,Java使用Unicode來表示字符串和字符 ASCII字符集是以一個字節(jié)(8bit)來表示一個字符,所以可以認為一個字符就是一個字節(jié)(byte).Unicode是一種大字符集,要用兩個字節(jié)(16bit)來表示一個字符,InputStreamReaderOutputStreamWriter,這兩個類是字節(jié)流和讀者、寫者的接口,用來在字節(jié)流和字符流之間作為中介 構造方法,InputStreamReader(InputStream in); /缺省規(guī)范 InputStreamReader(InputStream in, String enc);/指定規(guī)范enc OutputStreamWriter(OutputStream out); /缺省規(guī)范 OutputStreamWriter(OutputStream out, String enc);/指定規(guī)范enc,構造映射到ASCII碼的標準的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, 構造方法與BufferedInputStream,BufferedOutputStream相類似 整行字符處理方法 public String readLine():BufferedReader的方法,從輸入流中讀取一行字符,行結束標志為n、r或兩者一起 public void newLine():BufferedWriter的方法,向輸出流中寫入一個行結束標志,程序10-6,程序10-6 每從文件“file1.txt”中讀出一行,就將其顯示出來,并在行首加上字符串“read:”,程序10-7,程序10-7 從標準輸入通道讀取字符串信息進行輸出。將標準輸入流(System.in)串接到一個InputStreamReader上,而后又將其串接到一個BufferedReader上,把鍵盤輸入的內容經(jīng)過處理顯示在屏幕上,程序10-8,程序10-8中使用PrintWriter類中的print()或println()方法,輸出文本格式的內容 程序10-9使用readLine()方法從文本文件中緩沖讀取內容,文件的處理,File類提供了獲得文件基本信息及操作文件的一些工具 創(chuàng)建一個新的File對象,File myFile; myFile = new File(“mymotd“);,myFile = new File(“/“,“mymotd“);,File myDir = new File(“/“); myFile = new Fle(myDir,“mymotd“);,與文件名相關的方法,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)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 頂崗老師班會課件模板
- 金屬冶煉負責人安管人員培訓
- 音樂課國防教育課件
- 水肌酸產(chǎn)品項目運營管理方案
- 電網(wǎng)側獨立儲能示范項目經(jīng)濟效益和社會效益分析報告
- 城鎮(zhèn)污水管網(wǎng)建設項目人力資源管理方案(模板范文)
- xx片區(qū)城鄉(xiāng)供水一體化項目建設管理方案
- 先進金屬材料行動計劃
- 無人駕駛配送車輛定位精度提升
- 2025年井下多功能測振儀項目建議書
- (高清版)DB11∕T 2429-2025 補充耕地質量調查與評價技術規(guī)范
- 2025年貴州省6月28日納雍事業(yè)單位教師崗考試真題及答案
- 提高冠脈介入手術術前準備的合格率護理品管圈QCC成果匯報課件(完整內容可編輯修改)
- 機關檔案管理工作培訓PPT課件
- 油輪、化學品船的基本知識
- 25T汽車吊檢驗報告
- 變頻空調中的永磁電機電感分析
- 高考??颊Z法填空詞性轉換匯總
- AOI自動光學檢測設備程序編寫
- 廈門護士延續(xù)注冊體檢表
- GB∕T 386-2021 柴油十六烷值測定法
評論
0/150
提交評論