




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、第五講第五講 輸入輸入/輸出處理輸出處理n I/O流概述流概述n 字節(jié)流字節(jié)流n 字節(jié)流的基類字節(jié)流的基類n 文件流文件流n 過濾流過濾流n 標準流標準流n 字符流字符流n文件操作文件操作/隨機訪問文件隨機訪問文件n 對象流對象流n 管道流管道流n 內存讀寫流內存讀寫流n 順序輸入流順序輸入流1、I/O流概述流概述 大部分程序都需要輸入/輸出處理,比如從鍵盤讀取數據、向屏幕中輸出數據、從文件中讀或者向文件中寫數據、在一個網絡連接上進行讀寫操作等。在Java中,把這些不同類型的輸入、輸出源抽象為流(Stream),而其中輸入或輸出的數據則稱為數據流(Data Stream),用統(tǒng)一的接口來表示,
2、從而使程序設計簡單明了。文件文件程序程序終端終端文件文件程序程序網絡端點網絡端點數據流數據流起起點點終終點點 網絡端點網絡端點文件文件,字符串字符串存儲區(qū)存儲區(qū)1、I/O流概述流概述 流一般分為輸入流(Input Stream)和輸出流(Output Stream)兩類,但這種劃分并不是絕對的。比如一個文件,當向其中寫數據時,它就是一個輸出流;當從其中讀取數據時,它就是一個輸入流。當然,鍵盤只是一個輸入流,而屏幕則只是一個輸出流。 在Java開發(fā)環(huán)境中,主要是由包java.io中提供的一系列的類和接口來實現輸入/輸出處理。標準輸入/輸出處理則是由包java.lang中提供的類來處理的,但這些類
3、又都是從包java.io中的類繼承而來。輸入流:數據提供者,可從中讀取數據出來輸入流:數據提供者,可從中讀取數據出來輸出流:數據接收者,可往其中寫數據輸出流:數據接收者,可往其中寫數據1、I/O流概述流概述 在JDK1.1之前,java.io包中的流只有普通的字節(jié)流字節(jié)流(以byte為基本處理單位的流),這種流對于以16位的Unicode碼表示的字符流處理很不方便。 從JDK1.1開始, java.io包中加入了專門用于字符流字符流處理的類(以Reader和Writer為基礎派生的一系列類)。 另外,為了使對象的狀態(tài)能夠方便地永久保存下來, JDK1.1以后的java.io包中提供了以字節(jié)流為
4、基礎的用于對象的永久化保存狀態(tài)的機制對象流對象流(通過實現ObjectInput和ObjectOutput接口)。nInputStream nByteArrayInputStream nFileInputStream nFilterInputStream nBufferedInputStream nDataInputStreamnLineNumberInputStream nPushbackInputStreamnObjectInputStreamnPipedInputStream nSequenceInputStream nStringBufferInputStreamnOutputStre
5、amnByteArrayOutputStreamnFileOutputStreamnFilterOutputStreamnBufferedOutputStreamnDataOutputStreamnPrintStreamnObjectOutputStreamnPipedOutputStream1、I/O流概述流概述字節(jié)流字節(jié)流nReadernBufferedReadernLineNumberReadernCharArrayReadernFilterReadernPushbackReadernInputStreamReadernFileReadernPipedReadernStringReade
6、rnWriternBufferedWriternCharArrayWriternFilterWriternOutputStreamWriternFileWriternPipedWriternStringWriternPrintWriter1、I/O流概述流概述字符流字符流nDataInputnObjectInputnDataOutputnObjectOutputnFileFilternFilenameFilternObjectInputValidationnObjectStreamConstantsnSerializablenExternalizablenFilenFileDescriptor
7、nRandomAccessFile njava.awt.FileDialog1、I/O流概述流概述I/O接口接口 與與 文件操作文件操作java.io類詳解類詳解2、字節(jié)流、字節(jié)流基類:基類:InputStream Java中每一種字節(jié)流的基本功能依賴于基本類InputStream和OutputStream,它們是抽象類抽象類,不能直接使用。 屬于InputStream類的方法有:n read():從流中讀入數據n skip():跳過流中若干字節(jié)數n available():返回流中可用字節(jié)數n mark():在流中標記一個位置n reset():返回標記過的位置n markSupport()
8、:是否支持標記和復位操作n close():關閉流 在InputStream類中,方法read()提供了三種從流中讀數據的方法:n int read():從輸入流中讀一個字節(jié),形成一個0255之間的整數返回(是一個抽象方法)。n int read(byte b):讀多個字節(jié)到數組中,填滿整個數組。n int read(byte b, int off, int len):從輸入流中讀取長度為len的數據,寫入數組b中從索引off開始的位置,并返回讀取得字節(jié)數。 對于這三個方法,若返回對于這三個方法,若返回1,表明流結束,否,表明流結束,否則,返回實際讀取的字節(jié)數。則,返回實際讀取的字節(jié)數。2、字
9、節(jié)流、字節(jié)流基類:基類:InputStream 屬于OutputStream類的方法有:n write(int b):將一個整數輸出到流中(只輸出低位字節(jié),為抽象方法為抽象方法)n write(byte b):將字節(jié)數組中的數據輸出到流中n write(byte b, int off, int len):將數組b中從off指定的位置開始,長度為len的數據輸出到流中n flush():刷空輸出流,并將緩沖區(qū)中的數據強制送出n close():關閉流Writer的方法: write(String s), write(String s, int off, int len)2、字節(jié)流、字節(jié)流基類:基
10、類:OutputStreamn把輸入流中的所有內容復制到輸出流中public void copy(InputStream in, OutputStream out) throws IOException byte buf = new byte4096; int len = in.read(buf); while (len != -1) out.write(buf, 0, len); len = in.read(buf); 2、字節(jié)流、字節(jié)流基類:例子基類:例子2、字節(jié)流、字節(jié)流各種字節(jié)流各種字節(jié)流q文件流q過濾流:緩沖流、數據流、其他過慮流q標準流q對象流q管道流q內存流q 順序輸入流2、字節(jié)
11、流、字節(jié)流文件流文件流在I/O處理中,最常見的就是對文件的操作。java.io包中所提供的文件操作類包括:FileInputStream:FileOutputStream:File:FileDescriptor:FilenameFilter:接口,主要用于實現文件名查找模式的匹配。RandomAccessFile:提供對本地文件系統(tǒng)對本地文件系統(tǒng)中文件的隨機訪問支持。描述本地文件系統(tǒng)本地文件系統(tǒng)中的文件或目錄用于讀寫本地文件系統(tǒng)寫本地文件系統(tǒng)中的文件2、字節(jié)流、字節(jié)流文件流:文件流:FileInputStream/ FileOutputStreamq FileInputStream類用來打開一
12、個輸入文件,若要打開的文件不存在,則會產生例外FileNotFoundException,這是一個非運行時例外,必須捕獲或聲明拋棄;q FileOutputStream類用來打開一個輸出文件,若要打開的文件不存在,則會創(chuàng)建一個新的文件,否則原文件的內容會被新寫入的內容所覆蓋。q 在進行文件的讀/寫操作時,會產生非運行時例外IOException,必須捕獲或聲明拋棄(其它的輸入/輸出流處理時也同樣需要進行輸入/輸出例外處理)。2、字節(jié)流、字節(jié)流文件流:文件流:FileInputStream/ FileOutputStreamn文件流的構造方法:nFileInputStream(File f) n
13、打開一個以f描述的文件作為輸入。nFileInputStream(String name) n打開一個文件路徑名為name的文件作為輸入。nFileOutputStream(File f) n創(chuàng)建一個以f描述的文件作為輸出,文件如果已經存在,則其內容被清空。nFileOutputStream(String name) n創(chuàng)建一個文件路徑名為name的文件作為輸出,文件如果已經存在,則其內容被清空。nFileOutputStream(String name, boolean append) n創(chuàng)建一個文件路徑名為name的文件作為輸出,文件如果已經存在,則在該輸出上輸出的內容被接到原有內容之后。
14、 File f1 = new File(“file1.txt”); File f2 = new File(“file2.txt”); FileInputStream in=new FileInputStream(f1); FileOutputStream out=new FileOutputStream(f2); FileOutputStream out=new FileOutputStream(“file3.txt”);輸入流的參數是用于指定輸入的文件名,輸出流的參數則是用于指定輸出的文件名。輸出文件輸出文件輸入文件輸入文件readwrite2、字節(jié)流、字節(jié)流文件流:文件流:FileInpu
15、tStream/ FileOutputStream2、字節(jié)流、字節(jié)流 文件流:例子文件流:例子1 import java.io.*; class Filestream public static void main(String args) try File inFile=new File(file1.txt); File outFile=new File(file2.txt); FileInputStream fis=new FileInputStream(inFile); FileOutputStream fos=new FileOutputStream(outFile); int c;
16、while(c=fis.read()!=-1) fos.write(c); fis.close(); fos.close(); catch(FileNotFoundException e) System.out.println(FileStreamsTest: +e); catch(IOException e) System.err.println(FileStreamsTest: +e); 將一個文件復制到另一個文件中(覆蓋)將一個文件復制到另一個文件中(覆蓋)n把一個文件的內容加到另一個文件后把一個文件的內容加到另一個文件后public void cat(String fsrc, Stri
17、ng fdest) try InputStream in = new FileInputStream(fsrc); OutputStream out = new FileOutputStream(fdest, true); copy(in, out); out.close(); in.close(); catch (IOException ex) System.err.println(ex); 2、字節(jié)流、字節(jié)流 文件流:例子文件流:例子22、字節(jié)流、字節(jié)流過濾流過濾流 java.io中提供類FilterInputStream和FilterOutputStream分別對其他輸入/輸出流進行特殊
18、處理,它們在讀/寫數據的同時可以對數據進行特殊處理。另外還提供了同步機制,使得某一時刻只有一個線程可以訪問一個輸入/輸出流。 類FilterInputStream和FilterOutputStream分別重寫了父類InputStream和OutputStream的所有方法,同時,它們的子類也應該重寫它們的方法以滿足特定的需要。 要使用過濾流,首先必須把它連接到某個輸入要使用過濾流,首先必須把它連接到某個輸入/輸出流輸出流上上,通常在構造方法的參數中指定所要連接的流: protected FilterInputStream(InputStream in); protected FilterOut
19、putStream(OutputStream out);2、字節(jié)流、字節(jié)流過濾流過濾流過濾流其他流2、字節(jié)流、字節(jié)流過濾流:緩沖流過濾流:緩沖流 類BufferedInputStream和BufferedOutputStream實現了帶緩沖的過濾流,它提供了緩沖機制,把任意的I/O流“捆綁”到緩沖流上,可以提高該I/O流的讀取效率。 在初始化時,除了要指定所連接的I/O流之外,還可以指定緩沖區(qū)的大小。缺省時是用32字節(jié)大小的緩沖區(qū);最優(yōu)的緩沖區(qū)大小常依賴于主機操作系統(tǒng)、可使用的內存空間以及機器的配置等;一般緩沖區(qū)的大小為內存頁或磁盤塊等的整數倍,如8912字節(jié)或更小。n BufferedInp
20、utStream(InputStream in, int size) n BufferedOutputStream(OutputStream out, int size) 2、字節(jié)流、字節(jié)流過濾流:緩沖流過濾流:緩沖流輸出流緩沖區(qū)write()輸入流緩沖區(qū)read() 將緩沖流與文件流相接:FileInputStream in = new FileInputStream(“file1.txt”);FileOutputStream out = new FileOutputStream (“file2.txt”);BufferedInputStream bin = new BufferedInpu
21、tStream(in,256) BufferedOutputStream bout = new BufferedOutputStream(out,256);int len;byte bArray=new byte256;len=bin.read(bArray); /len中得到的是實際讀取的長度中得到的是實際讀取的長度, bArray中得到的是數據中得到的是數據file1.txtfile2.txt輸入流輸入流輸出流輸出流輸入緩沖流輸入緩沖流輸出緩沖流輸出緩沖流文件文件文件流文件流緩沖流緩沖流2、字節(jié)流、字節(jié)流過濾流:緩沖流過濾流:緩沖流2、字節(jié)流、字節(jié)流過濾流:緩沖流過濾流:緩沖流n對于Buf
22、feredOutputStream,只有緩沖區(qū)滿時,才會將數據真正送到輸出流,但可以使用flush()方法人為地將尚未填滿的緩沖區(qū)中的數據送出。public void copy(InputStream in, OutputStream out) throws IOException out = new BufferedOutputStream(out, 4096); byte buf = new byte4096; int len = in.read(buf); while (len != -1) out.write(buf, 0, len); len = in.read(buf); out.
23、flush(); /最后一次讀取的數據可能不到4096字節(jié)n使用緩沖流支持的使用緩沖流支持的mark和和reset機制機制public String readLine( BufferedInputStream in) throws IOException StringBuffer sb = new StringBuffer(); int c = in.read(); return sb.toString();while (c != -1) if (c = n) break; if (c = r) in.mark(1); if (in.read() != n) in.reset(); break
24、; sb.append(char)c); c = in.read();2、字節(jié)流、字節(jié)流過濾流:緩沖流(例子)過濾流:緩沖流(例子)2、字節(jié)流、字節(jié)流過濾流:數據流過濾流:數據流接口接口DataInput和和DataOutput,設計了一種較為高級的數據輸入輸出方式:除了可處理字節(jié)和字節(jié)數組外,還可以處理int、float、boolean等基本數據類型,這些數據在文件中的表示方式和它們在內存中的一樣,無須轉換,如read(), readInt(), readByte() ;write(), writeChar(), writeBoolean()。此外,還可以用readLine()方法讀取一行信
25、息。2、字節(jié)流、字節(jié)流過濾流:數據流(過濾流:數據流(DataInput)nboolean readBoolean() nbyte readByte() nshort readShort() nchar readChar() nint readInt() nlong readLong() ndouble readDouble() nfloat readFloat() nint readUnsignedByte() nint readUnsignedShort()2、字節(jié)流、字節(jié)流過濾流:數據流(過濾流:數據流(DataInput)nvoid readFully(byte b) n讀滿字節(jié)數組,
26、不同于InputStream.readnvoid readFully(byte b, int off, int len) n讀滿指定長度,不同于InputStream.readnint skipBytes(int n) n與InputStream.skip等價nString readUTF() n安類UTF-8形式從輸入中讀取字符串nString readLine()n按回車(r)換行(n)為分割符讀取一行字符串n不完全支持UNICODE2、字節(jié)流、字節(jié)流過濾流:數據流(過濾流:數據流(DataOutput)nvoid writeBoolean(boolean v) nvoid writeBy
27、te(int v) nvoid writeShort(int v) nvoid writeChar(int v)nvoid writeInt(int v) nvoid writeLong(long v) nvoid writeFloat(float v) nvoid writeDouble(double v) 2、字節(jié)流、字節(jié)流過濾流:數據流(過濾流:數據流(DataOutput)nvoid write(byte b) n與OutputStream.write同義nvoid write(byte b, int off, int len) n與OutputStream.write同義nvoid
28、write(int b) n與OutputStream.write同義nvoid writeBytes(String s) n只輸出每個字符的低8位;不完全支持UNICODE。nvoid writeChars(String s) n每個字符在輸出中都占兩個字節(jié)。2、字節(jié)流、字節(jié)流過濾流:數據流過濾流:數據流n數據流類 DataInputStream和DataOutputStream的處理對象除了是字節(jié)或字節(jié)數組外,還可以實現對文件的不同數據類型的讀寫:n分別實現了DataInput和DataOutput接口n在提供了字節(jié)流的讀寫手段的同時,n以統(tǒng)一的通用的形式向輸入流中寫入boolean,in
29、t,long,double等基本數據類型,并可以在次把基本數據類型的值讀取回來。n提供了字符串讀寫的手段。 數據流可以連接一個已經建立好的數據對象,例如網絡的連結、文件等。數據流可通過如下方式建立:FileInputStream fis = new FileInputStream(file1.txt);FileOutputStream fos = new FileOutputStream(file2.txt);DataInputStream dis = new DataInputStream(fis);DataOutputStream dos = new DataOutputStream(fo
30、s);2、字節(jié)流、字節(jié)流過濾流:數據流過濾流:數據流class DataStream public static void main(String args) throws IOException FileOutputStream fos = new FileOutputStream(“a.txt”); DataOutputStream dos = new DataOutputStream (fos); try dos.writeBoolean(true); dos.writeByte(byte)123); dos.writeChar(J); dos.writeDouble(3.1415926
31、54); dos.writeFloat(2.7182f); dos.writeInt(1234567890); dos.writeLong(998877665544332211L); dos.writeShort(short)11223); finally dos.close(); 過濾流:數據流(例子過濾流:數據流(例子1)FileInputStream fis = new FileInputStream(a.txt);DataInputStream dis = new DataInputStream(fis);try System.out.println(t +dis.readBoolea
32、n(); System.out.println(t +dis.readByte(); System.out.println(t +dis.readChar(); System.out.println(t +dis.readDouble(); System.out.println(t +dis.readFloat(); System.out.println(t +dis.readInt(); System.out.println(t +dis.readLong(); System.out.println(t +dis.readShort();finally dis.close(); /main(
33、)/class DataStream過濾流:數據流(例子過濾流:數據流(例子1)/利用方法利用方法readLine()計算一個輸入流中的字符數和行數計算一個輸入流中的字符數和行數/ (適合于文本文件)(適合于文本文件)int DataLine(InputStream in) DataInputStream data = new DataInputStream(in); String currentLine; int lineCount=0; int charCount=0; while(currentLine=data.readLine()!=null) +lineCount; charCou
34、nt += currentLine.length(); return (charCount/(float)lineCount);2、字節(jié)流、字節(jié)流過濾流:數據流(例子過濾流:數據流(例子2)2、字節(jié)流、字節(jié)流過濾流:其他過濾流過濾流:其他過濾流LineNumberInputStream:主要用于對文本文件的處理,提供了行號控制功能。n已經被LineNumberReader取代PushBackInputStream:在編譯程序的詞法分析階段,經常要超前讀入一個字節(jié)以界定當前詞的屬性,然后再將該字節(jié)退回(因為下面的處理可能還會用到該字節(jié))。 PushBackInputStream就提供了這樣的能力
35、,它提供了一個方法將剛剛讀入的字節(jié)退回到輸入流中去。PrintStream:其作用是將Java語言中的不同類型的數據以字符表示形式輸出到相應的輸出流中去。n不產生異常??勺詣觙lush。通過checkError()檢查錯誤。2、字節(jié)流、字節(jié)流標準流標準流 語言包java.lang中的System類管理標準輸入/輸出流和錯誤流。 System.in,從InputStream中繼承而來,用于從標準輸入設備中獲取輸入數據(通常是鍵盤)。 System.out,從PrintStream中繼承而來,把輸出送到缺省的顯示設備(通常是顯示器)。 System.err,也是從PrintStream中繼承而來,
36、把錯誤信息送到缺省的顯示設備(通常是顯示器)。 每當每當main方法被執(zhí)行時,就自動生成上述三個對象。方法被執(zhí)行時,就自動生成上述三個對象。public class ReadFromKB public static void main(String args) try byte bArray=new byte128;String str;System.out.println(Enter something Using Keyborad:);System.in.read(bArray);str = new String(bArray, 0);System.out.print(You entere
37、d:);System.out.println(str); catch(IOException ioe) System.out.println(ioe.toString(); 過濾流:標準流(例子)過濾流:標準流(例子)從鍵盤中獲取數據從鍵盤中獲取數據2、字節(jié)流、字節(jié)流對象流對象流 對象的持續(xù)性(Persistence) 能夠紀錄自己的狀態(tài)以便將來再生的能力,叫對象的持續(xù)性。 對象的串行化(Serialization) 對象通過寫出描述自己狀態(tài)的的數值來記錄自己的過程叫串行化。串行化的主要任務是寫出對象實例變量實例變量的數值,如果變量是另一個對象的引用,則引用的對象也要串行化。這個過程是遞歸的。
38、n 對象流 能夠輸入輸出對象的流稱為對象流。 可以將對象串行化后通過對象輸入輸出流寫入文件或傳送到其它地方。 在Java中,允許可串行化的對象可串行化的對象在通過對象流進行傳輸。只有實現Serializable接口的類才能被串行化, Serializable接口中沒有任何方法,當一個類聲明實現Serializable接口時,只是表明該類加入對象串行化協(xié)議。public class Student implements Serializable int id; String name; int age; String department; public Student(int id, Stri
39、ng name, int age, String department) this.id=id; =name; this.age=age; this.department =department; 2、字節(jié)流、字節(jié)流對象流對象流 要串行化一個對象,必須與一定的對象輸出/輸入流聯(lián)系起來,通過對象輸出流將對象狀態(tài)保存下來(將對象保存到文件中,或者通過網絡傳送到其他地方) ,再通過對象輸入流將對象狀態(tài)恢復。 類ObjectOutputStream和ObjectInputStream分別繼承了接口ObjectOutput和ObjectInput,將數據流功能擴展到可以讀寫對象,前者用
40、writeObject()方法可以直接將對象保存到輸出流中,而后者用readObject()方法可以直接從輸入流中讀取一個對象。2、字節(jié)流、字節(jié)流對象流對象流2、字節(jié)流、字節(jié)流對象流對象流 從某種意義來看,對象流與數據流是相類似的,也具有過濾流的特性。利用對象流來輸入/輸出對象時,也不能單獨使用,需要與其他的流連接起來。q 對象是可串行化的q 使用對象流public class Objectser public static void main(String args) Student stu=new Student(981036, “Li Ming”, 16, “CSD”); try Fil
41、eOutputStream fo = new FileOutputStream(“data.ser”); ObjectOutputStream so = new ObjectOutputStream(fo); so.writeObject(stu); so.close(); catch(Exception e) System.out.println(e) ; 對象流:例子(對象的存儲)對象流:例子(對象的存儲)public class ObjectRecov public static void main(String args) Student stu; try FileInputStrea
42、m fi = new FileInputStream(“data.ser”); ObjectInputStream si = new ObjectInputStream(fi); stu = (Student)si.readObject(); si.close(); catch(Exception e) System.out.println(e); System.out.println(“ID: ”+stu.id+“name:”+ +“age:”+stu.age+“dept.:”+stu.department); 對象流:例子(對象的存儲)對象流:例子(對象的存儲)2、字節(jié)流、
43、字節(jié)流對象流對象流定制對象的串行化定制對象的串行化:當一個對象串行化時,如果希望該對象的某些屬性不被保存,可以通過在類定義中重寫readObject()和WriteObject()方法來實現。public class Student implements Serializable int id; String name; int age; String department; public Student(int id, String name, int age, String department) this.id=id; =name; this.age=age; this
44、.department =departmernt; private void writeObject(ObjectOutputStream out) throws IOException out.writeInt(id); / out.defaultWriteObject() private void readObject(ObjectInputStream in) throws IOException id = in.readInt(); / in.defaultReadObject() 定制對象的串行化定制對象的串行化 串行化只能保存對象的非靜態(tài)成員變量(實例變量)非靜態(tài)成員變量(實例變量
45、),而不能保存任何成員方法和靜態(tài)成員變量,并且保存的只是變量的值,對于變量的任何修飾符都不能保存。 對于某些類型的對象,其狀態(tài)是瞬時的,這樣的對象是無法保存其狀態(tài)的,如Thread對象或流對象。對于這樣的成員變量,必須用transient關鍵字標明,否則編譯器將報錯。任何用transient關鍵字標明的成員變量,都不會被保存。 另外,串行化可能涉及將對象存放到磁盤上或在網絡上發(fā)送數據,這時會產生安全問題。對于一些需要保密的數據,不應保存在永久介質中(或者不應簡單地不加處理地保存下來),為了保證安全,應在這些變量前加上transient關鍵字。2、字節(jié)流、字節(jié)流對象流對象流2、字節(jié)流、字節(jié)流管道
46、流管道流 管道用來把一個程序、線程和代碼塊的輸出連接到另一個程序、線程和代碼塊的輸入。java.io中提供了類PipedInputStream和PipedOutputStream作為管道的輸入/輸出流。 管道輸入流作為一個通信管道的接收端,管道輸出流則作為發(fā)送端。管道流必須是輸入輸出流并用管道流必須是輸入輸出流并用,即在使用管道前,兩者必須進行連接。輸出流輸出流輸入流輸入流數據流向字節(jié)流字節(jié)流管道流管道流管道輸入/輸出流可以用兩種方式進行連接:1)在構造方法中進行連接PipedInputStream(PipedOutputStream pos);PipedOutputStream(PipedI
47、nputStream pis);2)通過各自的connect()方法連接在類PipedInputStream中,connect(PipedOutputStream pos);在類PipedOutputStream中,connect(PipedInputStream pis);class Pipedstream public static void main(String args) throws IOException byte aByteData1 = 123, aByteData2 = 111; PipedInputStream pis = new PipedInputStream();
48、PipedOutputStream pos = new PipedOutputStream(pis); System.out.println(PipedInputStream); try pos.write(aByteData1); pos.write(aByteData2); System.out.println(byte)pis.read(); System.out.println(byte)pis.read(); finally pis.close(); pos.close(); 將數據從輸出管道進,從輸入管道出將數據從輸出管道進,從輸入管道出管道流:例子管道流:例子2、字節(jié)流、字節(jié)流內
49、存讀寫流內存讀寫流n為了支持在內存上的I/O,java.io中提供了類nByteArrayInputStreamnByteArrayOutputStreamnStringBufferInputStreamnByteArrayInputStream可以從指定的字節(jié)數組中讀取數據。nByteArrayOutputStream中提供了緩沖區(qū)可以存放數據(緩沖區(qū)大小可以在構造方法中設定,缺省為32),可以用write()方法向其中寫入數據,然后用toByteArray()方法將緩沖區(qū)中的有效字節(jié)寫到字節(jié)數組中去。size()方法可以知道寫入的字節(jié)數;reset()可以丟棄所有內容。nStringBuf
50、ferInputStream與ByteArrayInputStream相類似,不同點在于它是從字符緩沖區(qū)StringBuffer中讀取16位的Unicode數據,而不是8位的字節(jié)數據。 (已被(已被StringReader取代)取代)nByteArrayInputStreamnByteArrayInputStream(byte buf) nByteArrayInputStream(byte buf, int offset, int length) nByteArrayOutputStreamnvoid reset() :重寫內容nint size() :返回寫入的字節(jié)數nbyte toByte
51、Array() :以新分配的字節(jié)數組形式返回寫入的內容nString toString() :以缺省字符編碼方式把內容編程字符串返回nString toString(String enc) :以指定字符編碼方式返回字符串nvoid writeTo(OutputStream out) :把內容寫到另一個輸出流中2、字節(jié)流、字節(jié)流內存讀寫流內存讀寫流2、字節(jié)流、字節(jié)流順序輸入流順序輸入流 java.io中提供了類SequenceInputStream,使應用程序可以將幾個輸入流順序連接起來,讓程序員看起來就像是一個比較長的流一樣。順序輸入流提供了將多個不同的輸入流統(tǒng)一為一個輸入流的功能,這使得程序
52、可能變得更加簡潔。如:FileInputStream f1,f2;String s;f1 = new FileInputStream(“file1.txt”);f2 = new FileInputStream(“file2.txt”);SequenceInputStream fs = new SequenceInputStream(f1, f2);DataInputStream ds = new DataInputStream(fs);while( (s = ds.readLine() != null ) System.out.println(s);3、字符流、字符流 前面說過,在JDK1.1
53、之前,java.io包中的流只有普通的字節(jié)流(以byte為基本處理單位的流),這種流對于以16位的Unicode碼表示的字符流處理很不方便。從JDK1.1開始, java.io包中加入了專門用于字符流處理的類,它們是以Reader和Writer為基礎派生的一系列類。 同類InputStream和OutputStream一樣,Reader和Writer也是抽象類,只提供了一系列用于字符流處理的接口。它們的方法與類InputStream和OutputStream類似,只不過其中的參數換成字符或字符數組。 字節(jié)流中類DataInputStream的readLine方法,可以以字節(jié)形式讀入,以Unic
54、ode形式輸出(String readLine())。byteUnicode16bit8 bit+00000000nvoid close()nvoid mark(int readAheadLimit)nboolean markSupported() :nint read() nint read(char cbuf) nint read(char cbuf, int off, int len) nboolean ready() nvoid reset() nlong skip(long n) 3、字符流、字符流基類:基類:Reader3、字符流、字符流基類:基類:Writernvoid clos
55、e() nvoid flush() nvoid write(char cbuf) nvoid write(char cbuf, int off, int len) nvoid write(int c) nvoid write(String str) nvoid write(String str, int off, int len) 3、字符流、字符流InputStreamReader和和OutputStreamWriter InputStreamReader和OutputStreamWriter是java.io包中用于處理字符流的最基本的類,用來在字節(jié)流和字符流之間作為中介:從字節(jié)輸入流讀入字
56、節(jié),并按編碼規(guī)范轉換為字符;往從字節(jié)輸入流讀入字節(jié),并按編碼規(guī)范轉換為字符;往字節(jié)輸出流寫字符時先將字符按編碼規(guī)范轉換為字節(jié)字節(jié)輸出流寫字符時先將字符按編碼規(guī)范轉換為字節(jié)。使用這兩者進行字符處理時,在構造方法中應指定一定的平臺規(guī)范,以便把以字節(jié)方式表示的流轉換為特定平臺上的字符表示。 InputStreamReader(InputStream in); /缺省規(guī)范 InputStreamReader(InputStream in, String enc); /指定規(guī)范enc OutputStreamWriter(OutputStream out); /缺省規(guī)范 OutputStreamWrit
57、er(OutputStream out, String enc); /指定規(guī)范enc3、字符流、字符流InputStreamReader和和OutputStreamWriter 如果讀取的字符流不是來自本地時(比如網上某處與本地編碼方式不同的機器),那么在構造字符輸入流時就不能簡單地使用缺省編碼規(guī)范,而應該指定一種統(tǒng)一的編碼規(guī)范“ISO 8859_1”,這是一種映射到ASCII碼的編碼方式,能夠在不同平臺之間正確轉換字符。InputStreamReader ir = new InputStreamReader( is, “8859_1” );3、字符流、字符流緩存流:緩存流:BufferedR
58、eader和和BufferedWriter 同樣的,為了提高字符流處理的效率,java.io中也提供了緩沖流BufferedReader和BufferedWriter。其構造方法與BufferedInputStream和BufferedOutputStream相類似。另外,除了read()和write()方法外,它還提供了整行字符處理方法: public String readLine(): BufferedReader的方法,從輸入流中讀取一行字符,行結束標志為n、r或兩者一起。 public void newLine(): BufferedWriter的方法,向輸出流中寫入一個行結束標志,
59、它不是簡單的換行符n或r,而是系統(tǒng)定義的行隔離標志(line separator)。class FileToUnicode public static void main(String args) try FileInputStream fis = new FileInputStream(“file1.txt); InputStreamReader dis = new InputStreamReader(fis); BufferedReader reader = new BufferedReader(dis); String s; while( (s = reader.readLine() !
60、= null ) System.out.println(read: +s); dis.close(); catch(IOException e) System.out.println(e); /main()/class3、字符流、字符流其它字符流其它字符流CharArrayReaderCharArrayWriter對字符數組進行處理LineNumberReader:行處理字符流PrintWriter: 打印字符流FileReaderFileWriter對文本文件進行處理StringReaderStringWriter對字符串進行處理FilterReaderFilterWriter過濾字符流PipedReaderPipedWrit
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 江蘇蘇州2024~2025學年高二下冊6月期末考試數學試題含解析
- 地方特色教育課程與公民素養(yǎng)教育融合考核試卷
- 2025年中國PE信封粘膠袋數據監(jiān)測研究報告
- 2025年中國LCD彩色監(jiān)視器數據監(jiān)測研究報告
- 2025年中國DWDM密集波分復用測試儀數據監(jiān)測研究報告
- 2025年中國6毫米CNG高壓鋼管PVC數據監(jiān)測研究報告
- 2025年中國16路混合器數據監(jiān)測報告
- 2025至2030年中國高真空擴散泵油市場分析及競爭策略研究報告
- 2025至2030年中國防毒面具箱市場分析及競爭策略研究報告
- 2025至2030年中國針型皮帶扣市場分析及競爭策略研究報告
- 2024-2025學年成都市教科院附屬學校重點中學初三下學期教學質量檢測試題英語試題含答案
- 豬肉聯(lián)營合作協(xié)議范本(2024版)
- 企業(yè)內刊策劃
- 智能化設備技術規(guī)格書范本
- 電子商務數據分析題庫與參考答案
- 期末考試-公共財政概論-章節(jié)習題
- 幼兒園體能大循環(huán)培訓
- 團體心理咨詢的主要理論專家講座
- 骨盆骨折中醫(yī)護理常規(guī)
- mil-std-1916抽樣標準(中文版)
- 大學學院“十四五”師資隊伍建設規(guī)劃(2021-2025)
評論
0/150
提交評論