第六章 數據流的應用_第1頁
第六章 數據流的應用_第2頁
第六章 數據流的應用_第3頁
第六章 數據流的應用_第4頁
第六章 數據流的應用_第5頁
已閱讀5頁,還剩42頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、第6章 數據流的運用北京大學計算機系代亞非2第第6章章 數據流的運用數據流的運用n6.1 輸入輸出方法輸入輸出方法n6.2 輸入輸出流的基類輸入輸出流的基類n6.3 File I/On6.4 數據輸入輸出流數據輸入輸出流n6.5 隨機存取文件隨機存取文件n6.6 文件的其它操作文件的其它操作n6.7 java中的中的unicoden6.8 管道流管道流n6.9 對象流對象流n6.10 流的分類流的分類n6.11 小結小結3文件文件程序程序終端終端文件文件程序程序網絡端點網絡端點數據流數據流起點起點終點終點 網絡端點網絡端點文件文件,字符串字符串存儲區(qū)存儲區(qū)6.1 輸入輸出方法輸入輸出方法n什么

2、是數據流什么是數據流 ?n數據流是指所有的數據通信通道數據流是指所有的數據通信通道n在在java中有關流的操作使用中有關流的操作使用java.io.*n出于安全的考慮出于安全的考慮,小應用不能實現文件小應用不能實現文件I/O流流46.1 輸入輸出方法輸入輸出方法nSystem類管理標準輸入輸出流和錯誤流類管理標準輸入輸出流和錯誤流 nSystem.out:n把輸出送到缺省的顯示把輸出送到缺省的顯示(通常是顯示器通常是顯示器)nSystem.inn從標準輸入獲取輸入從標準輸入獲取輸入(通常是鍵盤通常是鍵盤)n System.errn把錯誤信息送到缺省的顯示把錯誤信息送到缺省的顯示n每當每當mai

3、n方法被執(zhí)行時方法被執(zhí)行時,就自動生成上述三個就自動生成上述三個對象對象56.1 輸入輸出方法輸入輸出方法public class ReadHello public static void main(String args) char inchar; System.out.println(“Enter a character:”); try inChar=(char)System.in.read(); Syste.out.println(“ “+ inChar); catch(IOException e) Sytem.out.println(“Error reading from user”)

4、; 6streamIostream.class-f4.bat6.1 輸入輸出方法輸入輸出方法import java.io.*;class IOTest public statics void main(String args) try byte bArray=new byte128; System.out.println(“Enter something:”); System.in.read(bArray); System.out.print(“You entered:”); System.out.println(bArray); catch(IOException ioe) System.o

5、ut.println(ioe.toString(); 76.1 輸入輸出方法輸入輸出方法n為什么輸入的是字符為什么輸入的是字符,輸出是亂碼輸出是亂碼?n原因原因:System.out.println(bArray)輸出的是數組輸出的是數組的地址而不是字符的地址而不是字符n改進改進:將字符數組變換成字符串將字符數組變換成字符串n原來是原來是:System.out.println(bArray);n現在為現在為:String s=new String(bArray,0);n System.out.println(s);nSystem.in是屬于是屬于BufferedInputStream類型類型n

6、System.out是屬于是屬于PrintStream類型類型nSystem.err也是屬于也是屬于PrintStream類型類型86.2 輸入輸出流的基類輸入輸出流的基類nJava中每一種流的基本功能依賴于基本類中每一種流的基本功能依賴于基本類InputStream和和OutputStreamn它們是抽象類它們是抽象類,不能直接使用不能直接使用n屬于屬于InputStream類的方法有類的方法有:nread():從流中讀入數據從流中讀入數據nskip():跳過流中若干字節(jié)數跳過流中若干字節(jié)數navailable():返回流中可用字節(jié)數返回流中可用字節(jié)數nmark():在流中標記一個位置在流中

7、標記一個位置nreset():返回標記過得位置返回標記過得位置nmarkSupport():是否支持標記和復位操作是否支持標記和復位操作nclose():關閉流關閉流96.2 輸入輸出流的基類輸入輸出流的基類n方法方法read()提供了三種從流中讀數據的方法提供了三種從流中讀數據的方法.nint read():讀一個整數讀一個整數nint read(byte b):讀多個字節(jié)到數組中讀多個字節(jié)到數組中nint read(byte,int off,int len);n屬于屬于OutputStream類的方法有類的方法有:nwrite(int b):將一個整數輸出到流中將一個整數輸出到流中nwri

8、te(byte b):將數組中的數據輸出到流中將數組中的數據輸出到流中nwrite(byte b, int off,int len):將數組將數組b中從中從off指指定的位置開始定的位置開始len長度的數據輸出到流中長度的數據輸出到流中106.2 輸入輸出流的基類輸入輸出流的基類nflush():將緩沖區(qū)中的數據強制送出將緩沖區(qū)中的數據強制送出nclose():關閉流關閉流.nPrintStream類類nprintln()不屬于不屬于OutputStream類類,它是它是PrintStream類的子類類的子類,能提供復雜的輸出能提供復雜的輸出nPrintStream類的方法有類的方法有:nwr

9、ite, flush, checkError,print, println,close.n其中其中println可以輸出多種形式的數據可以輸出多種形式的數據.例如例如:n println(String s), println(char c)等等11輸出文件輸出文件輸入文件輸入文件readwrite6.3 File I/On文件對象的建立文件對象的建立nFile fp=new File(“tempfile.txt”);n對文件操作要定義文件流對文件操作要定義文件流nFileInputStream類用來打開一個輸入文件類用來打開一個輸入文件nFileOutputStream類用來打開一個輸出文件類

10、用來打開一個輸出文件126.3 File I/On文件流的建立文件流的建立nFileInputStream in=new FileInputStream(fp);nFileOutputStream out=new FileOutputStream(fp);n例例:文件拷貝文件拷貝(注意要捕獲文件異常注意要捕獲文件異常)n輸入流的參數是用于輸入的文件名輸入流的參數是用于輸入的文件名n輸出流的參數是用于輸出的文件名輸出流的參數是用于輸出的文件名file1.txtfile2.txt輸入流輸入流輸出流輸出流136.3 File I/O import java.io.*; class filestrea

11、m 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; while(c=fis.read()!=-1) fos.write(c); fis.close(); fos.close();catch(FileNotFoun

12、dException e) System.out.println(FileStreamsTest: +e);catch(IOException e) System.err.println(FileStreamsTest: +e);146.3 File I/On增加緩沖區(qū)流增加緩沖區(qū)流,減少訪問硬盤的次數減少訪問硬盤的次數,提高效率提高效率文件文件文件流文件流 緩沖區(qū)流緩沖區(qū)流 file1.txtfile2.txt輸入流輸入流輸出流輸出流輸入緩沖區(qū)輸入緩沖區(qū)輸出緩沖區(qū)輸出緩沖區(qū)156.3 File I/On緩沖區(qū)流緩沖區(qū)流:nBufferedInputStream和和 BufferedOutpu

13、tStreamn將它們與文件流相接將它們與文件流相接nFileInputStream in=new n FileInputStream(“file1.txt”);nBufferedInputStream bin=n new BufferedInputStream(in,256) nint len; byte bArray=new byte256;nlen=bin.read(bArray);nlen中得到是長度中得到是長度, bArray中得到的是數據中得到的是數據166.3 File I/On只有緩沖區(qū)滿時只有緩沖區(qū)滿時,才會將數據送到輸出流才會將數據送到輸出流.nJava在輸出數據流中在輸出

14、數據流中,當對方尚未將數據取走時當對方尚未將數據取走時,程序就會被阻塞程序就會被阻塞.n有時要人為地將尚未填滿的緩沖區(qū)中的數據送有時要人為地將尚未填滿的緩沖區(qū)中的數據送出出,使用使用flush()方法方法.文件文件176.4 數據輸入輸出流數據輸入輸出流n什么時候需要數據輸入輸出流什么時候需要數據輸入輸出流?n文件流和緩沖區(qū)流的處理對象是字節(jié)或字節(jié)數文件流和緩沖區(qū)流的處理對象是字節(jié)或字節(jié)數組,利用數據輸入輸出流可以實現對文件的不組,利用數據輸入輸出流可以實現對文件的不同數據類型的讀寫同數據類型的讀寫.nDataInputStream、DataOutputStreamn一種較為高級的數據輸入輸出

15、方式一種較為高級的數據輸入輸出方式,除了字節(jié)和除了字節(jié)和字節(jié)數組字節(jié)數組,還可以處理還可以處理int,float,boolean等類型等類型.n還可以用還可以用readLine方法讀取一行信息方法讀取一行信息n可使用的方法可使用的方法:n write,writeBoolean,read,readByte等等186.4 數據輸入輸出流數據輸入輸出流n數據流的建立數據流的建立nFileOutputStream fos=n new FileOutputStream(”file2.txt);nDataInputStream dis=n new DataInputStream(fos)n數據輸出流可以是

16、一個已經建立好的輸入數據數據輸出流可以是一個已經建立好的輸入數據流對象流對象,例如網絡的連結例如網絡的連結,文件等文件等.n下面的例子顯示如何利用數據輸入輸出流往文下面的例子顯示如何利用數據輸入輸出流往文件中寫不同類型的數據件中寫不同類型的數據196.4 數據輸入輸出流數據輸入輸出流class datainput_output public static void main(String args) throws IOException FileOutputStream fos=new FileOutputStream(“a.txt”); DataOutputStream dos=new Da

17、taOutputStream (fos); try dos.writeBoolean(true); dos.writeByte(byte)123); dos.writeChar(J); dos.writeDouble(3.141592654); dos.writeFloat(2.7182f); dos.writeInt(1234567890); dos.writeLong(998877665544332211L); dos.writeShort(short)11223); finally dos.close(); 20Streamdatainputandoutput-f5.bat6.4 數據輸

18、入輸出流數據輸入輸出流DataInputStream dis=new DataInputStream( new FileInputStream(”a.txt);try System.out.println(t +dis.readBoolean(); 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

19、 +dis.readInt(); System.out.println(t +dis.readLong(); System.out.println(t +dis.readShort();finallydis.close();216.4 數據輸入輸出流數據輸入輸出流nDateLine(InputStream in)(計算字符和行數計算字符和行數)n DataInputStream data=new n DataInputStream(in);n String currentLine;n int lineCount=0; int charCount=0;n while(currentLine=da

20、taIn.readLine()!=null)n +lineCount;n charCount+=currentLine.length();n n return (charCount/(float)lineCount);n22文件目錄文件目錄zip文件文件6.5 隨機存取文件隨機存取文件n類類RandomAccessFilen zip文件需要用隨機方法處理文件需要用隨機方法處理n文件目錄給出個文件的入口文件目錄給出個文件的入口,可以隨機讀取可以隨機讀取.n創(chuàng)建一個隨機文件創(chuàng)建一個隨機文件nnew RandomAccessFile(“file1.txt”, “r”);nnew RandomAcce

21、ssFile(“file2.txt”, “rw”);n隨機文件可以同時完成讀和寫操作隨機文件可以同時完成讀和寫操作.23pos6.5 隨機存取文件隨機存取文件n支持隨機文件操作的方法支持隨機文件操作的方法:nreadXXX()或或writeXXX()nskipBytes();將指針鄉(xiāng)下移動若干字節(jié)將指針鄉(xiāng)下移動若干字節(jié)nseek():將指針調到所需位置將指針調到所需位置ngetFilePointer():返回指針當前位置返回指針當前位置nlength():返回文件長度返回文件長度n利用利用seek(long pos)方法查找隨機文件中的信息方法查找隨機文件中的信息n例例:把若干個把若干個32位

22、的整數寫到一個名為位的整數寫到一個名為 “temp.dat”的文件中的文件中,然后利用然后利用seek方法方法,以相以相反的順序再讀取這些數據反的順序再讀取這些數據246.5 隨機存取文件隨機存取文件public class random_file public static void main(String args) int data_arr=12,31,56,23,27,1,43,65,4,99; try RandomAccessFile randf=new RandomAccessFile(“temp.dat”); for (int i=0;idata_arr.length;i+) r

23、andf.writeInt(data_arri); for(int i=data_arr.length-1;i=0;i-) randf.seek(i*4); System.out.println(randf.readInt(); randf.close(); catch (IOException e) System.out.println(“File access error: “+e); 256.6 文件的其它操作文件的其它操作n使用文件類獲取文件的路徑信息使用文件類獲取文件的路徑信息n設設f是一個文件對象是一個文件對象nFile f=new File(“data”,temp.dat”);n

24、f.getName():返回文件名返回文件名 temp.datnf.getParent():返回文件所在目錄名返回文件所在目錄名 datanf.getPath():返回文件路徑返回文件路徑 datatemp.datnf.getAbsolutePath():返回絕對路返回絕對路 c:myprogdatatemp.dat266.6 文件的其它操作文件的其它操作n例例: 獲取當前目錄下所有文件名和文件的尺寸獲取當前目錄下所有文件名和文件的尺寸: nimport java.io.*;npublic class file_sizen public static void main(String args

25、)n File files=new File(“.”);n String file_list=files.list();n for(int i=0;ifile_list.length;i+)n File current_file=new File(file_listi);n System.out.println(file_listi+n current_file.length();n n 27n在在java中用中用unicode 表示字符和字符串表示字符和字符串nDatainputStream的的readLine方法方法, 以字節(jié)形式以字節(jié)形式讀入讀入, 以以unicode形式輸出形式輸出zD

26、ataInputStream不適合輸入是不適合輸入是unicode的形式的形式z處理字符用處理字符用InputStreamReader 類和類和BufferedReader 類類(jdk1.1)byteUnicode16bit8 bit+ 000000006.7 java 中的中的unicode286.7 java 中的中的unicodeimport java.io;(從鍵盤上讀一個字符串從鍵盤上讀一個字符串)public class CharInput public static void main(String args) String s; throws IOException Inpu

27、tStreamReader ir; BufferedReader in; ir=new InputStreamReader(System.in); in=new BufferedReader(ir); String s=in.readLine(); int i=Integer.parseInt(s); i=i*2; System.out.println(“the result is” +i); 可以將字符串可以將字符串轉換成整數加轉換成整數加以運算以運算123296.7 java 中的中的unicoden問題問題:n如果字符流不是來自本地如果字符流不是來自本地,有可能編碼不一樣有可能編碼不一樣

28、,直接讀取會讀出不正確字符直接讀取會讀出不正確字符n處理方法處理方法:nir=new InputStreamReader(is,”8859_1”);n采用的是采用的是iso8859_1編碼方式編碼方式,在不同平臺之間在不同平臺之間正確轉換字符正確轉換字符.306.7 java 中的中的unicodeimport java.io.*;class filetounicode public static void main(String args) try FileInputStream fis=new FileInputStream(toyamei.txt); InputStreamReader

29、dis=new InputStreamReader(fis); BufferedReader reader=new String s; BufferedReader(dis); while(s=reader.readLine()!=null) System.out.println(read: +s); dis.close(); catch(IOException e) 316.8 使用管道流使用管道流nPipedInputStream和和PipedOutputStreamn創(chuàng)建管道流創(chuàng)建管道流:nPipedInputStream pis=new PipedInputStream();nPipe

30、dOutputStream pos=new PipedOutputStream(pis);n或或:nPipedOutputStream pos=new PipedOutputStream();nPipedInputStream pis=new PipedInputStream(pos);輸出流輸出流輸入流輸入流326.8 使用管道流使用管道流n管道流一定是輸入輸出并用管道流一定是輸入輸出并用n例例:將數據從輸出管道進將數據從輸出管道進,從輸入管道出從輸入管道出nimport java.io.*; nclass pipedstream n public static void main(Stri

31、ng args) throwsn IOExceptionn byte aByteData1=123, aByteData2=111;n PipedInputStream pis=n new PipedInputStream();n PipedOutputStream pos=n new PipedOutputStream(pis);n System.out.println(PipedInputStream);33ntry n pos.write(aByteData);npos.write(aByteData2);nSystem.out.println(byte)pis.read();nSyst

32、em.out.println(byte)pis.read();n finally n pis.close();n pos.close();n6.8 使用管道流使用管道流346.9 對象流對象流n在在java.iojava.io包中包中什么是對象的持續(xù)性什么是對象的持續(xù)性?n能夠紀錄自己的狀態(tài)一邊將來再生的能力能夠紀錄自己的狀態(tài)一邊將來再生的能力,叫對叫對象的持續(xù)性象的持續(xù)性n什么是串行化什么是串行化? ?n對象通過寫出描述自己狀態(tài)的的數值來記錄自對象通過寫出描述自己狀態(tài)的的數值來記錄自己的過程叫串行化己的過程叫串行化. .n什么是對象流什么是對象流? ?n能夠輸入輸出對象的流能夠輸入輸出對象的

33、流. .n兩者什么關系兩者什么關系? ?n將串行化的對象通過對象輸入輸出流寫入文件將串行化的對象通過對象輸入輸出流寫入文件或傳送到其它地方或傳送到其它地方. .356.9 對象流對象流n一個相關的例子一個相關的例子:從一個源讀入一個簡單的對象從一個源讀入一個簡單的對象nimport ;import java.ionpublic class GetStringn public String getStringFromUrl(URL inURL)n InputStream in;n try in =inURL.openStream();n catch(IOException ioe)n Syste

34、m.out.printlin(“URL error;”+ioe);n return null; n return getString(in);n 通過通過url得到一個字符串得到一個字符串366.9 對象流對象流npublic String getStringFromSocket(Socket inSocket)n inputStream in;n try in=inSocket.getInputStreamSream();n catch(IOEception ioe)n System.out.println(“Socket error:”+ioe);n return null; n retu

35、rn getString(in);n 通過通過socket得到一個字符串得到一個字符串376.9 對象流對象流public String getString(inputStream inStream) String readString = new String(); DataInputStream in =new DataInputSream(inStream); char inChar; try while(true) inChar=in.readByte(); readString=readString+inChar; catch(EOFException eof) System.out

36、.println(readString); catch(IOException ioe) System.out.println(“error:”+ieo); return readString; 386.9 對象流對象流n下面的對象能讀嗎下面的對象能讀嗎?nClass testObjectn int x; int y;n float angle;n String name;n public testObject(int x,int y,float angle,n String name);n this.x=x;this.y;this.angle;=name;n n這仍然是一個

37、簡單的對象這仍然是一個簡單的對象396.9 對象流對象流對象流是怎樣工作的對象流是怎樣工作的?允許可串行化的對象在流中傳輸允許可串行化的對象在流中傳輸1.只有實現只有實現serializable接口的類才能被串行化接口的類才能被串行化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;

38、 this.age=age; this.department =departmernt; 406.9 對象流對象流n2. 構造對象的輸入輸出流構造對象的輸入輸出流(將對象保存到文件將對象保存到文件中中,或者通過網絡傳送到其他地方或者通過網絡傳送到其他地方)n相應的類相應的類:ObjectInputn對象的輸出對象的輸出: ObjectOutputStreamn相應的方法相應的方法:writeObject()n對象的輸入對象的輸入:ObjectInputStreamn相應的方法相應的方法:readObject()n注注:jdk1.1以上版本支持對象流操作以上版本支持對象流操作416.9 對象流對

39、象流對象流舉例對象流舉例:將將Student類的一個實例寫到文件中類的一個實例寫到文件中import java.io.FileOutputStream;import java.io.ObjectOutputStream;public class Objectserpublic static void main(String args) Student stu=new Student(981036,“Li Ming”,16,“CSD”);try FileOutputStream fo=new FileOutputStream(“date.ser”); ObjectOutputStream so=

40、new ObjectOutputStream(fo); os.writeObject(stu);so.close(); catch(Exception e) ; 426.9 對象流對象流import java.io.Fileimport java.io.FileInputInputStreamStream; ;import java.io.Objectimport java.io.ObjectInputInputStreamStream; ;public class ObjectRecovpublic class ObjectRecov public static void main(Stri

41、ng args public static void main(String args) ) Student stu Student stu; ; try FileInputStream try FileInputStream fi=newfi=new FileInputStream(“date.ser FileInputStream(“date.ser”);”); ObjectInputStream si=new ObjectInputStream si=new ObjectInputStream ObjectInputStream(fi);(fi); stu=(Student)si.readObject();si stu=(Student)si.readObject();si.close();.close(); catch(Exception e) System.out.println catch(Exception e) System.out.println(e);(e); System.out.println(“ID: ”+stu System.out.println(“ID: ”+stu.id+“name:”+.id+“name:”+ +“age:”+age+“dept.:”++“age:”+age+“

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論