![《Java面向?qū)ο缶幊獭氛n件-第13章 io流處理_第1頁(yè)](http://file4.renrendoc.com/view2/M03/11/3C/wKhkFmYxkNuAGu0tAADfw89v40A576.jpg)
![《Java面向?qū)ο缶幊獭氛n件-第13章 io流處理_第2頁(yè)](http://file4.renrendoc.com/view2/M03/11/3C/wKhkFmYxkNuAGu0tAADfw89v40A5762.jpg)
![《Java面向?qū)ο缶幊獭氛n件-第13章 io流處理_第3頁(yè)](http://file4.renrendoc.com/view2/M03/11/3C/wKhkFmYxkNuAGu0tAADfw89v40A5763.jpg)
![《Java面向?qū)ο缶幊獭氛n件-第13章 io流處理_第4頁(yè)](http://file4.renrendoc.com/view2/M03/11/3C/wKhkFmYxkNuAGu0tAADfw89v40A5764.jpg)
![《Java面向?qū)ο缶幊獭氛n件-第13章 io流處理_第5頁(yè)](http://file4.renrendoc.com/view2/M03/11/3C/wKhkFmYxkNuAGu0tAADfw89v40A5765.jpg)
版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第13章io流處理
學(xué)習(xí)內(nèi)容02File類04字節(jié)流010305字符流對(duì)象輸入輸出流PrintStream流06字符編碼01File類概念針對(duì)文件的這類操作,JDK中提供了一個(gè)File類,該類封裝了一個(gè)路徑,并提供了一系列的方法用于操作該路徑所指向的文件。File類的常用構(gòu)造方法構(gòu)造方法名稱功能描述File(Stringpathname)通過(guò)指定的一個(gè)字符串類型的文件路徑來(lái)創(chuàng)建一個(gè)新的File對(duì)象File(Stringparent.Stringchild)根據(jù)指定的一個(gè)字符串類型的父路徑和一個(gè)字符串類型的子路徑(包括文件名稱)創(chuàng)建一個(gè)File對(duì)象File(Fileparent.Stringchild)根據(jù)指定的File類的父路徑和字符串類型的子路徑(包括文件名稱)創(chuàng)建一個(gè)File對(duì)象
01File類File類中的常用方法01File類文件屬性獲取與判斷,案例:publicclassDemo1{publicstaticvoidmain(String[]args){Stringpath="e:\\Demo1.txt";Filefile=newFile(path);//采用構(gòu)造方法,創(chuàng)建一個(gè)文件對(duì)象
//1.判斷方法
System.out.println(file.exists()==true?"存在":"不存在");System.out.println(file.isDirectory()==true?"是文件目錄":"不是文件目錄");System.out.println(file.isFile()==true?"是文件":"不是文件");System.out.println(file.canRead()==true?"可讀":"不可讀");System.out.println(file.canWrite()==true?"可寫(xiě)":"不可寫(xiě)");System.out.println(file.canExecute()==true?"可執(zhí)行":"不可執(zhí)行");//2.獲得方法
System.out.println("文件路徑是:"+file.getPath());System.out.println("文件絕對(duì)路徑是:"+file.getAbsolutePath());System.out.println("父文件路徑是:"+file.getParent());System.out.println("文件名是:"+file.getName());}}01File類文件操作,教材中的案例1,1、文件目錄的遍歷publicclassDemo2{
publicstaticvoidmain(String[]args){
Filefile=newFile("e:\\phone");
if(file.isFile()){
System.out.println(file.getName());
}else{
listName(file);
}
}
/**
*定義一個(gè)列出文件列表的方法,該方法時(shí)一個(gè)遞歸方法,終止條件是當(dāng)文件中沒(méi)有目錄,全為文件
*打印時(shí)停止遞歸
*@paramfile
*/
publicstaticvoidlistName(Filefile){
if(file.isFile()){
System.out.println("--"+file.getName());
}else{
System.out.println("||"+file.getName());
File[]files=file.listFiles();
for(Filefile1:files){
listName(file1);
}
}
}
}01File類文件操作,教材中的案例2,2、非空目錄的刪除publicclassDemo3{
publicstaticvoidmain(String[]args){
Filefile=newFile("e:\\phone");
if(file.isFile()){
file.delete();
}else{
deleteDir(file);
}
}
publicstaticvoiddeleteDir(Filefile){
if(file.exists()){
File[]files=file.listFiles();
for(Filefile1:files){
if(file1.isDirectory()){
deleteDir(file1);
}else{
file1.delete();
}
}
}
file.delete();
}
}02字節(jié)流概述:在File類的學(xué)習(xí)過(guò)程中,我們只能完成文件的屬性,文件的創(chuàng)建和刪除等操作,對(duì)于文件的讀取,寫(xiě)入數(shù)據(jù)操作,沒(méi)有方法能夠?qū)崿F(xiàn)。文件讀取,從理論上來(lái)說(shuō)就是將硬盤(pán)中的文件讀入到內(nèi)存中,文件的寫(xiě)入,就是將內(nèi)存中的數(shù)據(jù)保存在硬盤(pán)中。當(dāng)文件讀取時(shí),數(shù)據(jù)從硬盤(pán)文件流向內(nèi)存,我們叫輸入流。文件寫(xiě)入時(shí),數(shù)據(jù)從內(nèi)存流向硬盤(pán),我們叫輸出流。硬盤(pán)中的文件存儲(chǔ)實(shí)際上都是字節(jié)(Byte)存儲(chǔ)的,如果我們讀取或者寫(xiě)入數(shù)據(jù)時(shí),直接的按照字節(jié)讀取或者寫(xiě)入的方式,這種數(shù)據(jù)流,我們稱之為字節(jié)流,02字節(jié)流字節(jié)輸出流OutputStream:OutputStream是一個(gè)抽象類,是所有輸出字節(jié)流的超類。操作的數(shù)據(jù)都是字節(jié),定義了輸出字節(jié)流的基本共性功能方法,常用方法如下表:方法名稱功能描述voidwrite(intb)向輸出流寫(xiě)人一個(gè)字節(jié)voidwrite(byte[]b)把參數(shù)b指定的字節(jié)數(shù)組的所有字節(jié)寫(xiě)到輸出流voidwrite(byte[]b,intoff,intlen)將指定byte數(shù)組中從偏移量off開(kāi)始的len個(gè)字節(jié)寫(xiě)人輸出流voidflush()刷新此輸出流并強(qiáng)制寫(xiě)出所有緩沖的輸出字節(jié)
voidclose()關(guān)閉此輸出流并釋放與此流相關(guān)的所有系統(tǒng)資源
OutputStream有很多子類,其中子類FileOutputStream可用來(lái)寫(xiě)入字節(jié)數(shù)據(jù)到文件中去,F(xiàn)ileOutputStream類,即文件輸出流,是用于將字節(jié)數(shù)據(jù)寫(xiě)入File的輸出。FileOutputStream類常用的構(gòu)造方法,如下表:構(gòu)造方法名稱功能描述FileOutputStream(Filefile)創(chuàng)建一個(gè)向指定File對(duì)象表示的文件中寫(xiě)入數(shù)據(jù)的文件輸出流。FileOutputStream(Stringname)創(chuàng)建一個(gè)向具有指定名稱的文件中寫(xiě)入數(shù)據(jù)的輸出文件流。02字節(jié)流publicclassDemo4_1{publicstaticvoidmain(String[]args)throwsIOException{FileOutputStreamfout=newFileOutputStream("c:\\123.txt");//根據(jù)文件路徑,創(chuàng)建一個(gè)文件輸出流對(duì)象
fout.write('a');//采用fout對(duì)象,寫(xiě)入字符‘a(chǎn)’到文件中。
System.out.println("寫(xiě)入成功!");}}案例1-3:publicclassDemo4_2{publicstaticvoidmain(String[]args)throwsIOException{FileOutputStreamfout=newFileOutputStream("e:\\123.txt");byte[]bytes="sdfhksdjfhksdfhjksdfhgjksdfsdfkhskd".getBytes();//將字符串轉(zhuǎn)化為字節(jié)數(shù)組。
fout.write(bytes);//一次性寫(xiě)入字節(jié)數(shù)組
System.out.println("寫(xiě)入成功!");}}02
字節(jié)流前面兩個(gè)例子,都是覆蓋寫(xiě)入,覆蓋就是寫(xiě)入之前,會(huì)去掉以前所有的數(shù)據(jù),有時(shí)候這種寫(xiě)入并不符合實(shí)際需求,下面的一個(gè)代碼講述了,在源文件中進(jìn)行追加寫(xiě)入,代碼如下:publicclassDemo4_3{publicstaticvoidmain(String[]args)throwsIOException{FileOutputStreamfout=newFileOutputStream("e:\\123.txt",true);//設(shè)置為true,就是追加寫(xiě)入
byte[]bytes="\r\nsdfhksdjfhksdfhjksdfhgjksdfsdfkhskd".getBytes();//"\r\n"追加時(shí)換行
//將字符串轉(zhuǎn)化為字節(jié)數(shù)組。
fout.write(bytes);//一次性寫(xiě)入字節(jié)數(shù)組
System.out.println("寫(xiě)入成功!");//關(guān)閉資源
fout.close();}}02
輸入流InputStream
我們可以把內(nèi)存中的數(shù)據(jù)寫(xiě)出到文件中,那怎樣把文件中的數(shù)據(jù)讀到內(nèi)存中,我們通過(guò)InputStream實(shí)現(xiàn)。InputStream是抽象類,是表示字節(jié)輸入流的所有類的超類,定義了字節(jié)輸入流的基本共性功能方法。方法名稱功能描述intread()從輸人流讀取一個(gè)8位的字節(jié),把它轉(zhuǎn)換為0—255之間的整數(shù),并返回這一整數(shù)
intread(byte[]b)從輸入流讀取若干字節(jié),把它們保存到參數(shù)b指定的字節(jié)數(shù)組中,返回的整數(shù)表示讀取字節(jié)數(shù)
intread(byte[]b,inoff,intlen)從輸人流讀取若干字節(jié),把它們保存到參數(shù)b指定的字節(jié)數(shù)組中,off指定字節(jié)數(shù)組開(kāi)始保存數(shù)據(jù)的起始下標(biāo),len表示讀取的字節(jié)長(zhǎng)度voidclose()關(guān)閉此輸人流并釋放與該流關(guān)聯(lián)的所有系統(tǒng)資源IutputStream有很多子類,其中子類FileInputStream可用來(lái)將文件中的數(shù)據(jù)讀取到內(nèi)存中,F(xiàn)ileIutputStream類,即文件輸入流,是用于將字節(jié)數(shù)據(jù)讀入到內(nèi)存的輸入。FileOutputStream類常用的構(gòu)造方法:構(gòu)造方法名稱功能描述FileIutputStream(Filefile)通過(guò)打開(kāi)一個(gè)到實(shí)際文件的連接來(lái)創(chuàng)建一個(gè)FileInputStream,該文件通過(guò)文件系統(tǒng)中的File對(duì)象file指定。FileIutputStream(Stringname)通過(guò)打開(kāi)一個(gè)到實(shí)際文件的連接來(lái)創(chuàng)建一個(gè)FileInputStream,該文件通過(guò)文件系統(tǒng)中的路徑名name指定。02
輸入流InputStream
我們可以把內(nèi)存中的數(shù)據(jù)寫(xiě)出到文件中,那怎樣把文件中的數(shù)據(jù)讀到內(nèi)存中,我們通過(guò)InputStream實(shí)現(xiàn)。InputStream是抽象類,是表示字節(jié)輸入流的所有類的超類,定義了字節(jié)輸入流的基本共性功能方法。方法名稱功能描述intread()從輸人流讀取一個(gè)8位的字節(jié),把它轉(zhuǎn)換為0—255之間的整數(shù),并返回這一整數(shù)
intread(byte[]b)從輸入流讀取若干字節(jié),把它們保存到參數(shù)b指定的字節(jié)數(shù)組中,返回的整數(shù)表示讀取字節(jié)數(shù)
intread(byte[]b,inoff,intlen)從輸人流讀取若干字節(jié),把它們保存到參數(shù)b指定的字節(jié)數(shù)組中,off指定字節(jié)數(shù)組開(kāi)始保存數(shù)據(jù)的起始下標(biāo),len表示讀取的字節(jié)長(zhǎng)度voidclose()關(guān)閉此輸人流并釋放與該流關(guān)聯(lián)的所有系統(tǒng)資源IutputStream有很多子類,其中子類FileInputStream可用來(lái)將文件中的數(shù)據(jù)讀取到內(nèi)存中,F(xiàn)ileIutputStream類,即文件輸入流,是用于將字節(jié)數(shù)據(jù)讀入到內(nèi)存的輸入。FileOutputStream類常用的構(gòu)造方法:構(gòu)造方法名稱功能描述FileIutputStream(Filefile)通過(guò)打開(kāi)一個(gè)到實(shí)際文件的連接來(lái)創(chuàng)建一個(gè)FileInputStream,該文件通過(guò)文件系統(tǒng)中的File對(duì)象file指定。FileIutputStream(Stringname)通過(guò)打開(kāi)一個(gè)到實(shí)際文件的連接來(lái)創(chuàng)建一個(gè)FileInputStream,該文件通過(guò)文件系統(tǒng)中的路徑名name指定。02
輸入流InputStreamFileIutputStream類是IutputStream抽象類的一個(gè)具體實(shí)現(xiàn)類,專門(mén)用于文件的讀取操作,現(xiàn)在通過(guò)一個(gè)具體的案例來(lái)學(xué)習(xí)文件的讀取操作。publicclassDemo5_1{publicstaticvoidmain(String[]args)throwsIOException{FileInputStreamfs=newFileInputStream("e:\\123.txt");//根據(jù)文件路徑,創(chuàng)建一個(gè)文件輸入流對(duì)象
intcontent=fs.read();//讀取一個(gè)字節(jié)的二進(jìn)制流,賦值給content變量
while(content!=-1){//如果數(shù)據(jù)讀完,返回值為-1.System.out.print((char)content);content=fs.read();//繼續(xù)讀取數(shù)據(jù)
}}}publicclassDemo5_2{publicstaticvoidmain(String[]args)throwsIOException{FileInputStreamfs=newFileInputStream("e:\\123.txt");byte[]bytes=newbyte[1024];//創(chuàng)建字節(jié)數(shù)組
intlength=fs.read(bytes);//一次性讀取數(shù)組大小的數(shù)據(jù),返回讀取數(shù)據(jù)的長(zhǎng)度
while(length!=-1){//如果length!=-1,說(shuō)明文件數(shù)據(jù)沒(méi)有讀完
System.out.println(newString(bytes,0,length));//將每次讀取的字節(jié)數(shù)組重構(gòu)成字符串打印輸出
length=fs.read(bytes);//繼續(xù)讀取數(shù)據(jù)。
}}}02
字節(jié)流的方式完成文件復(fù)制通過(guò)上面的方法完成,很顯然效率太低,為了提高復(fù)制效率,我們可以將一個(gè)文件通過(guò)輸入流讀取多個(gè)字節(jié)到內(nèi)存中,那么這個(gè)內(nèi)存中的字節(jié)數(shù)組可以通過(guò)輸出流寫(xiě)入到另一個(gè)文件中,循環(huán)讀取寫(xiě)入,就可以完成一個(gè)文件到另一個(gè)文件的復(fù)制工作。代碼如下:publicclassDemo6_2{
publicstaticvoidmain(String[]args)throwsIOException{
FileInputStreamfin=newFileInputStream("e:\\123.txt");
FileOutputStreamfout=newFileOutputStream("e:\\456.txt");
byte[]bytes=newbyte[1024];
intlength=fin.read(bytes);
//讀一個(gè)字節(jié)到內(nèi)存length
while(length!=-1){
fout.write(bytes,0,length);
//將內(nèi)存中的一個(gè)字節(jié)length寫(xiě)入到文件
length=fin.read(bytes);
}
System.out.println("復(fù)制完成");
fout.close();
fin.close();
}
}02
字節(jié)流的方式完成文件復(fù)制將一個(gè)文件通過(guò)輸入流讀取一個(gè)字節(jié)到內(nèi)存中,那么這個(gè)內(nèi)存中的字節(jié)可以通過(guò)輸出流寫(xiě)入到另一個(gè)文件中,循環(huán)讀取寫(xiě)入,就可以完成一個(gè)文件到另一個(gè)文件的復(fù)制工作。publicclassDemo6_1{
publicstaticvoidmain(String[]args)throwsIOException{
FileInputStreamfin=newFileInputStream("e:\\123.txt");
FileOutputStreamfout=newFileOutputStream("e:\\456.txt");
intlength=fin.read();
//讀一個(gè)字節(jié)到內(nèi)存length
while(length!=-1){
fout.write(length);
//將內(nèi)存中的一個(gè)字節(jié)length寫(xiě)入到文件
length=fin.read();
}
System.out.println("復(fù)制完成");
fout.close();
fin.close();
}
}02
字節(jié)緩沖流在jdk中還提供兩個(gè)帶緩沖的字節(jié)流,分別是BufferedlnputStream和BufferdOutputStream,它們的構(gòu)造方法中分別接收InputStream和OutputStream類型的參數(shù),在讀寫(xiě)數(shù)據(jù)時(shí)提供緩沖功能。應(yīng)用程序、緩沖流和底層字節(jié)流之間的關(guān)系,如下圖所示。從圖中可以看出應(yīng)用程序是通過(guò)緩沖流來(lái)完成數(shù)據(jù)讀寫(xiě)的,而緩沖流又是通過(guò)底層字節(jié)流與設(shè)備進(jìn)行關(guān)聯(lián)的,接下來(lái)先來(lái)看一下BufferedlnputStream和BufferedOutputStream這兩個(gè)流的構(gòu)造方法,如下表所示:構(gòu)造方法功能描述1、BufferedlnputStream
BufferedInputStream(InputStream
in)通過(guò)InputStream
流對(duì)象,創(chuàng)建一個(gè)BufferedInputStream緩沖流,BufferedInputStream(InputStream
in,int
size)通過(guò)InputStream
流對(duì)象,創(chuàng)建具有指定緩沖區(qū)大小的BufferedInputStream緩沖流2、BufferedOutputStream
BufferedOutputStream(OutputStream
out)
創(chuàng)建一個(gè)新的緩沖輸出流,以將數(shù)據(jù)寫(xiě)入指定的底層輸出流。BufferedOutputStream(OutputStream
out,int
size)創(chuàng)建一個(gè)新的緩沖輸出流,以將具有指定緩沖區(qū)大小的數(shù)據(jù)寫(xiě)入指定的底層輸出流。02
節(jié)緩沖流案例如下:publicclassDemo7{
publicstaticvoidmain(String[]args)throwsException{
BufferedInputStreambin=newBufferedInputStream(newFileInputStream("e:\\H3C_CAS.pdf"));
BufferedOutputStreambout=newBufferedOutputStream(newFileOutputStream("e:\\123.pdf"));
intlen=bin.read();
while(len!=-1){
bout.write(len);
}
System.out.println("復(fù)制完成!");
bin.close();
bout.close();
}
}03
字符流概述前面我們學(xué)習(xí)過(guò)文件可以采用字節(jié)流進(jìn)行讀取,那么如果我們進(jìn)行讀取文本文件時(shí),是不是必須要采用字節(jié)流進(jìn)行讀取操作呢,不是的,我們可以直接采用字符流進(jìn)行讀取,為此JDK提供了字符流。同字節(jié)流一樣,字符流也有兩個(gè)抽象的頂級(jí)父類,分別是Reader和Writer。其中Reader是字符輸人流,用于從某個(gè)源設(shè)備讀取字符,Writer是字符輸出流,用于向某個(gè)目標(biāo)設(shè)備寫(xiě)人字符。Reader和Writer作為字符流的頂級(jí)父類,也有許多子類。字符輸出流WriterWriter是一個(gè)抽象類,是寫(xiě)入字符流的超類。操作的數(shù)據(jù)都是字符,定義了寫(xiě)入字符流的基本共性功能方法,常用方法如下:方法名稱功能描述voidwrite(intc)向輸出流寫(xiě)人一個(gè)字符voidwrite(char[]c)把參數(shù)c指定的字符數(shù)組的所有字符寫(xiě)到輸出流voidwrite(char[]c,intoff,intlen)將指定c數(shù)組中從偏移量off開(kāi)始的len個(gè)字符寫(xiě)人輸出流voidwrite(Stringstr)把參數(shù)str指定的字符串寫(xiě)到輸出流voidwrite(Stringstr,intoff,intlen)將指定str字符串中從偏移量off開(kāi)始的len個(gè)字符寫(xiě)人輸出流voidflush()刷新此輸出流并強(qiáng)制寫(xiě)出所有緩沖的輸出字符
voidclose()關(guān)閉此輸出流并釋放與此流相關(guān)的所有系統(tǒng)資源
03
字符流Writer有很多子類,其中子類FileWriter可用來(lái)寫(xiě)入字符到文件中去,F(xiàn)ileWriter類的常用構(gòu)造方法,如下:方法名稱功能描述FileWriter(File
file)根據(jù)給定的File對(duì)象構(gòu)造一個(gè)FileWriter對(duì)象。FileWriter(File
file,boolean
append)根據(jù)給定的File對(duì)象構(gòu)造一個(gè)FileWriter對(duì)象,如果append參數(shù)為真,則對(duì)文件進(jìn)行追加FileWriter(String
fileName)根據(jù)給定的文件名構(gòu)造一個(gè)FileWriter對(duì)象。FileWriter(String
fileName,boolean
append)
根據(jù)給定的文件名構(gòu)造一個(gè)FileWriter對(duì)象,如果append參數(shù)為真,則對(duì)文件進(jìn)行追加案例如下:publicclassDemo8{publicstaticvoidmain(String[]args)throwsIOException{FileWriterfileWriter=newFileWriter("e:\\456.txt");fileWriter.write("你好,朋友,一起去爬山吧!");fileWriter.close();}}03
字符流Reader是一個(gè)抽象類,是字符輸入流的超類。操作的數(shù)據(jù)都是字符,定義了輸入字符流的基本共性功能方法,常用方法如下:方法名稱功能描述intread()讀取單個(gè)字符。intread(char[]c)將字符讀入數(shù)組intread(char[]c,inoff,intlen)將字符讀入數(shù)組的某一部分。voidclose()關(guān)閉此輸人流并釋放與該流關(guān)聯(lián)的所有系統(tǒng)資源Reader有很多子類,其中子類FileReader可用來(lái)讀取字符到輸入流中,F(xiàn)ileReader類的常用構(gòu)造方法,如下:方法名稱功能描述FileReader(File
file)根據(jù)給定的File對(duì)象構(gòu)造一個(gè)FileReader對(duì)象。FileReader(String
fileName)根據(jù)給定的文件名構(gòu)造一個(gè)FileReade對(duì)象。03
字符流FileReader類是Reader抽象類的一個(gè)具體實(shí)現(xiàn)類,專門(mén)用于文本文件的讀取操作,現(xiàn)在通過(guò)一個(gè)具體的案例來(lái)學(xué)習(xí)文本文件的讀取,操作代碼如下:publicclassDemo9{
/**
*一個(gè)字符一個(gè)字符的讀取
*@throwsException
*/
@Test
publicvoidreadOne()throwsException{
FileReaderfileReader=newFileReader("e:\\456.txt");
intread=fileReader.read();
while(read!=-1){
System.out.print((char)read);
read=fileReader.read();
}fileReader.close();
}
/**
*一次性讀入到字符數(shù)組中
*@throwsException
*/
@Test
publicvoidreadBuff()throwsException{
FileReaderfileReader=newFileReader("e:\\456.txt");
char[]chars=newchar[100];
intlen=fileReader.read(chars);
while(len!=-1){
System.out.print(newString(chars,0,len));
len=fileReader.read(chars);
}
fileReader.close();}
}03
字符流字符緩沖流在jdk中還提供兩個(gè)帶緩沖的字符流,分別是BufferedReader和BufferdWriter,它們的構(gòu)造方法中分別接收Reader和Writer類型的參數(shù),在讀寫(xiě)數(shù)據(jù)時(shí)提供緩沖功能,和字節(jié)緩沖流的原理類似。BufferedReader和BufferdWriter的常用的讀入和寫(xiě)入方法,與FileReader和FileWriter類的常用方法類似,只不過(guò)BufferedReader提供了一個(gè)重要的方法readLine(),該方法用于一次讀取一行文本。接下來(lái)通過(guò)一個(gè)案例來(lái)學(xué)習(xí)如何使用這兩個(gè)緩沖流實(shí)現(xiàn)文件的拷貝,代碼如下。publicclassDemo10{
publicstaticvoidmain(String[]args)throwsException{
FileReaderfileReader=newFileReader("d:\\456.txt");
BufferedReaderbufferedReader=newBufferedReader(fileReader);
FileWriterfileWriter=newFileWriter("d:\\des.txt");
BufferedWriterbufferedWriter=newBufferedWriter(fileWriter);
Stringstr;
while((str=bufferedReader.readLine())!=null){
bufferedWriter.write(str);
bufferedWriter.newLine();//寫(xiě)入換行符
}
bufferedReader.close();
bufferedWriterclose();
}
}03
字符流轉(zhuǎn)換流學(xué)習(xí)了字節(jié)流和字符流,但有時(shí)候字節(jié)流和字符流之間也需要進(jìn)行轉(zhuǎn)換。在JDK中提供了兩個(gè)類可以將字節(jié)流轉(zhuǎn)換為字符流.它們分別是InputStreamReader和OutputStreamWriter。其中OutputStreamWriter是Writer的子類,它可以將一個(gè)字節(jié)輸出流轉(zhuǎn)換成字符輸出流,方便直接寫(xiě)入字符,而InputStreamReader是Reader的子類,它可以將一個(gè)字節(jié)輸入流轉(zhuǎn)換成字符輸人流,方便直接讀取字符。通過(guò)轉(zhuǎn)換流進(jìn)行數(shù)據(jù)讀寫(xiě)的過(guò)程,如下圖所示。為了提高讀寫(xiě)效率,可以通過(guò)BufferedReader和BufferedWriter對(duì)轉(zhuǎn)換流進(jìn)行封裝,代碼如下所示。publicclassDemo11{
publicstaticvoidmain(String[]args)throwsException{
FileInputStreamin=newFileInputStream(“d:\\456.txt”);
InputStreamReaderins=newInputStreamReader(in);
BufferedReaderbufferedReader=newBufferedReader(ins);
FileOutputStreamout=newFileOutputStream(“d:\\des.txt”);
OutputStreamWriterouts=newOutputStreamWriter(out);
BufferedWriterbufferedWriter=newBufferedWriter(outs);
Stringstr;
while((str=bufferedReader.readLine())!=null){
bufferedWriter.write(str);
bufferedWriter.newLine();
}
bufferedReader.close();
bufferedWriter.close();}}04
對(duì)象輸入輸出流概述:程序運(yùn)行時(shí),我們需要在內(nèi)存中創(chuàng)建多個(gè)對(duì)象,程序停止,這些對(duì)象就被當(dāng)作垃圾回收了,如果我們希望保存內(nèi)存中的對(duì)象數(shù)據(jù),則我們可以將對(duì)象轉(zhuǎn)換為字節(jié)保存在硬盤(pán)中,這個(gè)操作過(guò)程就叫做對(duì)象序列化過(guò)程。為此jdk為我們提供了對(duì)象輸出流(ObjectOutputStream)來(lái)實(shí)現(xiàn)對(duì)象的序列化。當(dāng)對(duì)象進(jìn)行序列化時(shí),必須保證該對(duì)象實(shí)現(xiàn)Serializable接口,否則程序會(huì)出現(xiàn)NotSerializableException異常。同樣我們也可以執(zhí)行反操作,就是將文件中的數(shù)據(jù)讀取到內(nèi)存,反序列化成對(duì)象。為此jdk為我們提供了對(duì)象輸入流(ObjectIntputStream)來(lái)實(shí)現(xiàn)對(duì)象的反序列化。對(duì)象輸出流(ObjectOutputStream)與對(duì)象輸入流(ObjectIntputStream)的構(gòu)造方法如下表所示:方法名稱功能描述ObjectInputStream(InputStream
in)根據(jù)給定的輸入流對(duì)象構(gòu)造一個(gè)ObjectIntputStream對(duì)象。ObjectOutputStream(OutputStream
out)根據(jù)給定的輸出流構(gòu)造一個(gè)ObjectOutputStream對(duì)象。從構(gòu)造方式上看,可以根據(jù)一個(gè)輸入和輸出流創(chuàng)建一個(gè)對(duì)象的輸入和輸出流。對(duì)象輸出流(ObjectOutputStream)與對(duì)象輸入流(ObjectIntputStream)常用方法列表如下:方法名稱功能描述voidwriteObject(Object
obj)ObjectOutputStream類的方法,將一個(gè)對(duì)象進(jìn)行寫(xiě)入。
Object
readObject()ObjectIntputStream類的方法,從輸入流中讀取對(duì)象,返回object數(shù)據(jù)類型04
對(duì)象輸入輸出流如何將Student對(duì)象序列化,保存在硬盤(pán)上和從一個(gè)文件中讀取對(duì)象的兩個(gè)過(guò)程。代碼如下:publicclassDemo12{
@Test
publicvoidwriteStudent()throwsException{
Studentstudent=newStudent();
student.id=1001;
student.name="張三";
student.age=25;
FileOutputStreamfileOutputStream=newFileOutputStream("d:\\oop.txt");
ObjectOutputStreamoot=newObjectOutputStream(fileOutputStream);
oot.writeObject(student);//將學(xué)生對(duì)象寫(xiě)入到文件中
}
publicvoidreadStudent()throwsException{
FileInputStreamfileInputStream=newFileInputStream("d:\\oop.txt");
ObjectInputStreamooi=newObjectInputStream(fileInputStream);
Studentstudent=(Student)ooi.readObject();//從文件中讀取對(duì)象到內(nèi)存中
System.out.println(student.id+"\t"+student.name+"\t"+student.age);
}
}
classStudentimplementsSerializable{
intid;
Stringname;
intage;
}
05
PrintStream流2、概述:輸出流寫(xiě)數(shù)據(jù)時(shí),只能輸出字節(jié)或字符類型的數(shù)據(jù)。如果希望輸出其他類型。例如一個(gè)基本數(shù)據(jù)類型的int值、一個(gè)Student類型的對(duì)象等,此時(shí)需要將數(shù)據(jù)先轉(zhuǎn)為字符串再輸出。這種操作方式顯然比較麻煩,為此在jdk中提供了一個(gè)PrintStream類。它提供了一系列用于打印數(shù)據(jù)的print()和println()方法,被稱作打印流PrintStream。它可以實(shí)現(xiàn)將基本數(shù)據(jù)類型的數(shù)據(jù)或引用數(shù)據(jù)類型的對(duì)象格式化成字符串后再輸出。PrintStream流常用的構(gòu)造方法,如下所示:
構(gòu)造方法名稱功能描述PrintStream(OutputStream
out)創(chuàng)建新的打印流。PrintStream(String
fileName)創(chuàng)建具有指定文件名稱且不帶自動(dòng)行刷新的新打印流。PrintStream(File
file)創(chuàng)建具有指定文件且不帶自動(dòng)行刷新的新打印流。PrintStream流常用方法,方法列表,如下表:方法名稱功能描述print(String
s)打印Stringprintln(String
x)打印String,然后終止該行。flush()
刷新該流的緩沖。close()關(guān)閉此輸出流并釋放與此流相關(guān)的所有系統(tǒng)資源
05
PrintStream流案例如下:publicclassDemo13{
publicstaticvoidmain(String[]args)throwsFileNotFoundException{
PrintStreamps=newPrintStream("d:\\teacher.txt");
ps.println("1");
ps.println("教師信息如下:");
ps.println(newTeacher(2001,"謝老師",30));
ps.close();
}
}
classTeacher{
intid;
Stringname;
intage;
publicTeacher(intid,Stringname,intage){
this.id=id;
this.name=name;
this.age=age;
}
@Override
publicStringtoString(){
return"教師編號(hào)"+id+",姓名為:"+name+",年齡為:"+age;
}
}
06
字符編碼概述:我們知道計(jì)算機(jī)底層數(shù)據(jù)存儲(chǔ)的都是二進(jìn)制數(shù)據(jù),而我們生活中的數(shù)據(jù)是各種類型的,如何將生活中的數(shù)據(jù)與計(jì)算機(jī)中存儲(chǔ)的二進(jìn)制數(shù)據(jù)對(duì)應(yīng)起來(lái)呢?就是所謂的計(jì)算機(jī)編碼,意思就是說(shuō),每種數(shù)據(jù)采用一種特定的映射與二進(jìn)制數(shù)據(jù)對(duì)應(yīng)起來(lái)。這種對(duì)應(yīng)關(guān)系我們就叫做編碼表。當(dāng)我們?cè)诖鎯?chǔ)字符時(shí),字符先要依據(jù)編碼表編碼成二進(jìn)制,然后再寫(xiě)入到文件中。同樣當(dāng)我們?cè)谧x取字符文件時(shí),我們讀到的二進(jìn)制,需要依據(jù)相同的編碼表解碼成字符。我們經(jīng)??吹降膩y碼的原因,主要是因?yàn)椋幋a和解碼不是采用相同的編碼表造成的。比如當(dāng)我們?cè)诖鎯?chǔ)字符“你好”兩個(gè)字時(shí),我們采用utf-8進(jìn)行編碼存儲(chǔ),而我們讀取這兩個(gè)字符時(shí),采用gbk的編碼進(jìn)行解碼,那么解碼出的字符自然是亂碼,因?yàn)榫幋a和解碼依據(jù)的編碼表不一致。
06
字符編碼
針對(duì)不同的文字,每個(gè)國(guó)家都制定了自己的碼表,下面就來(lái)介紹幾種最常用的字符碼表,如下表所示。
碼表碼表描述ASCII美國(guó)標(biāo)準(zhǔn)信息交換碼,使用7位二進(jìn)制數(shù)來(lái)表示所有的大小寫(xiě)字母、數(shù)字0-9、標(biāo)點(diǎn)符號(hào)以及在美式英語(yǔ)中使用的特殊控制字符ISO8859-1拉丁碼表,兼容ASCII,還包括了西歐語(yǔ)言、希臘語(yǔ)、泰語(yǔ)、阿拉伯語(yǔ)等GB2312中文碼表,兼容ASCII,每個(gè)英文占1個(gè)字節(jié),中文占2個(gè)字節(jié)(2個(gè)字節(jié)都為負(fù)數(shù),最高位都為1)GBK,GB18030兼容GB2312,包含更多中文,每個(gè)英文占一個(gè)字節(jié),中文占2個(gè)字節(jié)(第1個(gè)字節(jié)為負(fù)數(shù),第2個(gè)字節(jié)可正可負(fù))Unicode國(guó)際標(biāo)準(zhǔn)碼,它為每種語(yǔ)言中的每個(gè)字符設(shè)定了統(tǒng)一并且唯一的二進(jìn)制編碼,以滿足跨語(yǔ)言、跨平臺(tái)進(jìn)行文本轉(zhuǎn)換、處理的要求,每個(gè)字符占2個(gè)字節(jié)。Java中存儲(chǔ)的字符類型就是使用Unicodc編碼
UTF-8是針對(duì)Unicode的可變長(zhǎng)編碼,可以用來(lái)表示Unicode標(biāo)準(zhǔn)中的任何字符,其中,英文占1個(gè)字節(jié),中文占3個(gè)字節(jié),這是程序開(kāi)發(fā)中最常用的字符碼表。06
字符編碼字符編碼和解碼:在Java編程中,經(jīng)常會(huì)出現(xiàn)字符轉(zhuǎn)換為字節(jié)或者字節(jié)轉(zhuǎn)換為字符的操作,這兩種操作涉及到兩個(gè)概念,編碼(Encode)和解碼(Decode)。一般來(lái)說(shuō),把字符串轉(zhuǎn)換成計(jì)算機(jī)識(shí)別的字節(jié)序列稱為編碼,而把字節(jié)序列轉(zhuǎn)換為普通人能看懂的明文字符串稱為解碼,在計(jì)算機(jī)程序中,如果要把字節(jié)數(shù)組轉(zhuǎn)換為字符串,可以通過(guò)String類的構(gòu)造方法String(byte[]
bytes,Charset
charset)把字節(jié)數(shù)組按照指定的碼表解碼成字符串(如果沒(méi)有指定字符碼表,則用操作系統(tǒng)默認(rèn)的字符碼表,如中文的Windows系統(tǒng)默認(rèn)使用的字符碼表是GBK)反之,可以通過(guò)使用String類中的getBytes(Charset
charset)方法把字符串按照指定的碼表編碼成字節(jié)數(shù)組。案例如下:publicclassDemo14{
publicstatic
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度攪拌車(chē)運(yùn)輸車(chē)輛融資租賃合同
- 2025年度鐵路貨物運(yùn)輸委托合同范本
- 2025年度建筑工程項(xiàng)目竣工驗(yàn)收備案服務(wù)協(xié)議
- 新生兒中耳炎的預(yù)防和護(hù)理
- 2025年度工礦產(chǎn)品回收與再利用合同模板
- 2025年度個(gè)人農(nóng)業(yè)項(xiàng)目墊資合作協(xié)議
- 2025年度光盤(pán)復(fù)制加工與數(shù)字版權(quán)保護(hù)合同
- 2025年度工業(yè)廢料石渣綜合利用采購(gòu)合同
- 2025年度智能光伏發(fā)電系統(tǒng)安裝及全生命周期運(yùn)維服務(wù)合同
- 2025年度戶外廣告牌租賃與廣告發(fā)布合同
- 2024年中考二輪專題復(fù)習(xí)道德與法治主觀題答題技巧(小論文)之演講稿
- 質(zhì)檢工作計(jì)劃書(shū)2025質(zhì)檢部工作計(jì)劃范文
- 《纏論的實(shí)戰(zhàn)技法》課件
- 新版標(biāo)準(zhǔn)化機(jī)電專業(yè)管理體系解讀課件
- 承包魚(yú)塘維修施工合同范例
- 耶魯綜合抽動(dòng)嚴(yán)重程度量表正式版
- 水利水電工程建設(shè)常見(jiàn)事故類型及典型事故分析(標(biāo)準(zhǔn)版)
- 《小學(xué)英語(yǔ)教學(xué)設(shè)計(jì)》課件全套 陳冬花 第1-10章 小學(xué)英語(yǔ)教學(xué)設(shè)計(jì)概述-小學(xué)英語(yǔ)課堂管理
- 政府采購(gòu)項(xiàng)目采購(gòu)需求調(diào)查指引文本
- 2024建筑用輻射致冷涂料
- 2024年浙江省公務(wù)員錄用考試《行測(cè)》題(A類)
評(píng)論
0/150
提交評(píng)論