《Java面向?qū)ο缶幊獭氛n件-第13章 io流處理_第1頁(yè)
《Java面向?qū)ο缶幊獭氛n件-第13章 io流處理_第2頁(yè)
《Java面向?qū)ο缶幊獭氛n件-第13章 io流處理_第3頁(yè)
《Java面向?qū)ο缶幊獭氛n件-第13章 io流處理_第4頁(yè)
《Java面向?qū)ο缶幊獭氛n件-第13章 io流處理_第5頁(yè)
已閱讀5頁(yè),還剩27頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論