Java程序設計項目案例化教程課件:IO流處理_第1頁
Java程序設計項目案例化教程課件:IO流處理_第2頁
Java程序設計項目案例化教程課件:IO流處理_第3頁
Java程序設計項目案例化教程課件:IO流處理_第4頁
Java程序設計項目案例化教程課件:IO流處理_第5頁
已閱讀5頁,還剩26頁未讀 繼續免費閱讀

下載本文檔

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

文檔簡介

Java面向對象程序設計I/O流處理教學內容及教學目標了解什么是流了解流的特點/如掌握流輸入與輸出掌握不同種類的流的使用流的概念流是一個用于計算機中進行數據傳輸的機制,就像水管里的水流,在水管的一端供水,而在水管的另一端看到是一股連續不斷的水流。程序離不開數據的輸入輸出,例如從鍵盤讀取數據,向顯示器輸出數據,向文件中寫入、讀取數據,以及通過網絡進行數據的輸入輸出等。這些都涉及到流的運用。Java程序通過流來完成輸入/輸出讀寫數據,Java中流的實現相關的類是在java.io包中。流的特點Java程序利用流來實現輸出與輸入,而流又有一些特點,I/O流具有的特點:1、流必須有源端和目的端2、可以是磁盤文件,可以是鍵盤、顯示器等物理設備,可以是internet上的某個url地址。3、數據有兩個輸出方向,以程序為核心,數據從外端流向程序成為輸入流,把數據從程序流向外部源的流叫做輸出流。流的分類I/O流有很多種,按照不同的分類方式,可以分為以下3類:1、

按照數據傳輸的的方向,可以分為輸入流和輸出流。以程序為核心,數據是流向程序,為輸入流;數據是從程序流出去的,為輸出流。2、

按照數據傳輸的單位的不同,來劃分:分為字節流和字符流。字節流以字節為單位進行數據的讀寫,字符流以字符為單位進行數據的讀寫。從讀與寫的效率問題看,字符流要比字節流效率高。

字節流字符流輸入流InputStreamReader輸出流OutputStreamWriter3、按照功能不同,分為節點流和處理流節點流是直接與數據源相連,讀入或讀出的流(如:FileReader和FileWriter),但是直接使用節點流,讀寫不方便;處理流是與節點流一塊使用,在節點流的基礎上,再套接一層,是“連接”在已經存在的流(節點流或處理流)之上,通過對數據的處理為程序提供更為強大的讀寫功能。字節流與字符流可以相互轉換,從字節流到字符流可以通過InputStreamReader、OutputStreamWrite類來實現;從字符流到字節流可以從字符流中獲取char[]數組,轉換為String,然后調用String的API函數getBytes()獲取到byte[],然后就可以通過ByteArrayInputStream、ByteArrayOutputStream來實現到字節流的轉換。字節流和字符流不管是字節流還是字符流的操作,本身都表示資源操作,而執行所有的資源操作都會按照如下的幾個步驟進行,下面以文件操作為例(對文件進行讀、寫操作):1、要操作的是如果文件,那么首先要通過File類對象找到一個要操作的文件路徑(路徑有可能存在,有可能不存在,如果不存在,則要創建路徑);2、通過字節流或字符流的子類為字節流或字符流的對象實例化;3、執行讀/寫操作;4、最后一定要關閉操作的資源(close()),不管日后如何操作,資源永遠要關閉。.1字節流字節流由兩個類層次結構定義。在頂層有兩個抽象類:InputStream和OutputStream。每個抽象類都有多個具體的子類,這些子類對不同的外設進行處理,例如磁盤文件,網絡連接,甚至是內存緩沖區。表7.1:字節流流的名稱流的作用BufferedInputStream緩沖輸入流BufferedOutputStream緩沖輸出流ByteArrayInputStream從字節數組讀取的輸入流ByteArrayOutputStream向字節數組寫入的輸出流DataInputStream包含讀取Java標準數據類型方法的輸入流DataOutputStream包含編寫Java標準數據類型方法的輸出流FileInputStream讀取文件的輸入流FileOutputStream寫文件的輸出流FilterInputStream實現InputStreamFilterOutputStream實現OutputStreamInputStream描述流輸入的抽象類OutputStream描述流輸出的抽象類PipedInputStream輸入管道PipedOutputStream輸出管道PrintStream包含print()和println()的輸出流PushbackInputStream支持向輸入流返回一個字節的單字節的“unget”的輸入流RandomAccessFile支持隨機文件輸入/輸出SequenceInputStream兩個或兩個以上順序讀取的輸入流組成的輸入流7.2.2String類字節流以FileOutputStream和FileInputStream來舉例對于OutputStream類而言發現其本身定義的是一個抽象類(abstractclass),按照抽象類的使用原則來講,需要定義抽象類的子類,而現在如果要執行的是文件操作,則可以使用FileOutputStream子類完成。FileOutputStream類的構造方法:表7.2FileOutputStream構造方法FileOutputStream類之中定義了三個方法,如下表所示:表7.3FileOutputStream類的方法構造方法主要功能publicFileOutputStream(Filefile)throwsFileNotFoundException創建文件輸出流以寫入由指定的File對象表示的文件publicFileOutputStream(Filefile,booleanappend)throwsFileNotFoundException創建文件輸出流以寫入由指定的File對象表示的文件。如果第二個參數是true,則字節將被寫入文件的末尾而不是開頭方法主要功能voidwrite(intb)將指定字節寫入此文件輸出流voidwrite(byte[]b)將b.length個字節從指定byte數組寫入此文件輸出流中voidwrite(byte[]b,intoff,intlen)將指定byte數組中從偏移量off開始的len個字節寫入此文件輸出流【例7-1】:通過案例來掌握FileOutputStream的使用importjava.io.File;importjava.io.FileInputStream;importjava.io.FileOutputStream;publicclassDemo7_01{ publicstaticvoidmain(String[]args){//主方法 Filefile=newFile("Demo7_1.txt");//創建文件對象 try{//捕捉異常 //創建FileOutputStream對象 FileOutputStreamout=newFileOutputStream(file); //創建byte型數組 bytebuy[]="你好,FileOutputStream案例已成功實現。".getBytes(); out.write(buy);//將數組中信息寫入到文件中 out.close();//將流關閉 System.out.print("請到該項目目錄下查詢Demo7_1.txt文件"); }catch(Exceptione){//catch語句處理異常信息 e.printStackTrace();//輸出異常信息 }

}}程序運行的結果:打開Demo7_1.txt文件FileInputStream是Java語言中抽象類InputStream用來具體實現類的創建對象。FileInputStream可以從文件系統中的某個文件中獲得輸入字節,獲取的文件可用性取決于主機環境。FileInputStream的構造方法需要指定文件的來源,通過打開一個到實際文件的連接來創建一個FileInputStream,該文件通過文件系統中的File對象file指定。FileInputStream的構造方法:表7.4FileInputStream的構造方法構造方法主要功能FileInputStream(Filefile)通過打開一個到實際文件的連接來創建一個FileInputStream對象,該文件通過文件系統中的File對象file指定。FileInputStream(Stringname)通過打開一個到實際文件的連接來創建一個FileInputStream對象,該文件通過文件系統中的路徑名name指定。

FileInputStream的常用方法如下表所示:表7.5FileInputStream的常用方法方法主要功能public

intread()從此輸入流中讀取一個數據字節public

intread(byte[]b)從此輸入流中將最多b.length個字節的數據讀入一個byte數組中public

voidclose()關閉此文件輸入流并釋放與流相關聯的任何系統資源【例7-2】通過案例來掌握FileInputStream的使用importjava.io.File;importjava.io.FileInputStream;publicclassDemo7_02{ publicstaticvoidmain(String[]args){//主方法 Filefile=newFile("Demo7_1.txt");//創建文件對象 try{ //創建FileInputStream類對象 FileInputStreamin=newFileInputStream(file); bytebyt[]=newbyte[1024];//創建byte數組 intlen=in.read(byt);//從文件中讀取信息 //將文件中信息輸出 System.out.println("文件中的信息是:"+newString(byt,0,len)); in.close();//關閉流 }catch(Exceptione){ e.printStackTrace();//輸出異常信息 } }}程序運行的結果:字符流類字符流類由兩個類層次結構定義。頂層有兩個抽象類:Reader和Writer。這些抽象類處理統一編碼的字符流。Java中這些類含有多個具體的子類。表7.6字符流類流的名稱流的作用BufferedReader緩沖輸入字符流BufferedWriter緩沖輸出字符流CharArrayReader從字符數組讀取數據的輸入流CharArrayWriter向字符數組寫數據的輸出流FileReader讀取文件的輸入流FileWriter寫文件的輸出流FilterReader過濾讀FilterWriter過濾寫InputStreamReader把字節轉換成字符的輸入流LineNumberReader計算行數的輸入流OutputStreamWriter把字符轉換成字節的輸出流PipedReader輸入管道PipedWriter輸出管道PrintWriter包含print()和println()的輸出流PushbackReader允許字符返回到輸入流的輸入流Reader描述字符流輸入的抽象類StringReader讀取字符串的輸入流StringWriter寫字符串的輸出流Writer描述字符流輸出的抽象類字符流以FileWriter和FileReader來舉例。FileWriter類從OutputStreamWriter類繼承而來。該類按字符向流中寫入數據。可以通過以下幾種構造方法創建需要的對象。文件字符輸出流、主要用于將字符寫入到指定的打開的文件中、其本質是通過傳入的文件名、文件、或者文件描述符來創建FileOutputStream、然后使用OutputStreamWriter使用默認編碼將FileOutputStream轉換成Writer(這個Writer就是FileWriter)。 表7.7FileWriter構造方法FileWriter類的常用方法如下表: 表7.8FileWriter類的常用方法構造方法主要功能FileWriter(Filefile)在給出File對象的情況下構造一個FileWriter對象FileWriter(Filefile,booleanappend)給一個File對象構造一個FileWriter對象。如果第二個參數是true,則字節將寫入文件的末尾而不是開頭方法主要功能publicvoidwrite(intc)寫入單個字符cpublicvoidwrite(char[]c,intoffset,intlen)寫入字符數組中開始為offset長度為len的某一部分publicvoidwrite(Strings,intoffset,intlen)寫入字符串中開始為offset長度為len的某一部分【例7-3】:通過案例來掌握FileWriter的使用importjava.io.File;importjava.io.FileWriter;publicclassDemo7_03{ publicstaticvoidmain(String[]args){//主方法 Filefile=newFile("Demo7_03.txt"); try{ //創建FileWriter對象 FileWriterout=newFileWriter(file); //獲取文本域中文本 out.write("你好,FileWriter案例已成功實現。");//將信息寫入磁盤文件 out.close();//將流關閉 System.out.print("請到該項目目錄下查詢Demo7_3.txt文件"); }catch(Exceptione1){ e1.printStackTrace(); } }

}程序運行的結果:FileReader是文件字符輸入流、用于將文件內容以字符形式讀取出來、一般用于讀取字符形式的文件內容、也可以讀取字節形式、但是因為FileReader內部也是通過傳入的參數構造InputStreamReader、并且只能使用默認編碼、所以我們無法控制編碼問題、這樣的話就很容易造成亂碼。所以讀取字節形式的文件還是使用字節流來操作的好、同樣在使用此流的時候用BufferedReader包裝一下、就算沖著BufferedReader的readLine()方法去的也要使用這個包裝類、不說他還能提高效率、保護存儲介質。FileReader類的構造方法: 表7.9FileReader類的構造方法FileReader類的常用方法如表7.10所示:表7.10FileReader類的常用方法構造方法主要功能FileReader(Filefile)創建一個FileReader對象,給出File讀取FileReader(FileDescriptorfd)創建一個FileReader對象,給定FileDescriptor讀取FileReader(StringfileName)創建一個FileReader對象,給定要讀取的文件的名稱方法主要功能publicintread()讀取單個字符。返回作為整數讀取的字符,如果已達到流末尾,則返回-1publicintread(char[]cbuf)將字符讀入數組。返回讀取的字符數。如果已經到達尾部,則返回-1publicabstractintread(char[]cbuf,intoff,intlen)將字符讀入數組的某一部分。【例7-4】:通過案例來掌握FileReader的使用importjava.io.File;importjava.io.FileReader;publicclassDemo7_04{ publicstaticvoidmain(String[]args){//主方法 Filefile=newFile("Demo7_03.txt");//創建文件對象 try{ //創建FileReader對象 FileReaderin=newFileReader(file); charbyt[]=newchar[1024];//創建char型數組 intlen=in.read(byt);//將字節讀入數組 System.out.println(newString(byt,0,len)); }catch(Exceptione1){ e1.printStackTrace(); } }}程序運行的結果:文件操作類Java在應用程序設計中,除了基本的鍵盤輸入與屏幕輸出之外,最常用的就是對磁盤文件的讀寫,而File類就是專門用來處理磁盤目錄與文件的。在整個java.io包之中,File類與文件本身操作有關的類,所謂的文件本身指的是:文件的創建、刪除、重命名、取得文件大小、修改日期等。如果要想使用File類操作文件的話,那么肯定要通過構造方法實例化File類對象。 表7.11File類的構造方法構造方法主要功能publicFile(Stringpathname)通過將給定的路徑名字符串轉換為抽象路徑名來創建新的File實例。publicFile(Fileparent,Stringchild)從父抽象路徑名和子路徑名字符串創建新的File實例。

表7.12File類的常用方法方法主要功能publicStringgetName()取得文件的名稱publicbooleanisDirectory()給定的路徑是否是文件夾publicbooleanisFile()給定的路徑是否是文件publicbooleanisHidden()是否是隱藏文件publiclonglastModified()文件的最后一次修改日期publiclonglength()取得文件大小,是以字節為單位返回的publicFilegetParentFile()找到一個指定文件的父路徑publicbooleanmkdirs()創建目錄【例7-5】:通過案例來掌握File的使用importjava.io.File;publicclassDemo7_05{ publicstaticvoidmain(String[]args){//主方法 Filefile=newFile("Demo7_05.txt");//創建文件對象 if(file.exists()){//如果該文件存在 file.delete();//將文件刪除 System.out.println("文件已刪除");//輸出的提示信息 }else{//如果文件不存在 try{//try語句塊捕捉可能出現的異常 file.createNewFile();//創建該文件 System.out.println("文件已創建");//輸出的提示信息 }catch(Exceptione){//catch處理該異常 e.printStackTrace();//輸出異常信息 } } }}程序運行的結果:

緩沖流是處理流的一種,對讀寫的數據提供緩沖功能,提高了讀寫的效率。緩沖流主要包括四個類:BufferedInputStream、BufferedReader、BufferedOutputStream和BufferedWriter,本節我們主要介紹BufferedReader和BufferedWriter完成操作。緩沖流【例7-6】:通過案例來掌握BufferedReader和BufferedWriter的使用importjava.io.BufferedReader;importjava.io.BufferedWriter;importjava.io.File;importjava.io.FileReader;importjava.io.FileWriter;publicclassDemo7_06{ publicstaticvoidmain(Stringargs[]){//主方法 //定義字符串數組 Stringcontent[]={"BufferedReader","BufferedWriter","BufferedInputStream","BufferedOutputStream"}; Filefile=newFile("Demo7_06.txt");//創建文件對象 try{ FileWriterfw=newFileWriter(file);//創建FileWriter類對象 //創建BufferedWriter類對象 BufferedWriterbufw=newBufferedWriter(fw); for(intk=0;k<content.length;k++){//循環遍歷數組 bufw.write(content[k]);//將字符串數組中元素寫入到磁盤文件中 bufw.newLine();//將數組中的單個元素以單行的形式寫入文件 } bufw.close();//將BufferedWriter流關閉 fw.close();//將FileWriter流關閉 }catch(Exceptione){//處理異常 e.printStackTrace();} try{ FileReaderfr=newFileReader(file);//創建FileReader類對象 //創建BufferedReader類對象 BufferedReaderbufr=newBufferedReader(fr); Strings=null;//創建字符串對象 inti=0;//聲明int型變量 //如果文件的文本行數不為null,則進入循環 while((s=bufr.readLine())!=null){ i++;//將變量做自增運算 System.out.println("第"+i+"行:"+s);//輸出文件數據 } bufr.close();//將FileReader流關閉 fr.close();//將FileReader流關閉 }catch(Exceptione){//處理異常 e.printStackTrace();}}}程序運行的結果:數據流所謂“數據流(stream)”指的是所有數據通信通道之中,數據的起點和終點。信息的通道就是一個數據流。只要是數據從一個地方“流”到另外一個地方,這種數據流動的通道都可以稱為數據流。數據流包括DataInputStream和DataOutputStream兩個類。【例7-7】:通過案例來掌握DataInputStream和DataOutputStream的使用importjava.io.DataInputStream;importjava.io.DataOutputStream;importjava.io.FileInputStream;importjava.io.FileOutputStream;publicclassDemo7_07{ publicstaticvoidmain(String[]args){//主方法 try{ //創建FileOutputStream對象 FileOutputStreamfs=newFileOutputStream("Demo7_07.txt"); //創建DataOutputStream對象 DataOutputStreamds=newDataOutputStream(fs); ds.writeUTF("你好,DataOutputStream案例已成功實現。");//寫入磁盤文件數據 ds.close();//將流關閉 //創建FileInputStream對象 FileInputStreamfis=newFileInputStream("Demo7_07.txt"); //創建DataInputStream對象 DataInputStreamdis=newDataInputStream(fis); System.out.print(dis.readUTF());//將文件數據輸出 }catch(Exceptione){ e.printStackTrace();//輸出異常信息 } }}程序運行的結果:隨機讀寫流Java.io包提供了RandomAccessFile類用于隨機文件的創建和訪問。使用這個類,可以跳轉到文件的任意位置讀寫數據。程序可以在隨機文件中插入數據,而不會破壞該文件的其他數據。此外,程序也可以更新或刪除先前存儲的數據,而不用重寫整個文件。【例7-8】:通過案例來掌握RandomAccessFile的使用importjava.io.File;importjava.io.IOException;importjava.io.RandomAccessFile;publicclassDemo7_08{ publicstaticvoidmain(String[]args)throwsIOException{ RandomAccessFileraf=newRandomAccessFile("Demo7_08.txt","rw"); Personp1=newPerson(20,"張三"); p1.write(raf); raf.seek(0);//讀取時,將指針重置到文件的開始位置。 Personp2=newPerson(); p2.read(raf); System.out.println("age="+p2.getAge()+";name="+p2.getName()); }}classPerson{ intage;Stringname;publicPerson(){}publicPerson(intage,Stringname){ this.age=age;=name;}publicvoidwrite(RandomAccessFileraf)throwsIOException{ raf.writeInt(age);raf.writeUTF(name);}publicvoidread(RandomAccessFileraf)throwsIOException{ this.age=raf.readInt();=raf.readUTF();}publicintgetAge(){ returnage;}publicvoidsetAge(intage){ this.age=age;}publicStringgetName(){ returnname;}publicvoidsetName(Stringname){ =name;}}程序運行的結果:任務進階盡管Java提供了一個可以處理文件的IO操作類。但是沒有一個復制文件的方法。復制文件是一個重要的操作,當你的程序必須處理很多文件相關的時候。【例7-9】:通過案例來掌握文件的復制(命令行實現文件的復制)注意:本案例中的Demo7_09.txt必須是存在的文件.importjava.io.FileInputStream;importjava.io.FileNotFoundException;importjava.io.FileOutputStream;importjava.io.IOException;publicclassDemo7_09{ publicstaticvoidmain(String[]args){ FileInputStreamfis=null; FileOutputStreamfos=null; try{ //1、創建輸入流對,負責讀取,注意要先創建一個Demo7_09a.txt。 fis=newFileInputStream("Demo7_09a.txt"); //2、創建輸出流對象 fos=newFileOutputStream("Demo7_09b.txt",true); //3、創建中轉站數組,存放每次讀取的內容 byte[]words=newbyte[1024]; //4、通過循環實現文件讀取 while((fis.read())!=-1){ fis.read(words); fos.write(words,0,words.length); } System.out.println("復制完成,請查看文件!"); }catch(FileNotFoundExceptione){ e.printStackTrace(); }catch(IOExceptione){ e.printStackTr

溫馨提示

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

評論

0/150

提交評論