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

下載本文檔

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

文檔簡介

第十章輸入輸出流輸入/輸出概述目錄和文件的管理文件的順序訪問文件的隨機(jī)訪問輸入/輸出概述流的概念java.io包字節(jié)流標(biāo)準(zhǔn)輸入輸出字符流流的概念所謂流是指同一臺計算機(jī)或網(wǎng)絡(luò)中不同計算機(jī)之間有序運(yùn)動著的數(shù)據(jù)序列。Java把這些不同來源和目標(biāo)的數(shù)據(jù)都統(tǒng)一抽象為數(shù)據(jù)流。數(shù)據(jù)流可分為輸入流和輸出流流式輸入輸出的特點是數(shù)據(jù)的獲取和發(fā)送沿數(shù)據(jù)序列的順序進(jìn)行,即每一個數(shù)據(jù)都必須等待排在它前面的數(shù)據(jù),等前面的數(shù)據(jù)讀入或送出之后才能被讀寫java.io包Java語言中提供了比較完善的處理輸入輸出數(shù)據(jù)的功能,實現(xiàn)這些I/O操作的類和接口都在java.io包中。java.lang.ObjectOutputStreamReaderWriterFileRandomAccessFileInputStreamjava.io包從功能上分輸入流和輸出流輸入流:讀取數(shù)據(jù)時與數(shù)據(jù)源之間建立的數(shù)據(jù)通道;輸出流:輸出數(shù)據(jù)時與數(shù)據(jù)宿之間建立的數(shù)據(jù)通道。從流結(jié)構(gòu)上可分為字節(jié)流和字符流字節(jié)流:主要用在處理二進(jìn)制數(shù)據(jù),按字節(jié)來處理字符流:是以字符為單位進(jìn)行輸入輸出處理的流字節(jié)流字節(jié)流的輸入流和輸出流基礎(chǔ)是InputStream和OutputStream這兩個抽象類,由此派生出若干輸入輸出流類,類關(guān)系如下:字節(jié)流InputStream類InputStream類是個抽象類,作為字節(jié)輸入流的直接或間接的父類,它定義了許多有用的、所有子類必須的方法,包括讀取、移動指針、標(biāo)記、復(fù)位、關(guān)閉等方法。這些方法大多可能拋出IOException異常。Abstractintread():讀取一個字節(jié)數(shù)據(jù),并返回讀到的數(shù)據(jù)。Intread(byte[]b):將數(shù)據(jù)讀入一個字節(jié)數(shù)組。同時返回實際讀取的字節(jié)數(shù)。Intread(byte[]b,intoff,intlen):將數(shù)據(jù)讀入一個字節(jié)數(shù)組,同時返回實際讀取的字節(jié)數(shù)。Longship(longn):在輸入流中跳過n個字節(jié),并返回實際跳過的字節(jié)數(shù);Intavailable():返回在不發(fā)生阻塞的情況下,可讀取的字節(jié)數(shù);Voidclose():關(guān)閉輸入流;Voidmark(intreadlimit):在輸入流的當(dāng)前位置放置一個標(biāo)記;Voidreset():返回到上一個標(biāo)記;BooleanmarkSupported():測試當(dāng)前的流是否支持mark和reset方法。字節(jié)流OutputStream類OutputStream類也是抽象類,作為字節(jié)輸出流的直接或間接的父類,當(dāng)程序需要向外部設(shè)備輸出數(shù)據(jù)時,需要創(chuàng)建OutputStream的某一個子類的對象來完成。Abstractvoidwrite(intb):往輸出流中寫入一個字節(jié)。voidwrited(byte[]b):往輸出流中寫入數(shù)組b中所有字節(jié)。Voidwrite(byte[]b,intoff,intlen):往輸出流中寫入數(shù)組b中從偏移量off開始的len個字節(jié)的數(shù)據(jù)。Voidflush():刷新輸出流,強(qiáng)制緩沖區(qū)中的輸出字節(jié)被寫出。Voidclose():關(guān)閉輸出流,釋放和這個流相關(guān)的資源。標(biāo)準(zhǔn)輸入輸出Java語言的系統(tǒng)類System有三個類變量in、out和err分別表示標(biāo)準(zhǔn)輸入、標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯誤輸出流,標(biāo)準(zhǔn)輸入設(shè)備是鍵盤,標(biāo)準(zhǔn)輸出設(shè)備是終端顯示器,標(biāo)準(zhǔn)錯誤輸出設(shè)備也是顯示器。System類的類變量in表示標(biāo)準(zhǔn)輸入流,可以使用InputStream類的read()和skip(longn)等方法來從輸入流獲得數(shù)據(jù)System類的類變量out表示標(biāo)準(zhǔn)輸出流,可以使用PrintStream類的print()和println()等方法來輸出數(shù)據(jù),這兩個方法支持Java的任意基本類型作為參數(shù)。System類的類變量err表示標(biāo)準(zhǔn)錯誤輸出流,與out使用類似,標(biāo)準(zhǔn)錯誤輸出不能重定向。字符流字符流為從Reader和Writer派生出的一系列類,這類流以16位的Unicode碼表示的字符為基本處理單位目錄和文件的管理在Java語言中,使用抽象路徑等概念,保證了平臺無關(guān)性,java.io包中的提供了與具體平臺無關(guān)的方式來描述目錄和文件對象的屬性功能。在Java中,目錄也被當(dāng)作File使用,File類的對象表示了磁盤上的文件或目錄。通過調(diào)用File類提供的各種方法,能夠創(chuàng)建、刪除文件,重命名文件,判斷文件的讀寫權(quán)限及是否存在,設(shè)置和查詢文件的最近修改時間。File類File類有三個構(gòu)造函數(shù):①publicFile(Stringpathname):創(chuàng)建一個對應(yīng)于參數(shù)pathname的File類對象。參數(shù)pathname是包含目錄和文件名的字符串。如果沒有文件名,則代表目錄。②publicFile(Stringparent,Stringchild):該構(gòu)造函數(shù)將pathname分成兩部分parent和child,參數(shù)parent表示目錄或文件所在路徑,參數(shù)child表示目錄或文件名稱。③publicFile(Fileparent,Stringchild):該構(gòu)造函數(shù)與上面一個的不同之處,在于將parent的參數(shù)類型由String變?yōu)镕ile,代表parent是一個已經(jīng)創(chuàng)建了的File類文件對象(指向目錄)。File類File類的常用方法:publicbooleancanWrite():返回文件是否可寫。publicbooleancanRead():返回文件是否可讀。publicbooleancreateNewFile():當(dāng)文件不存在時創(chuàng)建文件。publicbooleandelete():從文件系統(tǒng)內(nèi)刪除該文件。publicvoiddeleteOnExit():程序順利結(jié)束時從系統(tǒng)中刪除文件。publicbooleanexists():判斷文件是否存在。publicFilegetAbsoluteFile():以File類對象形式返回文件的絕對路徑。publicStringgetAbsolutePath():以字符串形式返回文件的絕對路徑。publicStringgetName():以字符串形式返回文件名稱。publicStringgetParent():以字符串形式返回文件父目錄路徑。publicStringgetPath():以字符串形式返回文件的相對路徑。publicFilegetParentFile():以File類對象形式返回文件父目錄的路徑。publicbooleaisFile():判斷該File對象所對應(yīng)的是否是文件。publiclonglastModified():返回文件的最后修改時間。publicintlength():返回文件長度。publicbooleanmkdir():在當(dāng)前目錄下生成指定的目錄。publicbooleansetReadOnly():將文件設(shè)置為只讀。publicStringtoString():將文件對象的路徑轉(zhuǎn)換為字符串返回。importjava.io.*;importjava.util.Date;publicclassfiletest{publicstaticvoidmain(String[]args){Stringfilename="d:\\javapj\\ex.java";Filemyfile=newFile(filename);if(!myfile.exists()){System.err.println(filename+"未找到!");return;}if(myfile.isDirectory()){System.err.println("文件對象"+myfile.getName()+"是目錄!");Fileds=newFile("mydata");if(!ds.exists()){ds.mkdir();System.out.println("目錄"+ds.getAbsolutePath()+"創(chuàng)建結(jié)束!");}return; }if(myfile.isFile()){System.out.println("文件對象:"+myfile.getAbsolutePath());System.out.println("文件字節(jié)數(shù):"+myfile.length());System.out.println("文件是否能讀:"+myfile.canRead());if(myfile.canWrite()){System.out.println("設(shè)置文件為只讀:"+myfile.setReadOnly());}System.out.println("文件是否可寫:"+myfile.canWrite());Datefd=newDate(myfile.lastModified());System.out.println("文件上次修改時間:"+fd.toString());}}}文件的順序訪問FileInputStream和FileOutputStreamDataInputStream和DataOutputStreamBufferedInputStream和BufferedOutputStreamFileInputStream和FileOutputStreamFileInputStream類和FileOutputStream類的構(gòu)造函數(shù)是創(chuàng)建一個輸入輸出的對象,通過引用該對象的讀寫方法,來完成對文件的輸入輸出操作。FileInputStream類構(gòu)造方法FileInputStream(Stringname)FileInputStream(Filefile)從FileInputStream流中讀取字節(jié)信息,一般用read()成員方法,該方法有重載:intread()intread(byteb[])intread(byteb[],intoff,intlen)FileOutputStream類的構(gòu)造方法FileOutputStream(Stringname)FileOutputStream(Filefile)向FileOutputStream中寫入信息,一般用write()方法,該方法有重載:voidwrite(intb)voidwrite(byteb[])voidwrite(byteb[],intoff,intlen)接收用戶從鍵盤輸入的數(shù)據(jù),回車后保存到文件test.txt中。若用戶輸入符號#,則退出程序。importjava.io.*;publicclassWriteFile{ publicstaticvoidmain(Stringargs[]) { bytebuffer[]=newbyte[128]; System.out.println("請輸入數(shù)據(jù),回車后保存到文件test.txt"); System.out.println("輸入#則退出!"); try{ FileOutputStreamf=newFileOutputStream("test.txt"); while(true){ intn=System.in.read(buffer); if(buffer[0]=='#') break; f.write(buffer,0,n); f.write('\n'); } f.close(); }catch(IOExceptione) {System.out.println(e.toString()); }}}當(dāng)完成一個文件的FileInputStream和FileOutputStream操作時,可用兩種方法關(guān)閉它:顯式關(guān)閉和隱式關(guān)閉。隱式關(guān)閉是利用Java自動垃圾回收的功能讓系統(tǒng)自動關(guān)閉它,顯式關(guān)閉是使用close()方法。DataInputStream和DataOutputStreamDataInputStream和DataOutputStream分別實現(xiàn)了java.io包中的DataInput和DataOutput接口,能夠讀寫Java基本數(shù)據(jù)類型的數(shù)據(jù)和Unicode編碼格式的字符串。這樣,在輸入輸出數(shù)據(jù)時就不必關(guān)心該數(shù)據(jù)究竟包含幾個字節(jié)了。

DataInputStream類和DataOutputStream類是從過濾流類繼承過來,這兩個流的對象均不能獨立地實現(xiàn)數(shù)據(jù)的輸入和輸出處理,必須與其他輸入流與輸出流對象一起使用,才能實現(xiàn)不同類型數(shù)據(jù)的讀寫。在當(dāng)前目錄下建立文件data.DAT,存儲阿拉伯?dāng)?shù)字0-9,共10個數(shù)。從文件中讀取上述數(shù)據(jù)并顯示到屏幕上。importjava.io.*;classDataTest{publicstaticvoidmain(Stringargs[]){try{//創(chuàng)建字節(jié)文件輸出流

OutputStreamfos=newFileOutputStream("data.bat"); DataOutputStreamdos=newDataOutputStream(fos); for(inti=0;i<10;i++){dos.writeInt(i);} fos.close();//關(guān)閉文件輸出流

}catch(Exceptione){System.out.println("Exception:"+e);}System.out.println("文件創(chuàng)建成功!");try{ FileInputStreamfis=newFileInputStream("data.bat");//創(chuàng)建輸入流

DataInputStreamdis=newDataInputStream(fis);//創(chuàng)建數(shù)據(jù)輸入流

for(inti=0;i<10;i++){System.out.printf("%5d",dis.readInt());} fis.close();//關(guān)閉文件輸入流

}catch(Exceptione){System.out.println("Exception:"+e);}}}BufferedInputStream和BufferedOutputStream緩沖流BufferedInputStream和BufferedOutputStream類操作數(shù)據(jù)時,需要先將數(shù)據(jù)讀寫到緩沖區(qū)中,這樣可以提高文件流的操作效率。若要創(chuàng)建一個BufferedOutputStream流對象,首先需要一個FileOutputStream流對象,然后基于這個流對象創(chuàng)建緩沖流對象。當(dāng)寫滿緩沖區(qū)或關(guān)閉輸出流時,一次性輸出到流,或者用flush()方法主動將緩沖區(qū)輸出到流。輸入/輸出流圖解InputStream

流程從文件中獲取輸入字節(jié)增加緩沖的功能增加讀取Java基本數(shù)據(jù)的功能InputStream流程

輸出流寫入基本數(shù)據(jù)類型寫入數(shù)據(jù)緩沖區(qū)將數(shù)據(jù)寫入文件文件FileInputStreamBufferedIputStreamDataInputStream數(shù)據(jù)DataOutputStreamBufferedIputStreamFileInputStream數(shù)據(jù)文件要求緩沖流往當(dāng)前目錄下的1.txt文件中寫入字節(jié)、整型、字符型和浮點型的數(shù)據(jù),并輸出到屏幕上mportjava.io.*;classDataStreamTest{publicstaticvoidmain(String[]args)throwsException{ FileOutputStreamfos=newFileOutputStream("1.txt"); BufferedOutputStreambos=newBufferedOutputStream(fos); DataOutputStreamdos=newDataOutputStream(bos); byteb=3;inti=78;charch='a';floatf=4.5f; dos.writeByte(b); dos.writeInt(i); dos.writeChar(ch); dos.writeFloat(f); dos.close(); FileInputStreamfis=newFileInputStream("1.txt"); BufferedInputStreambis=newBufferedInputStream(fis); DataInputStreamdis=newDataInputStream(bis); System.out.println(dis.readByte()); System.out.println(dis.readInt()); System.out.println(dis.readChar()); System.out.println(dis.readFloat()); dis.close(); }}文件的隨機(jī)訪問完成隨機(jī)文件讀寫的類與Java中大部分的輸入輸出流類不同,沒有針對輸入、輸出對應(yīng)出現(xiàn)兩個相應(yīng)的類,它是由java.lang.Object直接繼承而來的,僅使用一個RandomAccessFile類來完

溫馨提示

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

最新文檔

評論

0/150

提交評論