面向?qū)ο蟪绦蛟O(shè)計(jì)第20講 Java的輸入與輸出流(上)_第1頁
面向?qū)ο蟪绦蛟O(shè)計(jì)第20講 Java的輸入與輸出流(上)_第2頁
面向?qū)ο蟪绦蛟O(shè)計(jì)第20講 Java的輸入與輸出流(上)_第3頁
面向?qū)ο蟪绦蛟O(shè)計(jì)第20講 Java的輸入與輸出流(上)_第4頁
面向?qū)ο蟪绦蛟O(shè)計(jì)第20講 Java的輸入與輸出流(上)_第5頁
已閱讀5頁,還剩16頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

第20講Java的輸入與輸出流(上)/教學(xué)目標(biāo)理解Java中流的概念掌握字節(jié)流InputStream和OutputStream及其子類的使用掌握字符流Reader和Writer及其子類的使用掌握隨機(jī)讀寫文件流RandomAccessFile的使用

引例importjava.io.*;publicclassEx11_1{publicstaticvoidmain(Stringargs[]){try{

System.out.println("創(chuàng)建文件輸入流對(duì)象……");

FileInputStream

fis=newFileInputStream("input.txt");

System.out.println("指定輸入文件對(duì)象……");bytedata[]=newbyte[100];

System.out.println("讀入文件數(shù)據(jù)到指定數(shù)組中……");

fis.read(data);Stringstr=data.toString();

System.out.println("創(chuàng)建文件輸出流對(duì)象……");

FileOutputStream

fos=newFileOutputStream("output.txt");

System.out.println("將指定數(shù)組的內(nèi)容讀入文件中……");

fos.write(str.getBytes());

System.out.println("關(guān)閉所有文件");

fis.close(); fos.close();}catch(Exceptione){}}}本實(shí)例中主要應(yīng)用Java的輸入輸出流實(shí)現(xiàn)文件的復(fù)制。概述源

輸入流輸入流從源中讀出數(shù)據(jù)目的地輸出流

輸出流向目的地中寫入數(shù)據(jù)在JavaAPI中,I/O包提供了大量的流類來實(shí)現(xiàn)數(shù)據(jù)的輸入和輸出,主要分為兩類:一種是字節(jié)流,另一種是字符流,分別由四個(gè)抽象類來表示:InputStream、OutputStream、Reader和Writer.所有輸入流類都是InputStream類或者Reader類的子類,它們都繼承了read()方法用于讀取數(shù)據(jù)。而所有輸出流類都是OutputStream類或者Writer類的子類,它們都繼承了write()方法用于寫入數(shù)據(jù)。InputStream/OutputStream和Reader/Writer都直接繼承自Java的根類Object,它們各自形成一個(gè)獨(dú)立的繼承體系。

字節(jié)流字節(jié)流用來讀寫8位的數(shù)據(jù)。由于在讀寫中不會(huì)對(duì)數(shù)據(jù)作任何轉(zhuǎn)換,所以可以用來直接處理二進(jìn)制的數(shù)據(jù)。字節(jié)流分為輸入流InputStream和輸出流OutputStream,所有其他的字節(jié)流都是它們的子類。

字節(jié)輸入流InputStream成員方法主要功能publicabstractintread()throwsIOException自輸入流中讀取一個(gè)字節(jié)publicintread(byteb[])throwsIOException將輸入的數(shù)據(jù)存放在指定的字節(jié)數(shù)組publicintread(byteb[],intoffset,intlen)throwsIOException自輸入流中的offset位置開始讀取len個(gè)字節(jié)并存放在指定的數(shù)組b中publicvoidreset()throwsIOException將讀取位置移至輸入流標(biāo)記之處publiclongskip(longn)throwsIOException從輸入流中跳過n個(gè)字節(jié)publicintavailable()throwsIOException返回輸入流中的可用字節(jié)個(gè)數(shù)publicvoidmark(intreadlimit)在輸入流當(dāng)前位置加上標(biāo)記publicbooleanmarkSupported()測(cè)試輸入流是否支持標(biāo)記(mark)用的所有資源publicvoidclose()throwsIOException關(guān)閉輸入流,

并釋放占用的所有資源字節(jié)輸出流OutputStream類成員方法主要功能publicabstractvoidwrite(intb)throwsIOException寫一個(gè)字節(jié)publicvoidwrite(byteb[])throwsIOException寫一個(gè)字節(jié)數(shù)組publicvoidwrite(byteb[],int

offset,int

len)throwsIOException將字節(jié)數(shù)組b中從offset位置開始的、長(zhǎng)度為len個(gè)字節(jié)的數(shù)據(jù)寫到輸出流中publicvoidflush()throwsIOException寫緩沖區(qū)內(nèi)的所有數(shù)據(jù)publicvoidclose()throwsIOException關(guān)閉輸出流,并釋放占用的所有資源標(biāo)準(zhǔn)輸入流標(biāo)準(zhǔn)輸入:InputStreamis=System.in;

它是一個(gè)標(biāo)準(zhǔn)輸入流,一般接收鍵盤的響應(yīng),得到鍵盤所傳遞來的信息。例11.2下面程序可以從鍵盤輸入字符到程序中,并在屏幕上重新打印出來。importjava.io.*;classEx11_2{publicstaticvoidmain(Stringargs[])throwsIOException{

bytebuf[]=newbyte[255];

System.out.println("enter:");

System.in.read(buf,0,255);

System.out.println("Got:");

Stringstr=newString(buf);

System.out.println(str);

}}例11.3編程實(shí)現(xiàn)從鍵盤讀入若干字符,然后顯示出來。importjava.io.*;publicclassEx11_3{publicstaticvoidmain(Stringargs[])throwsIOException{

intb;while((b=System.in.read())!=-1){

System.out.print((char)b);}

System.out.println();}}文件字節(jié)輸入流類FileInputStreamInputStream類和OutputStream類都是抽象類,不能實(shí)例化,因此在實(shí)際應(yīng)用中并不使用這兩個(gè)類,而是使用一些基本數(shù)據(jù)流類,如FileInputStream和FileOutputStream,它們分別是InputStream類和OutputStream類的子類,用于進(jìn)行文件輸入和輸出的處理,其數(shù)據(jù)源和目標(biāo)都是文件。FileInputStream用于順序訪問本地文件。它從超類InputStream中繼承了read、close等方法對(duì)本機(jī)上的文件進(jìn)行操作,但不支持mark方法和reset方法。

FileInputStream類構(gòu)造方法FileInputStream類主要有三個(gè)構(gòu)造方法:FileInputStream(Stringname)FileInputStream(Filefile)FileInputStream(FileDescriptor

fd)第一個(gè)構(gòu)造方法使用給定的文件名name創(chuàng)建一個(gè)FileInputStream對(duì)象,用來打開一個(gè)到達(dá)該文件的輸入流,這個(gè)文件就是源。第二個(gè)構(gòu)造方法使用File對(duì)象FileInputStream對(duì)象,用來指定要打開哪個(gè)文件。FileDescriptor也是java.io包中的類,主要用于關(guān)聯(lián)到已打開的文件,或已打開的網(wǎng)絡(luò)鏈接,或者其他I/O連接,在機(jī)器底層發(fā)揮作用,可以強(qiáng)制系統(tǒng)緩沖區(qū)與底層設(shè)備保持同步,從而為輸入輸出流提供一個(gè)與底層設(shè)備同步的系統(tǒng)緩沖區(qū),但是這個(gè)類不大常用,大家只要了解就可以了。FileInputStream類讀取字節(jié)的方法在創(chuàng)建文件輸入流對(duì)象之后,可以調(diào)用read方法從流中讀取字節(jié),read方法有三種格式:publicintread()throwsIOExceptionpublicintread(byte[]b,int

off,int

len)throwsIOException

publicintread(byte[]b)throwsIOExceptionread()方法將返回一個(gè)整數(shù),它包含了流中的下一個(gè)字節(jié)。如果返回的是-1,則表示到達(dá)了文件輸入流的末尾。這種方法每次只能從文件輸入流中讀取一個(gè)字節(jié),為了能從流中讀入多個(gè)數(shù)據(jù)字節(jié),可以調(diào)用read(byteb[],int

off,int

len)方法,該方法從輸入流當(dāng)前字節(jié)處起讀取長(zhǎng)度為len字節(jié)的數(shù)據(jù),從位置off處起存入數(shù)組b中,b中位置在off之前和在off+len之后的數(shù)據(jù)將保持不變,返回讀取的數(shù)據(jù)長(zhǎng)度,并將第len個(gè)字節(jié)設(shè)為當(dāng)前字節(jié)。

Stringstr="";FileInputStreamfin=newFileInputStream("c:\\Ex11_3.java");for(inti=fin.read();i!=-1;i=fin.read())

str+=(char)i;上述程序段的功能是應(yīng)用read()方法將c:\Ex11_3.java的內(nèi)容輸出到字符串str中。

try{

FileInputStream

fis=newFileInputStream("java7.txt");......}catch(IOExceptione){

System.out.println("FileException:"+e);}FileInputStream舉例在使用FileInputStream類時(shí)要注意:若關(guān)聯(lián)的目錄或者文件不存在,Java就會(huì)拋出一個(gè)IOException異常。程序可以使用try-catch塊檢測(cè)和處理捕捉到的異常。例如,為了把一個(gè)文件輸入流對(duì)象與一個(gè)文件關(guān)聯(lián)起來,可以使用下列的代碼段來處理Java產(chǎn)生的IOEception異常。關(guān)閉輸入流

publicvoidclose()

throwsIOException

雖然Java在程序結(jié)束時(shí)會(huì)自動(dòng)關(guān)閉所有打開的流,但還是建議大家養(yǎng)成一個(gè)良好的習(xí)慣,在使用完流后,調(diào)用close()方法顯式地關(guān)閉任何打開的流,以防止一個(gè)被打開的流用完系統(tǒng)資源。文件字節(jié)輸出流類FileOutputStreamFileOutputStream類用于向一個(gè)文本文件寫數(shù)據(jù),它從其超類OutputStream中繼承了write、close等方法。

構(gòu)造方法publicFileOutputStream(Stringname)throwsFileNotFoundExceptionpublicFileOutputStream(Filefile)throwsFileNotFoundExceptionpublicFileOutputStream(String

name,booleanappend)throwsFileNotFoundExceptionappend表示文件是否為添加的寫入方式。當(dāng)append值false時(shí),為重寫方式,即從頭寫入;當(dāng)append值為true時(shí),為添加方式,即從尾寫入。append默認(rèn)值為false。例如:

FileOutputStream

fos=newFileOutputStream("OutputFile.txt",true);FileOutputStream類寫入字節(jié)的方法使用write方法將指定的字節(jié)寫入文件輸出流。Write方法有3種格式:publicvoidwrite(intb)throwsIOExceptionpublicvoidwrite(byte[]b)throwsIOExceptionpublicvoidwrite(byte[]b,int

off,int

len)throwsIOExceptionwrite方法可以向文件寫入一個(gè)字節(jié)、一個(gè)字節(jié)數(shù)組或一個(gè)字節(jié)數(shù)組的一部分。當(dāng)b是int類型時(shí),b占用4個(gè)字節(jié)32位,通常是把b的低8位寫入輸出流,忽略其余高24位。當(dāng)b是字節(jié)數(shù)組時(shí),可以寫入從off位置開始的len個(gè)字節(jié),如果沒有off和len參數(shù),則寫入所有字節(jié),相當(dāng)于write(b,0,b.length)。關(guān)閉輸出流publicvoidclose()

throwsIOExceptionclose方法關(guān)閉輸出流,并釋放相關(guān)的系統(tǒng)資源。發(fā)生I/O錯(cuò)或文件關(guān)閉時(shí),拋出IOException異常。如果off或len為負(fù)數(shù)或off+len大于數(shù)組b的長(zhǎng)度length,則拋出IndexOutOfBoundsException異常;如果b是空數(shù)組,則拋出NullPointerException異常。用FileOutputStream對(duì)象寫入時(shí),如果文件不存在,則會(huì)創(chuàng)建一個(gè)新文件,如果文件已存在,使用重寫方式

則會(huì)覆蓋原有數(shù)據(jù)。

例11.4

編寫程序,應(yīng)用FileInputStream類實(shí)現(xiàn)從"c:\file.dat"中讀出第5個(gè)字節(jié)到變量c中,并輸出。

importjava.io.*;publicclassEx11_4{publicstaticvoidmain(Stringargs[]){try{

FileInputStream

fis=newFileInputStream("c:\\file.dat");fis.skip(4);

intc=fis.read();

System.out.println((char)c);

fis.close();}catch(Exceptione){

e.printStackTrace();}} }內(nèi)存的讀寫在java.io中,還提供了ByteArrayInputStream和ByteArrayOutputStream類來直接訪問內(nèi)存,它們分別是InputStream和OutputStream的子類。類ByteArrayInputStream有兩個(gè)構(gòu)造方法:

publicByteArrayInputStream(byteb[])publicByteArrayInputStream(byte

b[],int

off,int

len)第一個(gè)構(gòu)造方法以一個(gè)字節(jié)數(shù)組作為參數(shù),數(shù)據(jù)源完全復(fù)制到內(nèi)部緩沖區(qū)。第二個(gè)構(gòu)造方法的參數(shù)包括一個(gè)字節(jié)數(shù)組、一個(gè)整型偏移量和一個(gè)整型長(zhǎng)度,與第一個(gè)構(gòu)造方法不同的是,此構(gòu)造方法生成的內(nèi)部緩沖區(qū)將以指定偏移量位置為起始位置,并且能讀取的最大數(shù)據(jù)長(zhǎng)度為指定的長(zhǎng)度。這個(gè)字節(jié)數(shù)組就是該輸入流的數(shù)據(jù)源。內(nèi)存緩沖區(qū)保持一個(gè)標(biāo)記,指向當(dāng)前字節(jié)。ByteArrayInputStream類ByteArrayInputStream可從字節(jié)數(shù)組中讀取數(shù)據(jù),它重寫了其父類InputStream的部分方法,如:publicintread();publicintread(byteb[],int

off,int

len);publiclongskip(longn)publicintavailable();publicboolean

markSupported();publicvoidmark(inttag);publicvoidreset();publicvoidclose()throwsIOExceptionByteArrayOutputStream

類與ByteArrayInputStream對(duì)應(yīng),ByteArrayOutputStream

溫馨提示

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

評(píng)論

0/150

提交評(píng)論