第七講輸入輸出流_第1頁
第七講輸入輸出流_第2頁
第七講輸入輸出流_第3頁
第七講輸入輸出流_第4頁
第七講輸入輸出流_第5頁
已閱讀5頁,還剩99頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、1l運行時發(fā)生的錯誤稱為異常。 l必須捕獲引發(fā)的每個異常,否則應用程序不會正常中止。 l異常處理允許在一個地方集中進行錯誤處理。這使得可以創(chuàng)建功能強大且健壯的代碼。l異常處理輔助進行調(diào)試及維護工作并提高系統(tǒng)的容錯性和穩(wěn)定性lJava 使用 try 和 catch 塊來處理異常。try 塊中的語句引發(fā)異常,而 catch 塊則處理異常。 2l可以同時使用多個 catch 塊來分別處理各種異常類型。l程序可以用throw語句引發(fā)明確的異常。l關(guān)鍵字 throws 用于列出一個方法可能引發(fā)的異常類型。l不管是否發(fā)生了異常,都將執(zhí)行 finally 塊中的語句。32012 File類 輸入輸出流體系

2、常見流應用 文件讀寫 對象流 管道流 補充 標準輸入輸出 隨機文件讀寫 Java新IO 【參考書】瘋狂Java講義,第15章Java編程思想4th,第18章45 文件類(File類) 各種操作系統(tǒng)的文件管理提供的基本服務一樣,但實現(xiàn)細節(jié)互不兼容。 解決java程序與文件系統(tǒng)的溝通。 流類定義線性的順序的輸入輸出數(shù)據(jù)流6 File類概述 File類構(gòu)造器 File類的常用方法7 File類的對象是文件系統(tǒng)中的一個目錄或文件的抽象表示。 File類對象描述文件路徑、名字、長度、可否讀寫等屬性,可用來命名文件、查詢文件屬性、對目錄進行操作,但不讀寫文件。讀寫文件內(nèi)容分別是由文件的IO類(FileIn

3、putStream和FileOutputStream)來實現(xiàn)的。 通過File類對象可以對操作系統(tǒng)的文件進行管理,體現(xiàn)了跨平臺不同文件的統(tǒng)一管理8FileFile有三個重載的構(gòu)造方法有三個重載的構(gòu)造方法: 1 1)、)、FileFile(String pathString path) 2 2)、)、FileFile(String path,String nameString path,String name) 3 3)、)、File (File dir,String name)File (File dir,String name)9 Path可以是文件的完整路徑名,也可只有路徑而無文件名;路經(jīng)

4、可以是絕對路徑,也可以是相對路徑;路徑或文件名可以是已存在的也可是新的,新的則被創(chuàng)建,舊的則被刷新。例1:File file1=new File(“f:javaaaa”);在已存在的f:java目錄下新創(chuàng)建一個aaa目錄,使用的是絕對路徑,且只能創(chuàng)建一層新目錄。例2:File file2=new File(“bbb”); 在當前工作目錄下,創(chuàng)建bbb新目錄的文件對象,使用的是相對路徑例3:File file3=new File(“f:javafile1.txt”); 使用絕對路徑,在已存在的f:java目錄下創(chuàng)建一個文本文件對象。win unix /10 Path:已存在的文件路徑, Name

5、 :可以是路徑或文件名,可以是新的或原有的。 例4:File file4=new File(“f:java”,”aaa”); 與例1效果相同 例5 :File file5=new File(“f:java”,“file1.txt”); 與例3效果相同11 dir:為文件對象,由該對象指定路徑,稱抽象路徑 name:文件名或目錄名 例6:File file1=new File(“f:javaaaa”);File file6=new File(file1,”myfile.txt”);12方法(public)說 明boolean canRead() 測試文件是否可讀boolean canWrite(

6、) 測試文件是否可寫boolean delete() 刪除當前文件或目錄boolean exists()測試文件或目錄是否存在File getAbsoluteFile() 返回文件或目錄絕對地址(對象)String getAbsolutePath()返回文件或目錄絕對地址(字符串)String getCanonicalPath()返回規(guī)范路徑名(與OS有關(guān))13方法(public)說 明String getName()只返回文件或目錄的名字String getPath()返回文件或目錄的完整路徑String getParent()只返回文件或目錄的上層路徑boolean isAbsolute(

7、) 測試該對象是絕對路徑否boolean isDirectory() 測試該對象是目錄否boolean isFile() 測試該對象是文件否long length() 返回文件對象的文件長度(以字節(jié)為單位)String list() 返回該對象目錄下的所有文件列表(包括文件夾)boolean mkdir() 為該對象形成物理上的文件夾1415文件的特性讀和寫的權(quán)限文件長度修改時間是否是目錄java.io.File類設定文件屬性查詢文件屬性16獲取文件路徑import java.io.*;class AttrDemo1 public static void main(String args) t

8、hrows IOException File testfile = new File(. + File.separatorChar + testfile1); testfile.createNewFile(); System.out.println(name = + testfile.getName(); System.out.println(path = + testfile.getPath(); System.out.println(absolute path = + testfile.getAbsolutePath(); System.out.println(canonical path

9、 = + testfile.getCanonicalPath(); 17獲取文件修改時間import java.io.*; import java.util.*;public class AttrDemo2 public static void main(String args) throws IOException File testfile = new File(testfile2); testfile.delete(); testfile.createNewFile(); long modtime = testfile.lastModified(); System.out.println

10、(last modification time #1 = + new Date(modtime); testfile.setLastModified(0); modtime = testfile.lastModified(); System.out.println(last modification time #2 = + new Date(modtime);18獲取和設定文件長度import java.io.*;public class AttrDemo3 public static void main(String args) throws IOException File testfil

11、e = new File(testfile3); testfile.delete(); testfile.createNewFile(); System.out.println(length #1 = +testfile.length(); RandomAccessFile raf = new RandomAccessFile(testfile3, rw); raf.setLength(100); raf.close(); System.out.println(length #2 = + testfile.length(); 19設置讀寫權(quán)限import java.io.*;public cl

12、ass AttrDemo4 public static void main(String args) throws IOException File testfile = new File(testfile4); testfile.delete(); testfile.createNewFile(); if (testfile.canRead() System.out.println(file can be read #1); if (testfile.canWrite() System.out.println(file can be written #1); testfile.setRead

13、Only(); if (testfile.canRead() System.out.println(file can be read #2); if (testfile.canWrite() System.out.println( file can be written #2); 20public class DirListpublic static void main(String args)File path = new File(.);String list;if (args.length = 0)list = path.list();elselist = path.list(new D

14、irFilter(args0);Arrays.sort(list, new AlphabeticComparator();for (int i = 0; i list.length; i+)System.out.println(listi);21class DirFilter implements FilenameFilterString afn;DirFilter(String afn)this.afn = afn;public boolean accept(File dir, String name)/ Strip path information:String f = new File(

15、name).getName();return f.indexOf(afn) != -1; /:2223DataSource數(shù)據(jù)源程序DataSink數(shù)據(jù)接收器 Java把不同類型的輸入、輸出抽象為流(stream),分為輸入流和輸出流,用統(tǒng)一的接口來表示, Java開發(fā)環(huán)境中提供了包Java.io,其中包括一系列的類來實現(xiàn)輸入輸出處理。 24設備驅(qū)動程序設備驅(qū)動程序設備驅(qū)動程序設備驅(qū)動程序設備驅(qū)動程序OS獨立于設備的I/O層java.io提供I/O層(類層)應用程序應用程序應用程序25 對象對象源源? 目標目標? 或兩者或兩者?disk file running program monitor

16、 keyboard Internet connection image scanner mouse BothBothDestinationSourceBothSourceSource26Java.lang.ObjectInputStream字節(jié)輸入流類字節(jié)輸入流類OutputStream字節(jié)輸出流類字節(jié)輸出流類Reader字符輸入流類字符輸入流類Writer字符輸出流類字符輸出流類File文件流類文件流類FileInputStream文件字節(jié)輸入流類文件字節(jié)輸入流類FileOutputStream文件字節(jié)輸出流類文件字節(jié)輸出流類BufferedReader緩沖字符輸入流類緩沖字符輸入流類Inp

17、utStreamReader文件字符輸入流類文件字符輸入流類BufferedWriter緩沖字符輸出流類緩沖字符輸出流類OutputStreamWriter文件字符輸出流類文件字符輸出流類FileWriter文件輸出流類文件輸出流類FileReader文件輸入流類文件輸入流類27 java.io包中的類和接口可分為以下幾類: (1) 高層抽象類用于表示各種不同的流 (2) 各種特殊類型的流類,如過濾器流、緩沖流、管道流等 (3) 數(shù)據(jù)流類用于輸入、輸出基本數(shù)據(jù)類型數(shù)據(jù)或字符串對象 (4) 用于文件讀寫的類和接口 (5) 用于對象序列化的類和接口28 字節(jié)流從InputStream和Output

18、Stream派生出來的一系列類。這類流以字節(jié)(byte)為基本處理單位。 public abstract class InputStream extends Object public abstract class OutputStream extends Object 字符流從Reader和Writer派生出的一系列類,這類流以16位的Unicode碼表示的字符為基本處理單位。 public abstract class Reader extends Object public abstract class Writer extends Object293031 InputStream、Ou

19、tputStream FileInputStream、FileOutputStream順序讀取文件 PipedInputStream、PipedOutputStream管道 ByteArrayInputStream、ByteArrayOutputStream 內(nèi)存讀寫 FilterInputStream、FilterOutputStream過濾流(有多線程同步) DataInputStream、DataOutputStream對數(shù)據(jù)類型讀寫,有多線程同步 BufferedInputStream、BufferedOutputStream32 管理字節(jié)(適于讀取面向字節(jié)的數(shù)據(jù)) 是所有表示輸入字節(jié)

20、流類的父類(抽象類) 三個基本方法: abstract int read() 從輸入流中讀下一個字節(jié)。 int read(byte b) 從輸入流中讀若干個字節(jié)到數(shù)組中。 int read(byte b , int off , int len ) 從輸入流中讀len個字節(jié)到數(shù)組中。off是寫入數(shù)組的位置(位移)。33 其他方法: skip(long n) 跳過n個字節(jié)。 boolean markSupported() 判斷流是否支持mark功能 mark(int readlimit) 在當前位置做標記. reset() 回到最近一次做的標記處。 close() 關(guān)閉輸入流,釋放與此輸入流相連的

21、系統(tǒng)資源。34 這些子類的構(gòu)造函數(shù)都可以用某種方式指定其數(shù)據(jù)源。 加強輸入流,對InputStream類進行功能擴充uByteArrayInputStream( byte數(shù)組 ) uFileInputStream(文件路徑名 或 File對象)uObjectInputStream (Inputstream in) uPipedInputStream (PipedOutputStream pipe)uSequenceInputStream 表示其他輸入串的邏輯連接u uFilterInputStream(其他輸入流)定義了子類對流的進一步處理功能。uBufferedInputStream (In

22、putStream in) uDataInputStream(InputStream in) 各種數(shù)據(jù)讀入35 抽象類:是所有表示輸出字節(jié)流類的父類。 功能:接受要輸出的字節(jié)并將它送往目的地。 方法: write(int b) 將一個字節(jié)數(shù)據(jù)寫入輸出流 write(byte b) 將字節(jié)數(shù)組數(shù)據(jù)寫入輸出流。 flush() 刷新輸出流,并使緩沖區(qū)中的數(shù)據(jù)寫出。 close() 關(guān)閉輸出流,釋放與之相連的系統(tǒng)資源。36 FileOutputStream(File類對象或文件名), ByteArrayOutputStream() 數(shù)據(jù)被寫到無名字節(jié)數(shù)組,該字節(jié)數(shù)組內(nèi)容可利用toByteArray(

23、) 和 toString()分別取到指定字節(jié)數(shù)組和字符串中。 PipedOutputStream (PipedInputStream pipe) ObjectOutputStream FilterOutputStream DataOutputStream(OutputStream out) 包含輸出各種數(shù)據(jù)類型數(shù)據(jù)的方法,如writeFloat() PrintStream(OutputStream out) 包含輸出各種數(shù)據(jù)類型數(shù)據(jù)的方法,如print(),println。 但沒有對應輸入流37兩個對稱性:兩個對稱性:輸入輸出對稱:InputStream和OutputStream提供了面向字節(jié)

24、的I/O功能;Reader和Writer提供了面向字符的I/O功能。bytechar對稱:InputStream與Reader的子類分別負責byte和char流的輸入; OutputStream和Writer的子類分別負責byte和char流的輸出 。兩個設計模式:兩個設計模式:裝飾模式:有些流處理器可以對另一些流處理器起到裝飾作用,形成新的具有改善了功能的流處理器。接口不改變,但增加功能。適配器模式:有些流處理器是對其他類型的流源的適配。接口改變,但不增加功能。38兩種流 原始流:原始流處理器接收一個Byte數(shù)組對象、String對象或文件對象,并聲稱一個InputSteam類型的流對象例如

25、:ByteArrayInputStream, FileInputStream, PipedInputStream, StringBufferInputStream。 鏈接流(裝飾流): 可以接收另一個(同種類)流對象作為流源,并對其進行功能擴展。同樣類型的流用做鏈接流類的流源。 例如:FilterInputStream下的BufferedInputStream, DataInputStream, LineNumberInputStream, PushbackInputStream。 ObjectInputStream和SequenceInputStream39說明:以字符為導向的stream基

26、本上對有與之相對應的以字節(jié)為導向的stream。兩個對應類實現(xiàn)的功能相同,只是在操作時的導向不同。如 CharArrayReader:和ByteArrayInputStream的作用都是把內(nèi)存中的一個緩沖區(qū)作為InputStream使用,所不同的是前者每次從內(nèi)存中讀取一個字節(jié)的信息,而后者每次從內(nèi)存中讀取一個字符。 40 流處理器所處理的流必定都有流源。流源分成兩大類: 數(shù)組、String、File等,叫原始流源 用于鏈接流類的流源,叫鏈接流源 Java 語言的I/O庫是對各種常見的流源、流匯、以及處理過程的抽象化 Java 語言的I/O庫是由一些基本的原始流處理器和圍繞它們的裝飾流處理器所組

27、成的41鏈接流:可接收另一個流對象作為流源,并對之進行功能擴展的流InputStream類型的鏈接流處理器包括 FilterInputStream:過濾輸入流,它將另一個輸入流作為流源。它有4個子類: BufferedInputStream:用來從硬盤將數(shù)據(jù)讀入到一個內(nèi)存緩沖區(qū)中,并從該緩沖區(qū)提供數(shù)據(jù) DataInputStream:提供基于多字節(jié)的讀取方法,可以讀取基本數(shù)據(jù)類型的數(shù)據(jù) LineNumberInputStream:提供帶有行計數(shù)功能的過濾輸入流 PushbackInputStream:提供特殊功能,可以將已經(jīng)讀取的字節(jié)“推回”到輸入流中 ObjectInputStream:可以

28、將使用ObjectOutputStream串行化的基本數(shù)據(jù)類型和對象重新并行化 SequenceInputStream:可將兩個已有的輸入流連接起來形成一個輸入流42 原始流處理器可以被鏈接流處理器所裝飾: BufferedInputStream:裝飾了InputStream的內(nèi)部工作方式,使得流的讀入操作使用緩沖機制(即不會對每一次的流讀入操作都產(chǎn)生一個物理的讀盤動作) LineNumberInputStream和PushbackInputStream:使得流的讀入操作帶有行計數(shù)功能或者可以將已經(jīng)讀取的字節(jié)“推回”到輸入流中。它們在實際工作中很少用到,它們是為了支持用java語言制作編譯器而

29、準備的。 DataInputStream:可以讀取各種不同的基本數(shù)據(jù)類型以及String類型的數(shù)據(jù),這一點可以從它所提供的各個read方法可以看出來。使用這個流處理器以及它的搭檔DataOutputStream ,可以將原始數(shù)據(jù)從一個地方通過流移到另一個地方43原始流處理器 ByteArrayOutputStream:輸出流的匯集是一個byte數(shù)組 FileOutputStream:輸出流的匯集是一個文件對象 PipedOutputStream:用于向一個數(shù)據(jù)管道輸出數(shù)據(jù)44 鏈接流處理器: FilterOutputStream:過濾輸出流,它將另一個輸出流作為流匯。:過濾輸出流,它將另一個輸

30、出流作為流匯。其子類有:其子類有:BufferedOutputStream:向一個內(nèi)存緩沖區(qū)中寫出數(shù)據(jù),并將:向一個內(nèi)存緩沖區(qū)中寫出數(shù)據(jù),并將此中的數(shù)據(jù)輸出到硬盤中此中的數(shù)據(jù)輸出到硬盤中DataOutputStream:可以寫出基本數(shù)據(jù)類型的數(shù)據(jù):可以寫出基本數(shù)據(jù)類型的數(shù)據(jù)PrintStream:用于產(chǎn)生格式化輸出:用于產(chǎn)生格式化輸出 ObjectOutputStream:將基本數(shù)據(jù)類型和對象串行化:將基本數(shù)據(jù)類型和對象串行化1. 與DataInputStream相對應的是DataOutputStream。后者負責將由基本數(shù)據(jù)類型和String對象組成的數(shù)據(jù)格式化,并輸出到一個流中,使得任何機

31、器上的任何DataInputStream類型的對象都可以讀入這些數(shù)據(jù)。所有的寫方法都以write開始,比如writeByte()等45 如果需要對數(shù)據(jù)做真正的格式化,以便輸出到像控制臺顯示那樣,就要用PrintStream。 PrintStream可以對基本數(shù)據(jù)類型和String對象組成的數(shù)據(jù)進行格式化,以形成可閱讀的格式。System.out就是一個靜態(tài)的PrintStream對象。 PrintStream對象最重要的兩個方法是print()和println() BufferedOutputStream:對一個輸出流進行裝飾,使得流的寫出操作使用緩沖操作,提高程序效率。在涉及到物理流的地方,

32、比如控制臺I/O、文件I/O等,都應當使用這個裝飾流處理器46類聲明:public abstract class Reader extends Object implements Readable, Closeable三個基本的read方法:int read() /讀取單個字符int read(char cbuf) /讀取字符到字符數(shù)組cbuf中int read(CharBuffer target) abstract int read(char cbuf, int offset, int length) /這里的read方法是為了更復雜的類可以利用它們,以便提供一個更有用的接口 其它方法voi

33、d close()boolean ready() /測試流是否準備好被讀取skip(long n)boolean markSupported()void mark(int readAheadLimit)void reset()47 原始流處理器: CharArrayReader:為多線程通信提供緩沖區(qū)操作功能 InputStreamReader:有一個子類FileReader PipedReader:與PipedInputStream配合使用,用于讀入一個數(shù)據(jù)管道里的數(shù)據(jù) StringReader:建立一個與文件有關(guān)的輸入流 鏈接流處理器: BufferedReader:從硬盤將數(shù)據(jù)讀入到一個

34、內(nèi)存緩沖區(qū),并從該緩沖區(qū)提供數(shù)據(jù) FilterReader:它將另一個輸入流作為流源48類聲明:public abstract class Writerextends Object implements Appendable, Closeable, Flushable三個基本的write方法:void write(int c)void write(char cbuf)abstract void write(char cbuf, int offset, int length) /這里的write方法是為了更復雜的類可以利用它們,以便提供一個更有用的接口。void write(String str

35、ing)void write(String string, int offset, int length) 其它方法abstract void close()abstract void flush()49Writer有7個直接子類WriterBufferedWriterStringWriterCharArrayWriterPipedWriterOutputStreamWriterPrintWriterFilterWriterFileWriter50原始流處理器: CharArrayWriter:為多線程通信提供緩沖區(qū)操作功能:為多線程通信提供緩沖區(qū)操作功能 OutputStreamWriter

36、:建立一個與文件有關(guān)的輸出流:建立一個與文件有關(guān)的輸出流 PipedWriter:與:與PipedOutputStream配合使用配合使用 StringWriter:向一個:向一個StringBuffer寫出數(shù)據(jù)寫出數(shù)據(jù)鏈接流處理器: BufferedWriter:為:為Writer類型的流處理器提供緩沖區(qū)功能類型的流處理器提供緩沖區(qū)功能 FilterWriter:沒有子類的抽象類,將另一個輸出流作為流源:沒有子類的抽象類,將另一個輸出流作為流源 PrintWriter:支持格式化的文字輸出:支持格式化的文字輸出51 InputStreamReader是從byte流到char流的一個橋梁,它讀

37、入byte數(shù)據(jù)并根據(jù)指定的編碼將之翻譯成為char數(shù)據(jù) 當把InputStreamReader與任何InputStream的具體子類鏈接時,可以從InputStream的輸出讀入byte類型的數(shù)據(jù),將之轉(zhuǎn)換成char類型的數(shù)據(jù)byte類型的數(shù)據(jù)byte類型的數(shù)據(jù)源源InputStreamReaderchar類型的數(shù)據(jù)類型的數(shù)據(jù)匯匯52 類似地,當與任何一個OutputStream的具體子類鏈接時, OutputStreamWriter可以將char類型的數(shù)據(jù)轉(zhuǎn)換成為byte類型的數(shù)據(jù),再交給輸出流OutputStreamWriterchar類型的數(shù)據(jù)byte類型的數(shù)據(jù)源源OutputStrea

38、mbyte類型的數(shù)據(jù)類型的數(shù)據(jù)匯匯53 File I/O 數(shù)據(jù)輸入/輸出流 壓縮文件流 對象序列化 管道流54 文件對象的建立File fp=new File(“tempfile.txt”); 文件流的建立FileInputStream in=new FileInputStream(fp);FileOutputStream out=new FileOutputStream(fp);其中,輸入流的參數(shù)是用于輸入的文件名,輸出流的參數(shù)是用于輸出的文件名。5556 增加緩沖區(qū)流,減少訪問硬盤的次數(shù),提高效率file1.txtfile2.txt輸入流輸入流輸出流輸出流輸入緩沖區(qū)輸入緩沖區(qū)輸出緩沖區(qū)輸出

39、緩沖區(qū)文件文件文件流文件流 緩沖區(qū)流緩沖區(qū)流 57 緩沖區(qū)流:BufferedInputStream和 BufferedOutputStream 將它們與文件流相接FileInputStream in=new FileInputStream(“file1.txt”);BufferedInputStream bin= new BufferedInputStream(in,256)只有緩沖區(qū)滿時,才會將數(shù)據(jù)送到輸出流.Java在輸出數(shù)據(jù)流中,當對方尚未將數(shù)據(jù)取走時,程序就會被阻塞.有時要人為地將尚未填滿的緩沖區(qū)中的數(shù)據(jù)送出,使用flush()方法.文件文件58 什么時候需要數(shù)據(jù)輸入輸出流?文件流和

40、緩沖區(qū)流的處理對象是字節(jié)或字節(jié)數(shù)組,利用數(shù)據(jù)輸入輸出流可以實現(xiàn)對文件的不同數(shù)據(jù)類型的讀寫. DataInputStream、DataOutputStream一種較為高級的數(shù)據(jù)輸入輸出方式,包含以下功能:除了字節(jié)和字節(jié)數(shù)組,還可以處理int,float,boolean等類型;用readLine方法讀取一行信息。59 數(shù)據(jù)流的建立FileOutputStream fos= new FileOutputStream(”file2.txt);DataInputStream dis=new DataInputStream(fos) 數(shù)據(jù)輸出流可以是一個已經(jīng)建立好的輸入數(shù)據(jù)流對象,例如網(wǎng)絡的連結(jié),文件等.

41、60 java.util.zip包中提供了一些類,使我們可以以壓縮格式對流進行讀寫 它們都繼承自字節(jié)流類OutputStream和InputStream 其中GZIPOutputStream和ZipOutputStream可分別把數(shù)據(jù)壓縮成GZIP格式和Zip格式 GZIPInputStream和ZipInputStream可以分別把壓縮成GZIP格式或Zip的數(shù)據(jù)解壓縮恢復原狀61 GZIPOutputStream 父類是DeflaterOutputStream 可以把數(shù)據(jù)壓縮成GZIP格式 GZIPInputStream 父類是 InflaterInputStream 可以把壓縮成GZIP

42、格式的數(shù)據(jù)解壓縮62 GZIPnew GZIPOutputStream( new FileOutputStream(test.gz)new GZIPInputStream( new FileInputStream(test.gz)63public class GZIPcompress/ Throw exceptions to console:public static void main(String args) throws IOExceptionBufferedReader in = new BufferedReader(new FileReader(GZIPcompress.java);

43、BufferedOutputStream out = new BufferedOutputStream(new GZIPOutputStream(new FileOutputStream(test.gz);System.out.println(Writing file);int c;while (c = in.read() != -1)out.write(c);64in.close();out.close();System.out.println(Reading file);BufferedReader in2 = new BufferedReader(new InputStreamReade

44、r(new GZIPInputStream(new FileInputStream(d:test.gz);String s;while (s = in2.readLine() != null)System.out.println(s); /:65 在java.io包中什么是對象的持續(xù)性? 能夠記錄自己的狀態(tài)以便將來再生的能力,叫對象的持續(xù)性 什么是串行化?對象通過寫出描述自己狀態(tài)的的數(shù)值來記錄自己的過程叫串行化. 什么是對象流?能夠輸入輸出對象的流. 兩者什么關(guān)系?將串行化的對象通過對象輸入輸出流寫入文件或傳送到其它地方.66什么是對象序列化(object serialization): 對象

45、串行化面向那些實現(xiàn)了Serializable接口的對象,允許你以串行字節(jié)序列形式保存對象的狀態(tài),日后還可以將其完全恢復到對象的初始狀態(tài) 恢復一個串行化后的對象稱為解串行化(deserialization)為什么要串行化呢? 串行化機制使Java語言得以支持兩個重要功能 Java的遠程方法調(diào)用(Remote Method Invocation, RMI):允許你“通過本地機器上的對象運用方式,使用其它機器上的對象” 保持數(shù)據(jù)對象實例變量的數(shù)值和當時的運行環(huán)境,可不受對象生命周期的限制,供其它類、其它時間共享。 67空接口,使類的對象可實現(xiàn)序列化Serializable 接口的定義package

46、java.io;public interface Serializable / theres nothing in here!;實現(xiàn)Serializable接口的語句public class MyClass implements Serializable .68 實現(xiàn)該接口可以控制對象的讀寫 API中的說明為public interface Externalizable extends Serializable 其中有兩個方法writeExternal()和readExternal(),因此實現(xiàn)該接口的類必須實現(xiàn)這兩個方法 ObjectOutputStream的writeObject()方法只

47、寫入對象的標識,然后調(diào)用對象所屬類的writeExternal() ObjectInputStream的readObject()方法調(diào)用對象所屬類的readExternal()69 串行化能保存的元素 只能保存對象的非靜態(tài)成員變量,不能保存任何的成員方法和靜態(tài)的成員變量,而且串行化保存的只是變量的值,對于變量的任何修飾符,都不能保存。 transient關(guān)鍵字 對于某些類型的對象,其狀態(tài)是瞬時的,這樣的對象是無法保存其狀態(tài)的,例如一個Thread對象,或一個FileInputStream對象,對于這些字段,我們必須用transient關(guān)鍵字標明。 定制串行化 缺省的串行化機制,對象串行化首先寫

48、入類數(shù)據(jù)和類字段的信息,然后按照名稱的上升排列順序?qū)懭肫鋽?shù)值。如果想自己明確地控制這些數(shù)值的寫入順序和寫入種類,必須定義自己的讀取數(shù)據(jù)流的方式。就是在類的定義中重寫接口serializeble的writeObject()和readObject()方法。 70怎樣實現(xiàn)對象串行化呢? 首先,判斷對象是否可以串行化(serializable) 類必須實現(xiàn)了 java.io.Serializable 接口 Serializable 接口僅僅是一個標記,沒有任何的成員變量和方法 從沒有實現(xiàn)Serializable (or Externalizable)接口的類實例化來的對象是不能被串行化的 創(chuàng)建某些Ou

49、tputStream對象,然后將其封裝到ObjectOutputStream對象內(nèi)。此時,只需調(diào)用writeObject()即可完成對象的序列化,并將其發(fā)送給OutputStream相反的過程是:將一個InputStream封裝到ObjectInputStream內(nèi),然后調(diào)用readObject()。我們最后獲得的是一個Object對象,必須做向下類型轉(zhuǎn)換717273747576 管道流一定是輸入輸出并用 創(chuàng)建管道流: PipedInputStream pis=new PipedInputStream(); PipedOutputStream pos=new PipedOutputStream

50、(pis); 或: PipedOutputStream pos=new PipedOutputStream(); PipedInputStream pis=new PipedInputStream(pos);輸出流輸出流輸入流輸入流77/將數(shù)據(jù)從輸出管道進,從輸入管道出import java.io.*; class pipedstream public static void main (String args) throw IOException byte aByteData1=123, aByteData2=111; PipedInputStream pis= new PipedInput

51、Stream(); PipedOutputStream pos= new PipedOutputStream(pis); System.out.println (PipedInputStream);try pos.write(aByteData); pos.write(aByteData2); System.out.println(byte)pis.read(); System.out.println(byte)pis.read(); finally pis.close(); pos.close();78 通常管道流不會直接讀寫,而使用裝飾流來進行封裝PrintStream p = new P

52、rintStream( pos );p.println(“hello”);DataInputStream d=new DataInputStream(pis);d.readLine();printStream DataInputStream79 標準輸入/輸出 中文信息讀寫 隨機文件讀寫80在java 中: “標準輸入”是System.in對象, “標準輸出”是System.out 對象, “標準錯誤輸出” 是System.err對象。 每當main方法被執(zhí)行時,就自動生成上述三個對象 System.out和System.err已預封裝成一個PrintStream對象,能直接使用。 Syste

53、m.in是一個原始的InputStream,未進行任何封裝處理,必須事先封裝System.in,否則不能從中讀取數(shù)據(jù)。例如:我們希望用readLine()每次從標準輸入中讀取一行輸入信息,然后顯示出來,就需要將System.in封裝到一個DataInputStream或者BufferedReader中。8182標準I/O重新導向: setIn(InputStream):設置標準輸入流 setOut(PrintStream):設置標準輸出流 setErr(PrintStream) :設置標準錯誤輸出流如果突然要在屏幕上生成大量輸出,而且滾動的速度快于人們的閱讀速度,輸出的重定向就顯得特別有用。在

54、一個命令行程序中,如果想重復測試一個特定的用戶輸入序列,輸入的重定向也顯得特別有價值。83class Redirecting/ Throw exceptions to console:public static void main(String args) throws IOExceptionBufferedInputStream in = new BufferedInputStream (new FileInputStream(/get.txt);PrintStream out = new PrintStream(new BufferedOutputStream(new FileOutput

55、Stream(/put.txt);System.setIn(in);System.setOut(out);System.setErr(out);BufferedReader br = new BufferedReader( new InputStreamReader(System.in);String s;while (s = br.readLine() != null)System.out.println(s); out.close(); / Remember this! /:84InputStream/OutputStream是處理8位的流,Reader/Writer是處理16位的流。Ja

56、va中,byte是8位的,char是16位的,中文需要用Reader/Writer讀寫。但很多時候需要把兩種庫類結(jié)合起來用例如:英文dos窗口的字符集是ISO-Latin-1,如果要從英文dos窗口讀入中文輸入,就需要把System.in適配到Reader: InputStreamReader isr=new InputStreamReader(System.in); isr. readxxx(.);85 隨機文件讀寫 對于很多場合,例如銀行系統(tǒng)、實時銷售系統(tǒng),要求能夠迅速、直接地訪問文件中的特定信息,而無需查找其他的記錄。這種類型的即時訪問可能要用到隨機存取文件和數(shù)據(jù)庫 隨機文件的應用程序必

57、須指定文件的格式。最簡單的是要求文件中的所有記錄均保持相同的固定長度。利用固定長度的記錄,程序可以容易地計算出任何一條記錄相對于文件頭的確切位置 隨機訪問文件允許對文件的內(nèi)容進行非順序的訪問(non-sequential (random) read-write access),可以直接跳到文件中指定的位置 86隨機訪問示意圖100bytes100bytes100bytes100bytes100bytes100bytes0100200300400500byte offsets87 Java.io包提供了RandomAccessFile類用于隨機文件的創(chuàng)建和訪問 RandomAccessFile的

58、功能: 可跳轉(zhuǎn)到文件的任意位置讀/寫數(shù)據(jù) 可在隨機文件中插入數(shù)據(jù),而不破壞該文件的其他數(shù)據(jù) 有個位置指示器,指向當前讀寫處的位置。 在等長記錄格式文件的隨機讀取時有很大的優(yōu)勢,但僅限于操作文件,不能訪問其它IO設備,如網(wǎng)絡、內(nèi)存映像等88文件指針(file pointer) 剛打開文件時,文件指示器指向文件的開頭處。 常用方法: getFilePointer():得到當前的文件指針 seek(long):移動文件指針到指定的位置。 skipBytes(int n):把文件指針向前移動指定的n個字節(jié)文件文件指針(當前位置)89 構(gòu)造方法包括public RandomAccessFile(File

59、 file,String mode) throws FileNotFoundExceptionpublic RandomAccessFile(String name, String mode) throws FileNotFoundExceptionMode指定了操作模式,是隨機讀(r),還是讀寫兼施(rw)。90 RandomAccessFile(Filefile, Stringmode) RandomAccessFile(Stringname, Stringmode) r 只讀 Rw 讀寫 public void seek(longpos) throws IOException 設置文件指

60、針指向的位置,從文件開始的位置起9192JDK 1.4介紹了許多提高IO性能的過程,這里有一種IO稱為“新的IO”,主要是使用了java.nio包,該包提供了下邊幾種功能: 設置字符編碼的編碼器(encoder)和解碼器(decoder) 非阻塞IO 內(nèi)存映射文件 文件鎖Java NIO屬于文件IO的高級操作,使用該設計結(jié)構(gòu)可以完成高效的IO操作,該操作使用的更加傾向于底層的操作過程,而且Java NIO部分的API中的實現(xiàn)代碼都是C代碼,因此其完成IO的操作是很高效的 93 能夠直接從硬盤上、而不需要一字節(jié)一字節(jié)地讀寫數(shù)據(jù)塊 當你在非閱讀期間將數(shù)據(jù)從緩沖器中提出時,它處理低字節(jié)優(yōu)先問題。 可

溫馨提示

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

評論

0/150

提交評論