Java程序設(shè)計(jì)課件9第九章:文件和輸入輸出流_第1頁
Java程序設(shè)計(jì)課件9第九章:文件和輸入輸出流_第2頁
Java程序設(shè)計(jì)課件9第九章:文件和輸入輸出流_第3頁
Java程序設(shè)計(jì)課件9第九章:文件和輸入輸出流_第4頁
Java程序設(shè)計(jì)課件9第九章:文件和輸入輸出流_第5頁
已閱讀5頁,還剩70頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

《JAVA程序設(shè)計(jì)》課程1、Java文件系統(tǒng)操作

主要內(nèi)容2、字節(jié)流3、字符流Java程序設(shè)計(jì)4、轉(zhuǎn)換流1.掌握文件系統(tǒng)操作的常用類和方法《JAVA程序設(shè)計(jì)》課程

學(xué)習(xí)目標(biāo)2.掌握字節(jié)流的概念和常用操作方法3.掌握字符流的概念和常用操作方法4.掌握轉(zhuǎn)換流的概念和常用操作方法9.1.1項(xiàng)目描述《JAVA程序設(shè)計(jì)》課程

9.1文件設(shè)計(jì)一個(gè)程序,將某個(gè)目錄下的所有文件夾和文件以樹型結(jié)構(gòu)打印出來。9.1.2項(xiàng)目知識(shí)準(zhǔn)備《JAVA程序設(shè)計(jì)》課程

9.1文件(1)File類概述File類用于文件和目錄管理,可以對(duì)文件和目錄進(jìn)行列舉、刪除、新建、屬性查看、設(shè)置等操作,不能對(duì)文件的內(nèi)容進(jìn)行讀寫。使用File類時(shí)需要引入java.io包。(2)File類的構(gòu)造方法常用的File類構(gòu)造方法有3種格式:File(Stringpathname) 通過給定路徑名字符串創(chuàng)建一個(gè)新的File對(duì)象。File(Stringparent,Stringchild) 根據(jù)parent路徑名字符串和child路徑名字符串創(chuàng)建一個(gè)新的File對(duì)象。File(Fileparent,Stringchild)根據(jù)parent路徑名和child路徑名字符串創(chuàng)建一個(gè)新的File對(duì)象。File對(duì)象既可以表示一個(gè)目錄,也可以表示一個(gè)文件。下面的例子中對(duì)3個(gè)構(gòu)造函數(shù)進(jìn)行測(cè)試,分別構(gòu)造指向文件和目錄的File對(duì)象:案例9-1:File類構(gòu)造方法測(cè)試《JAVA程序設(shè)計(jì)》課程

9.1文件importjava.io.*;publicclassTest{ publicstaticvoidmain(String[]args) { Filedir1=newFile("d:");《JAVA程序設(shè)計(jì)》課程

9.1文件Filedir2=newFile("d:","test"); Filedir3=newFile(dir1,"test"); Filef1=newFile("d:\\test\\1.txt");//等價(jià)于Filef1=newFile("d:/test/1.txt"); Filef2=newFile(dir3,"1.txt"); System.out.println(dir1.getPath());//輸出構(gòu)造好的File對(duì)象的路徑 System.out.println(dir2.getPath()); System.out.println(dir3.getPath()); System.out.println(f1.getPath()); System.out.println(f2.getPath()); }輸出的結(jié)果如圖:《JAVA程序設(shè)計(jì)》課程

9.1文件圖9.1File對(duì)象的構(gòu)造方法測(cè)試(3)File類的常用方法《JAVA程序設(shè)計(jì)》課程

9.1文件(1)booleanexists() 判斷文件或目錄是否存在,存在返回true,不存在返回false。(2)StringgetName() 得到文件或目錄的名稱。(3)StringgetParent() 得到文件父目錄的名稱。(4)StringgetPath() 得到完整的相對(duì)路徑。《JAVA程序設(shè)計(jì)》課程

9.1文件(5)StringgetAbsolutePath() 得到完整的絕對(duì)路徑。為了和getPath區(qū)別,用下面的例子進(jìn)行測(cè)試: Filedir1=newFile("/test"); System.out.println(dir1.getPath()); System.out.println(dir1.getAbsolutePath()); 由于當(dāng)前路徑在D盤,所以打印結(jié)果是: \test D:\test(6)booleanisDirectory() 判斷是否為一個(gè)目錄,是則返回true,否則返回false。《JAVA程序設(shè)計(jì)》課程

9.1文件(7)booleanisFile() 判斷是否為一個(gè)文件,是則返回true,否則返回false。(8)longlength() 得到文件的長(zhǎng)度,以字節(jié)為單位。(9)booleancanRead() 判斷文件是否可讀,可讀返回true,否則返回false。(10)booleancanWrite() 判斷文件是否可寫,可寫返回true,否則返回false。(11)booleanisHidden() 該方法判斷是否為隱藏文件,是則返回true,否則返回false?!禞AVA程序設(shè)計(jì)》課程

9.1文件(12)longlastModified() 該方法得到文件最后一次修改的時(shí)間,是1970年1月1日00:00:00GMT的毫秒數(shù)。(13)booleansetReadOnly() 將文件設(shè)置為只讀。(14)booleanrenameTo(Filedest) 該方法用于修改文件名字,語法格式: fileObj.renameTo(Filedest) 重命名成功返回true,失敗返回false,該方法不能移動(dòng)文件。(15)booleandelete()該方法刪除文件或目錄,成功返回true,否則返回false。刪除目錄時(shí),要 《JAVA程序設(shè)計(jì)》課程

9.1文件保證里面沒有子目錄或子文件。(16)booleanmkdir() 創(chuàng)建此路徑名指定的目錄。成功返回true,失敗返回false。(17)booleanmkdirs()創(chuàng)建此路徑名指定的目錄,包括創(chuàng)建必需但不存在的父目錄。成功返回true,失敗返回false。(4)文件的列舉列舉文件調(diào)用用File類的list方法或listFiles方法,該方法定義如下:String[]list()返回此路徑名對(duì)應(yīng)目錄下的文件和子目錄名稱組成字符串?dāng)?shù)組。File[]listFiles()返回一個(gè)File數(shù)組,表示此目錄下的所有子目錄和文件。下面的例子演示如何列舉某個(gè)目錄下的子目錄和文件:案例9-2:列舉子目錄和文件《JAVA程序設(shè)計(jì)》課程

9.1文件importjava.io.*;publicclassFileTest{ publicstaticvoidmain(String[]args) { Filedir=newFile("d:/test"); File[]f=dir.listFiles();//獲得所有子目錄和文件構(gòu)成的File數(shù)組 Stringtag; for(inti=0;i<f.length;i++) {《JAVA程序設(shè)計(jì)》課程

9.1文件{ if(f[i].isDirectory())tag="[dir]";//目錄前加[dir]標(biāo)志 elsetag=""; System.out.println(tag+f[i].getAbsolutePath()); } }}9.1.3項(xiàng)目實(shí)施《JAVA程序設(shè)計(jì)》課程

9.1文件(1)功能分析 文件的組織結(jié)構(gòu)是樹型結(jié)構(gòu),顯示目錄樹,本質(zhì)上是對(duì)多叉樹進(jìn)行遍歷。多叉樹的遍歷有遞歸和非遞歸算法兩種,該項(xiàng)目中用堆棧輔助實(shí)現(xiàn)非遞歸算法。 為保存當(dāng)前訪問到的樹節(jié)點(diǎn)信息,構(gòu)造了一個(gè)FileInfo類進(jìn)行輔助,包含當(dāng)前的File對(duì)象、當(dāng)前目錄的順序號(hào)和當(dāng)前目錄的級(jí)別。(2)編碼通過分析我們可以編寫以下代碼實(shí)現(xiàn)功能:《JAVA程序設(shè)計(jì)》課程

9.1文件importjava.io.*;importjava.util.*;classFileInfo//用于存放節(jié)點(diǎn)信息{ privateFilefp;//當(dāng)前節(jié)點(diǎn)對(duì)應(yīng)的File對(duì)象 privateintindex;//訪問到的子文件序號(hào) privateintlevel;//當(dāng)前節(jié)點(diǎn)的級(jí)別 publicFileInfo(Filefp,intindex,intlevel) { this.fp=fp; this.index=index;《JAVA程序設(shè)計(jì)》課程

9.1文件this.level=level; } publicFilegetFile(){returnfp;} publicintgetIndex(){returnindex;} publicintgetLevel(){returnlevel;} publicvoidsetIndex(intindex){this.index=index;}}publicclassTest{privatestaticvoidtreeView(Stringpath)《JAVA程序設(shè)計(jì)》課程

9.1文件{ Filef=newFile(path); if(f.isFile())//path為一個(gè)文件,無須繼續(xù)遍歷 { System.out.println(f.getName()); return; }Stack<FileInfo>stk=newStack<FileInfo>();//建立一個(gè)空的堆棧 inti,j; booleanfoundDir; //存在子目錄的標(biāo)志《JAVA程序設(shè)計(jì)》課程

9.1文件FileInfofinfo=newFileInfo(f,0,0); stk.push(finfo);//將根節(jié)點(diǎn)入棧 while(!stk.empty()) { finfo=stk.peek();//獲取棧頂元素(不彈出) f=finfo.getFile(); foundDir=false; //從上一次處理到的順序號(hào)開始,繼續(xù)考查后續(xù)子節(jié)點(diǎn) for(i=finfo.getIndex();!foundDir&&i<f.listFiles().length;i++)《JAVA程序設(shè)計(jì)》課程

9.1文件{//根據(jù)級(jí)別產(chǎn)生縮進(jìn)(前面加空格) for(j=0;j<finfo.getLevel();j++) System.out.print(""); System.out.print(f.listFiles()[i].getName());//打印當(dāng)前節(jié)點(diǎn) if(f.listFiles()[i].isDirectory())//當(dāng)前節(jié)點(diǎn)為目錄 { System.out.print("*");//目錄標(biāo)志 finfo.setIndex(i+1); stk.push(newFileInfo(f.listFiles()[i],0,finfo.getLevel()+1));//子目錄入?!禞AVA程序設(shè)計(jì)》課程

9.1文件 foundDir=true; } System.out.println();//換行 } if(!foundDir)stk.pop();//沒有下級(jí)子文件夾,當(dāng)前文件夾出棧 } }publicstaticvoidmain(String[]args){ treeView("d:\\test");}}《JAVA程序設(shè)計(jì)》課程

9.1文件《JAVA程序設(shè)計(jì)》課程

9.1文件3)調(diào)試運(yùn)行,顯示結(jié)果該程序的運(yùn)行結(jié)果如圖9.2所示:圖9.2顯示目錄樹9.1.4能力拓展《JAVA程序設(shè)計(jì)》課程

9.1文件(1)選擇題①要判斷D盤下是否存在文件abc.txt,應(yīng)該使用的語句是()。A.if(newFile("d:abc.txt").exists()==1)B.if(File.exists("d:abc.txt")==1)C.if(newFile("d:/abc.txt").exists())D.if(File.exists("d:/abc.txt"))②以下關(guān)于File類說法正確的是()A.File對(duì)象代表了操作系統(tǒng)中的一個(gè)真實(shí)存在的文件或文件夾B.可以使用File對(duì)象創(chuàng)建或刪除一個(gè)文件C.可以使用File對(duì)象創(chuàng)建或刪除一個(gè)文件夾D.當(dāng)一個(gè)File對(duì)象被回收時(shí),系統(tǒng)中對(duì)應(yīng)的文件或文件夾也被刪除《JAVA程序設(shè)計(jì)》課程

9.1文件③以下是創(chuàng)建File對(duì)象的代碼,錯(cuò)誤的是()A.Filef1=newFile("/mydir/myfile.txt");B.Filef2=newFile("/mydir","myfile.txt");C.Filef3=newFile("\\mydir\\myfile.txt");D.Filef4=newFile("\mydir\myfile.txt");(2)填空題①File對(duì)象調(diào)用方法創(chuàng)建一個(gè)目錄。②能獲得文件對(duì)象父路徑名的方法是。③判斷文件或目錄是否存在用方法。(3)編程題①查找某個(gè)目錄下所有擴(kuò)展名為“txt”的文件,并將文件的完整路徑顯示在屏幕上。②統(tǒng)計(jì)某個(gè)目錄下每種類型文件的個(gè)數(shù)(文件類型根據(jù)擴(kuò)展名來區(qū)別),并將統(tǒng)計(jì)結(jié)果顯示在屏幕上。9.2.1項(xiàng)目描述《JAVA程序設(shè)計(jì)》課程9.2字節(jié)流編程實(shí)現(xiàn)文件內(nèi)容拷貝。9.2.2項(xiàng)目知識(shí)準(zhǔn)備《JAVA程序設(shè)計(jì)》課程9.2字節(jié)流(1)流的概念和分類 Java中的流(Stream)代表任何有能力輸出數(shù)據(jù)的輸出源,或是任何有能力接收數(shù)據(jù)的接收源,鍵盤輸入,文件讀出、寫入,網(wǎng)絡(luò)接收、發(fā)送,顯示器輸出、打印機(jī)輸出,都可以抽象為數(shù)據(jù)“流”。 Java中的流數(shù)量比較多,分類的方式主要有三種:1)按照輸入的方向,分為輸入流和輸出流;2)按照處理數(shù)據(jù)的單位不同,分為字節(jié)流和字符流,字節(jié)流讀?。ɑ?qū)懭耄┑淖钚挝皇且粋€(gè)字節(jié),而字符流一次讀?。ɑ?qū)懭耄┑淖钚挝皇且粋€(gè)字符。3)按照功能的不同,分為節(jié)點(diǎn)流和處理流(也稱過濾流),節(jié)點(diǎn)流可以直接通過一個(gè)特《JAVA程序設(shè)計(jì)》課程9.2字節(jié)流定的地方(如磁盤、內(nèi)存,或其它設(shè)備)讀寫數(shù)據(jù),處理流對(duì)一個(gè)已存在的流進(jìn)行連接和封裝,其構(gòu)造方法總是要帶一個(gè)其他的流對(duì)象作參數(shù)。Java中負(fù)責(zé)字節(jié)輸入輸出的頂層抽象流類是InputStream和OutputStream。(2)InputStream 字節(jié)輸入流類都屬于InputStream的子類,為了更抽象,InputStream類只提供了少量方法,這些方法如下:(1)available 該方法得到可讀取的輸入字節(jié)數(shù)。定義如下 intavailable()throwsIOException《JAVA程序設(shè)計(jì)》課程9.2字節(jié)流(2)read 該方法用于讀取數(shù)據(jù),定義如下: abstractintread()throwsIOException 從輸入流讀取下一個(gè)數(shù)據(jù)字節(jié),如果已到文件尾就返回-1。 intread(byte[]b)throwsIOException 從輸入流中讀取一定數(shù)量的字節(jié)并將其存儲(chǔ)在緩沖區(qū)數(shù)組b中,返回實(shí)際讀 取的字節(jié)數(shù),如果已到文件尾就返回-1。 intread(byte[]b,intoffset,intlen)throwsIOException 將輸入流中最多l(xiāng)en個(gè)數(shù)據(jù)字節(jié)讀入字節(jié)數(shù)組,并從offset指定的下標(biāo)開始 存放。如果已到文件尾就返回-1,否則返回實(shí)際讀取的字節(jié)數(shù)。《JAVA程序設(shè)計(jì)》課程9.2字節(jié)流3)skip 該方法在輸入流中跳過指定的字節(jié)數(shù),返回實(shí)際跳過的字節(jié)數(shù)。定義如下: longskip(longn);throwsIOException4)close該方法關(guān)閉輸入流并釋放與此有關(guān)的所有系統(tǒng)資源。定義如下:voidclose()throwsIOException《JAVA程序設(shè)計(jì)》課程9.2字節(jié)流(3)FileInputStream類FileInputStream(文件輸入流)類是InputStream類的子類,用于以字節(jié)方式讀取文件內(nèi)容,一般用下面兩者形式的構(gòu)造方法來構(gòu)造FileInputStream對(duì)象:FileInputStream(Filefile) 通過打開一個(gè)到實(shí)際文件的連接來創(chuàng)建FileInputStream對(duì)象,該文件通過 File對(duì)象指定。FileInputStream(Stringname) 通過打開一個(gè)到實(shí)際文件的連接來創(chuàng)建FileInputStream對(duì)象,該文件通過 路徑名name指定。 下面演示文件輸入流的使用:案例9-3:以字節(jié)方式讀文件《JAVA程序設(shè)計(jì)》課程9.2字節(jié)流importjava.io.*;publicclassReadTest{ publicstaticvoidmain(String[]args){ try{ byte[]b=newbyte[100];//數(shù)據(jù)緩存 intn; InputStreamis=newFileInputStream("d:\\abc.txt");while((n=is.read(b))!=-1)//n表示實(shí)際讀取到的字節(jié)數(shù) {《JAVA程序設(shè)計(jì)》課程9.2字節(jié)流 for(inti=0;i<n;i++) System.out.print((char)b[i]);//轉(zhuǎn)換成字符顯示 } is.close();//關(guān)閉流 }catch(Exceptione){ e.printStackTrace(); } }}《JAVA程序設(shè)計(jì)》課程9.2字節(jié)流(4)FileOutputStream類FileOutputStream類是OutputStream類的子類,用于以字節(jié)方式寫入數(shù)據(jù)流到文件,一般用下面兩者形式構(gòu)造FileOutputStream對(duì)象:FileOutputStream(Filefile)提醒:任何文件都由字節(jié)構(gòu)成,并可以用read方法分塊讀取并存放到字節(jié)數(shù)組中,read方法的返回值表示實(shí)際讀取到的字節(jié)數(shù),如果為-1,表示文件內(nèi)容已經(jīng)讀取完畢。只有包含英文字母、數(shù)字、英文符號(hào)的文本文件內(nèi)容才能以字節(jié)方式讀取并顯示,其它格式的文件用這種方法顯示會(huì)產(chǎn)生亂碼?!禞AVA程序設(shè)計(jì)》課程9.2字節(jié)流創(chuàng)建一個(gè)向指定File對(duì)象表示的文件中寫入數(shù)據(jù)的文件輸出流。FileOutputStream(Filefile,booleanappend) 創(chuàng)建一個(gè)向指定File對(duì)象表示的文件中寫入數(shù)據(jù)的文件輸出流。append參 數(shù)為true表示在末尾追加數(shù)據(jù)。FileOutputStream(Stringname) 創(chuàng)建一個(gè)向具有指定名稱的文件中寫入數(shù)據(jù)的文件輸出流。FileOutputStream(Stringname,booleanappend) 創(chuàng)建一個(gè)向具有指定名稱的文件中寫入數(shù)據(jù)的文件輸出流。append參數(shù)為 true表示在末尾追加數(shù)據(jù)。案例9-4:將字節(jié)數(shù)據(jù)寫入文件《JAVA程序設(shè)計(jì)》課程9.2字節(jié)流importjava.io.*;publicclasswrite{ publicstaticvoidmain(String[]args){ try{ Strings="Hello!"; byte[]b=s.getBytes();//字符串轉(zhuǎn)換為字節(jié)數(shù)組 OutputStreamos=newFileOutputStream("d:\\abc.txt"); os.write(b);//寫入“Hello!”《JAVA程序設(shè)計(jì)》課程9.2字節(jié)流os.write(97);//寫入字母a os.write(98);//寫入字母b os.close();System.out.println("寫入文件成功!!"); }catch(Exceptione){ e.printStackTrace(); } }}9.2.3項(xiàng)目實(shí)施《JAVA程序設(shè)計(jì)》課程9.2字節(jié)流(1)功能分析文件拷貝涉及兩個(gè)文件,因此要同時(shí)打開一個(gè)文件輸入流和一個(gè)文件輸出流。輸入流先從文件A中讀取數(shù)據(jù),存入字節(jié)數(shù)組中,輸出流再將字節(jié)數(shù)組中的數(shù)據(jù)寫入文件B,這樣循環(huán)進(jìn)行,直到全部數(shù)據(jù)拷貝完畢。(2)編碼通過分析我們可以編寫以下代碼實(shí)現(xiàn)功能:importjava.io.*;publicclassFileCopy{ staticvoidcopy(Stringsrc,Stringdest) {《JAVA程序設(shè)計(jì)》課程9.2字節(jié)流byte[]b=newbyte[2048];//緩沖區(qū)大小為2K intn; try { InputStreamis=newFileInputStream(src); OutputStreamos=newFileOutputStream(dest); while((n=is.read(b))!=-1)//通過InputStream讀取數(shù)據(jù)到字節(jié)數(shù)組b os.write(b,0,n);//將字節(jié)數(shù)組b中的數(shù)據(jù)通過OutputStream寫入文件 is.close(); os.close();《JAVA程序設(shè)計(jì)》課程9.2字節(jié)流System.out.println(“文件復(fù)制成功”); } catch(IOExceptione){System.out.print(e.getMessage());} }

publicstaticvoidmain(String[]args){

copy("d:\\1.jpg","d:\\2.jpg"); }}《JAVA程序設(shè)計(jì)》課程9.2字節(jié)流(3)調(diào)試運(yùn)行該程序?qū)D像文件“d:\1.jpg”拷貝到“d:\2.jpg”,運(yùn)行后用看圖軟件查看拷貝后的圖像是否正確。9.2.4能力拓展《JAVA程序設(shè)計(jì)》課程9.2字節(jié)流(1)選擇題①下列說法正確的是()A.輸入流包含write方法B.輸出流包含read方法C.輸出流包括skip方法D.輸入流包括skip方法②判斷文件輸入流是否結(jié)束的標(biāo)志是()A.read方法的返回值為0B.write方法的返回值為0C.read方法的返回值為-1D.write方法的返回值為-1《JAVA程序設(shè)計(jì)》課程9.2字節(jié)流③FileOutputStream的父類是()。A.FileOutputB.FileC.OutputStreamD.InputStream(2)填空題①對(duì)于FileInputStream,從方向上來分,它是流,從數(shù)據(jù)單位上分,它是流,從功能上分,它是流。②intread(byte[]b)方法返回值表示,參數(shù)表示。③如果使用FileOutputStream(Stringpath,booleanappend)這個(gè)構(gòu)造方法創(chuàng)建對(duì)象,并設(shè)置第二個(gè)參數(shù)值為true,則效果為。(3)編程題生成楊輝三角的前8行,并將數(shù)值寫入文本文件“yh.txt”中,要求用記事本打開能看到正確的數(shù)值和形狀。9.3.2項(xiàng)目知識(shí)準(zhǔn)備《JAVA程序設(shè)計(jì)》課程9.3字符流(1)字符流概述與字符輸入輸出相關(guān)的Reader、Writer及其子類主要是為了方便字符的讀寫。字符在文件中存儲(chǔ),或在網(wǎng)絡(luò)中傳輸時(shí),常用的編碼有GB2312、GBK、Unicode、UTF-8等,這些編碼中,一個(gè)字符對(duì)應(yīng)若干個(gè)字節(jié),編程人員希望能讀寫完整的字符,而不是將一個(gè)個(gè)字節(jié)來自己進(jìn)行拼湊。作為一個(gè)成熟完善的應(yīng)用開發(fā)平臺(tái),Java責(zé)無旁貸地提供了字符讀寫功能,使字符數(shù)據(jù)的輸入輸出變得簡(jiǎn)單?!禞AVA程序設(shè)計(jì)》課程9.3字符流(2)Reader抽象類Reader類是所有字符輸入流的父類,該類定義了以字符為單位讀取數(shù)據(jù)的基本方法,并在其子類中實(shí)現(xiàn)。該類主要定義下面三個(gè)方法:(1)read該方法進(jìn)行了重載,有3種形式:intread()throwsIOException 讀取單個(gè)字符,返回值可以用強(qiáng)制轉(zhuǎn)為char類型。intread(char[]cbuf)throwsIOException 將字符讀入字符數(shù)組。abstractintread(char[]cbuf,intoffset,intlen)throwsIOException 將字符讀入數(shù)組cbuf的某一部分。offset為開始存儲(chǔ)字符處的偏移量,len為要 讀取的最多字符數(shù),返回實(shí)際讀取到的字符數(shù)?!禞AVA程序設(shè)計(jì)》課程9.3字符流(2)skip該方法在讀取時(shí)跳過若干個(gè)字符,定義為:publiclongskip(longn)throwsIOException(3)close該方法關(guān)閉輸入流。(3)FileReader類FileReader類用于操作系統(tǒng)默認(rèn)編碼的文本文件讀?。ㄔ诤?jiǎn)體中文系統(tǒng)下,ANSI編碼代表GBK編碼)。例如,當(dāng)保存記事本文檔時(shí),默認(rèn)選項(xiàng)就是ANSI(即GBK編碼),如圖9.3所示:《JAVA程序設(shè)計(jì)》課程9.3字符流圖9.3保存記事本文檔時(shí)的默認(rèn)編碼比如d:\test\1.txt是一個(gè)存儲(chǔ)為ANSI編碼(即操作系統(tǒng)默認(rèn)編碼)格式的文本文件,可以用FileReader讀取并顯示:案例9-5:讀取用系統(tǒng)默認(rèn)編碼保存的文本文件《JAVA程序設(shè)計(jì)》課程9.3字符流importjava.io.*;publicclassTestFileReader{ publicstaticvoidmain(String[]args) { char[]c=newchar[1024];//數(shù)據(jù)緩沖區(qū) intn; try { FileReaderfr=newFileReader("d:\\test\\1.txt");《JAVA程序設(shè)計(jì)》課程9.3字符流 while((n=fr.read(c))!=-1) System.out.print(newString(c,0,n));//將字符數(shù)組轉(zhuǎn)換為字符串顯示 fr.close(); } catch(IOExceptione){System.out.print(e.getMessage());} }}《JAVA程序設(shè)計(jì)》課程9.3字符流(4)InputStreamReader類InputStreamReader類和FileInputStream類配合使用,可以實(shí)現(xiàn)更強(qiáng)大的文本文件讀取功能,適用于各種編碼的文本文件。該例子演示“UTF-8”編碼的文本文件讀取。運(yùn)行前,先用記事本編輯一個(gè)文本文件,再另存為“d:\test\1.txt”,保存時(shí)選擇編碼為“UTF-8”:案例9-6:讀取用其它編碼保存的文本文件importjava.io.*;publicclassTestInputStreamReader{ publicstaticvoidmain(String[]args) {《JAVA程序設(shè)計(jì)》課程9.3字符流try { FileInputStreamis=newFileInputStream("d:\\test\\1.txt");//打開字節(jié)流 InputStreamReaderisr=newInputStreamReader(is,"UTF-8");//設(shè)置字符編碼 char[]c=newchar[1024];//數(shù)據(jù)緩沖區(qū) intn;isr.skip(1);//丟棄第一個(gè)字符,該字符是記事本程序加的編碼識(shí)別標(biāo)志 while((n=isr.read(c))!=-1)《JAVA程序設(shè)計(jì)》課程9.3字符流 System.out.print(newString(c,0,n));//將字符數(shù)組轉(zhuǎn)換為字符串顯示

isr.close(); is.close(); } catch(IOExceptione){System.out.print(e.getMessage());} }}提醒:FileInputStream屬于字節(jié)流,并且屬于直接與磁盤文件相連的節(jié)點(diǎn)流,InputStreamReader對(duì)FileInputStream進(jìn)行包裝,屬于字符流,處理流?!禞AVA程序設(shè)計(jì)》課程9.3字符流(5)Writer抽象類Writer類是所有字符輸出流的父類,該類定義了以字符為單位寫入數(shù)據(jù)的基本方法,并在其子類中實(shí)現(xiàn)。該類主要定義下面三個(gè)方法:(1)Write該方法進(jìn)行了重載,有下面5種形式: voidwrite(intc)throwsIOException寫入單個(gè)字符。 voidwrite(char[]cbuf)throwsIOException寫入字符數(shù)組。 abstractvoidwrite(char[]cbuf,intoff,intlen)throwsIOException寫入字符數(shù)組的某一部分。 voidwrite(Stringstr)throwsIOException寫入字符串。 voidwrite(Stringstr,intoff,intlen)throwsIOException寫入字符串的某一部分。《JAVA程序設(shè)計(jì)》課程9.3字符流voidwrite(Stringstr)throwsIOException寫入字符串。 voidwrite(Stringstr,intoff,intlen)throwsIOException寫入字符串的某一部分。2)flush該方法輸出緩沖區(qū)中的數(shù)據(jù),立即寫入預(yù)期的目標(biāo)。3)close該方法關(guān)閉輸出流。(6)FileWriter類FileWriter類以操作系統(tǒng)默認(rèn)編碼格式將字符寫入文本文件,例如:案例9-7:用操作系統(tǒng)默認(rèn)編碼將字符寫入文本文件中《JAVA程序設(shè)計(jì)》課程9.3字符流importjava.io.*;publicclassTestFileWriter{ publicstaticvoidmain(String[]args) { try { FileWriterfw=newFileWriter("d:\\test\\1.txt"); Strings="路漫漫其修遠(yuǎn)兮,吾將上下而求索。";《JAVA程序設(shè)計(jì)》課程9.3字符流 fw.write(s); fw.close();System.out.println(“文件寫入成功!!!”); } catch(IOExceptione){System.out.print(e.getMessage());} }寫入后,用記事本打開查看,可以發(fā)現(xiàn)文件是以系統(tǒng)默認(rèn)編碼(ANSI)保存的。(7)OutputStreamWriter類OutputStreamWriter類和FileOutputStream類配合使用,可以設(shè)置字符寫入文本文件時(shí)的編碼格式?!禞AVA程序設(shè)計(jì)》課程9.3字符流案例9-8:用UTF-8編碼將字符寫入文本文件中importjava.io.*;publicclassTestOutputStreamWriter{ publicstaticvoidmain(String[]args) { try { FileOutputStreamos=newFileOutputStream("d:\\test\\1.txt"); OutputStreamWriterosw=newOutputStreamWriter(os,"UTF-8"); Strings="路漫漫其修遠(yuǎn)兮,吾將上下而求索。";《JAVA程序設(shè)計(jì)》課程9.3字符流 osw.write(s); osw.close(); os.close(); } catch(IOExceptione){} }} 寫入后,用記事本打開查看,可以發(fā)現(xiàn)文件是以UTF-8編碼保存的?!禞AVA程序設(shè)計(jì)》課程9.3字符流8)緩沖讀寫B(tài)ufferedReader和BufferedWriter用來包裝字符流,它們都擁有默認(rèn)大小為8192字符的緩存。用BufferedReader讀取時(shí),先把字符讀到緩存里,到緩存滿了或者主動(dòng)調(diào)用flush方法的時(shí)候,再讀入內(nèi)存;用BufferedWriter寫入時(shí)先把字符寫入緩存,到緩存滿了或者主動(dòng)調(diào)用flush方法的時(shí)候,再寫入目標(biāo)設(shè)備(如磁盤)。BufferedReader的構(gòu)造方法定義如下:BufferedReader(Readerin)創(chuàng)建一個(gè)使用默認(rèn)大小緩沖區(qū)的緩沖字符輸入流。BufferedReader(Readerin,intsz)創(chuàng)建一個(gè)使用指定大小緩沖區(qū)的緩沖字符輸入流。BufferedWriter的構(gòu)造方法定義如下:《JAVA程序設(shè)計(jì)》課程9.3字符流案例9-8:字符輸出流緩沖寫入文本文件importjava.io.*;publicclasstestBufferedWriter{ publicstaticvoidmain(String[]args) { try

{ FileOutputStreamos=newFileOutputStream("d:\\test\\1.txt"); OutputStreamWriterosw=newOutputStreamWriter(os,"UTF-8"); BufferedWriterbw=newBufferedWriter(osw);《JAVA程序設(shè)計(jì)》課程9.3字符流案例9-8:字符輸出流緩沖寫入文本文件importjava.io.*;publicclasstestBufferedWriter{ publicstaticvoidmain(String[]args) { try

{ FileOutputStreamos=newFileOutputStream("d:\\test\\1.txt"); OutputStreamWriterosw=newOutputStreamWriter(os,"UTF-8"); BufferedWriterbw=newBufferedWriter(osw);《JAVA程序設(shè)計(jì)》課程9.3字符流 一些文本文件是按行來存放信息的,讀取時(shí)也需要按行來讀,BufferedReader提供的readLine方法此時(shí)可以派上用場(chǎng)。案例9-9:按行讀取文本文件importjava.io.*;publicclassTestBufferedReader{ publicstaticvoidmain(String[]args){ try{ InputStreamis=newFileInputStream("d:\\test\\1.txt"); InputStreamReaderisr=newInputStreamReader(is);《JAVA程序設(shè)計(jì)》課程9.3字符流 BufferedReaderbr=newBufferedReader(isr); Strings; while((s=br.readLine())!=null)//readLine返回null表示結(jié)束 { System.out.println(s);//處理一行字符 } br.close(); isr.close(); is.close(); }catch(Exceptione){ e.printStackTrace(); } }}《JAVA程序設(shè)計(jì)》課程9.3字符流9)隨機(jī)文件讀寫 和流式文件讀寫相比,隨機(jī)文件讀寫具有定位靈活的特點(diǎn)。在隨機(jī)讀取方式下,可以把文件指針定位到某個(gè)位置(位置的計(jì)算從0開始),再讀寫若干字節(jié)。Java中使用RandomAccessFile類進(jìn)行隨機(jī)文件讀寫。RandomAccessFile類的構(gòu)造方法定義如下:publicRandomAccessFile(Filefile,Stringmode) throwsFileNotFoundExceptionpublicRandomAccessFile(Stringname,Stringmode) throwsFileNotFoundException構(gòu)造方法的第一個(gè)參數(shù)可以是File對(duì)象或用字符串表示的文件路徑,第二個(gè)參數(shù)表示打開文件的方式,可以選擇“r”(只讀)或“rw”(讀寫)?!禞AVA程序設(shè)計(jì)》課程9.3字符流RandomAccessFile類的常用方法有:(1)seek 該方法定位文件指針,定義為:publicvoidseek(longpos)throwsIOException(2)getFilePointer 該方法返回文件指針的位置,定義為:publiclonggetFilePointer()throwsIOException(3)length 該方法返回文件的長(zhǎng)度,定義為:publiclonglength()throwsIOException(4)close 該方法關(guān)閉文件并釋放所占資源。定義為:publicvoidclose()throwsIOException《JAVA程序設(shè)計(jì)》課程9.3字符流(5)讀取數(shù)據(jù)以read開頭的方法從文件中讀取不同類型的數(shù)據(jù),具體可以參考JavaAPI手冊(cè)。(6)寫入數(shù)據(jù)以write開頭的方法向文件中寫入不同類型的數(shù)據(jù),具體可以參考JavaAPI手冊(cè)?!禞AVA程序設(shè)計(jì)》課程9.3字符流(1)功能分析編碼轉(zhuǎn)換時(shí),打開文件A并得到一個(gè)文件輸入流(FileInputStream),用輸入流讀取器(InputStreamReader)根據(jù)GBK編碼格式讀取若干字節(jié),存入字符數(shù)組c中;同時(shí)打開文件B得到一個(gè)文件輸出流,用輸出流寫入器(OutputStreamWriter)根據(jù)UTF-8編碼格式,將字符數(shù)組c中的數(shù)據(jù)寫入另外一個(gè)文件。如此循環(huán)進(jìn)行,直到全部數(shù)據(jù)轉(zhuǎn)換完畢。(2)編碼通過分析我們可以編寫以下代碼實(shí)現(xiàn)功能:9.3.3項(xiàng)目實(shí)施《JAVA程序設(shè)計(jì)》課程9.3

溫馨提示

  • 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)論