您好,歡迎來(lái)電子發(fā)燒友網(wǎng)! ,新用戶?[免費(fèi)注冊(cè)]

您的位置:電子發(fā)燒友網(wǎng)>源碼下載>java源碼下載>

java 字節(jié)流轉(zhuǎn)字符流

大?。?/span>0.8 MB 人氣: 2017-09-27 需要積分:1

  一、字節(jié)流

  1)輸入和輸出流

  首先,字節(jié)流要進(jìn)行讀和寫,也就是輸入和輸出,所以它有兩個(gè)抽象的父類InputStream、OutputStream。

  InputStream抽象了應(yīng)用程序讀取數(shù)據(jù)的方式,即輸入流。

  OutputStream抽象了應(yīng)用程序?qū)懗鰯?shù)據(jù)的方式,即輸出流。

  2)讀寫結(jié)束

  在字節(jié)流中當(dāng)讀寫結(jié)束,達(dá)到文件結(jié)尾時(shí),稱為EOF = End或者讀到-1就讀到結(jié)尾。

  3)輸入流基本方法

  首先我們要清楚輸入流是什么。比如通過(guò)我們的鍵盤在文本文件上輸入內(nèi)容,這個(gè)過(guò)程鍵盤充當(dāng)?shù)木褪禽斎肓鳎皇禽敵隽?。因?yàn)殒I盤的功能是將內(nèi)容輸入到系統(tǒng),系統(tǒng)再寫入到文件上。以下是輸入流的基本方法read():

  intb = in.read(); //讀取一個(gè)字節(jié)無(wú)符號(hào)填充到int低八位。-1是EOF。in.read( byte[] buf); //讀取數(shù)據(jù)填充到字節(jié)數(shù)組buf中。返回的是讀到的字節(jié)個(gè)數(shù)。in.read( byte[] buf, intstart,intsize) //讀取數(shù)據(jù)到字節(jié)數(shù)組buf從buf的start位置開始存放size長(zhǎng)度分?jǐn)?shù)據(jù)

  其中in是InputStream抽象類的實(shí)例,可以發(fā)現(xiàn)這個(gè)方法和RandomAccessFile類中的read()方法差不多,因?yàn)閮烧叨际峭ㄟ^(guò)字節(jié)來(lái)讀取的。

  4)輸出流基本方法

  輸出流是進(jìn)行寫的操作,其基本操作方法是write(),可以將此方法與輸入read()方法一 一去對(duì)應(yīng),更好理解。

  1out.write( intb) //寫出一個(gè)byte到流,b的低8位2out.write( byte[] buf) //將buf字節(jié)數(shù)組都寫到流3out.write( byte[] buf, intstart, intsize) //字節(jié)數(shù)組buf從start位置開始寫size長(zhǎng)度的字節(jié)到流

  了解了InputStream、OutputStream的基本操作方法后,再來(lái)看看它們兩個(gè)的“孩子”FileInputStream和FileOutputStream。

  這兩個(gè)子類具體實(shí)現(xiàn)了在文件上讀取和寫入數(shù)據(jù)的操作,日程編程中更多的是使用這兩個(gè)類。

  二、FileInputStream和FileOutputStream類的使用

  —————–FileInputStream類的使用

  1.使用read()方法讀取文件

  /** * 讀取指定文件內(nèi)容,按照16進(jìn)制輸出到控制臺(tái) * 并且每輸出10個(gè)byte換行 *@throwsFileNotFoundException */publicstaticvoidprintHex(String fileName)throwsIOException{ //把文件作為字節(jié)流進(jìn)行讀操作FileInputStream in=newFileInputStream(fileName); intb; intcount= 0; //計(jì)數(shù)讀到的個(gè)數(shù)while((b=in.read())!=- 1){ if(b《= 0xf){ //單位數(shù)前面補(bǔ)0System.out.println( “0”); } System.out.print(Integer.toHexString(b& 0xff)+ “ ”); if(++count% 10== 0){ System.out.println(); } } in.close(); //一定要關(guān)閉流}

  運(yùn)行結(jié)果(隨便一個(gè)文件來(lái)測(cè)試的):

  java 字節(jié)流轉(zhuǎn)字符流

  注意:

  - FileInputStream()構(gòu)造函數(shù)可以通過(guò)文件名(String)也可以通過(guò)File對(duì)象。上面的案例是使用文件名來(lái)構(gòu)造的。

  - (b=in.read())!=-1 通過(guò)讀到-1來(lái)判斷是否讀到文件結(jié)尾。

  - in.close() 使用完IO流的對(duì)象一定要關(guān)閉流,養(yǎng)成好習(xí)慣很重要。

  2.使用read(byte[] buf,int start, int size)方法讀取文件

  上述方法只能一個(gè)一個(gè)字節(jié)讀取,對(duì)于較大的文件效率太低,推薦使用這個(gè)方法來(lái)一次性讀取文件。

  publicstaticvoidprintHexByBytes(String fileName) throws IOException{ FileInputStream in=newFileInputStream(fileName); byte[] buf= newbyte[ 20* 1024]; //開辟一個(gè)20k大小的字節(jié)數(shù)組/* * 從in中批量讀取字節(jié),放入到buf這個(gè)字節(jié)數(shù)組中 * 從第0個(gè)位置開始放,最多放buf.length個(gè) * 返回的是讀到的字節(jié)個(gè)數(shù) *///一次性讀完的情況intcount= in.read(buf, 0, buf.length); intj= 1; for( inti= 0;i《count;i++){ if((buf[i]& 0xff)《= 0xf){ //單位數(shù)前面補(bǔ)0System.out.print( “0”); } System. out.print(Integer.toHexString(buf[i]& 0xff)+ “ ”); if(j++% 10== 0){ System. out.println(); } } in.close(); } }

  read(byte[] buf,int start, int size)返回的是讀到的字節(jié)個(gè)數(shù),即buf字節(jié)數(shù)組的有效長(zhǎng)度,所以輸出buf數(shù)組時(shí)用的長(zhǎng)度是count而不是buf.length,因?yàn)槲覀儾恢牢募笮『蛿?shù)組大小的關(guān)系,上述方法適用于文件大小不超過(guò)數(shù)組大小的情況下,一次性把文件內(nèi)容讀取到數(shù)組里,這里就有一個(gè)問題了,如果文件大小超過(guò)數(shù)組大小,那又該如何讀取才能把文件全部讀完呢??

  我們知道讀到-1就是讀到文件末,所以還是利用while循環(huán)重復(fù)讀取直到讀到-1結(jié)束循環(huán),把上述代碼修改后如下:

  publicstaticvoidprintHexByBytes(String fileName) throws IOException{ FileInputStream in=newFileInputStream(fileName); byte[] buf= newbyte[ 20* 1024]; //開辟一個(gè)20k大小的字節(jié)數(shù)組/* * 從in中批量讀取字節(jié),放入到buf這個(gè)字節(jié)數(shù)組中 * 從第0個(gè)位置開始放,最多放buf.length個(gè) * 返回的是讀到的字節(jié)個(gè)數(shù) */intj= 1; //一個(gè)字節(jié)數(shù)組讀不完的情況,用while循環(huán)重復(fù)利用此數(shù)組直到讀到文件末=-1intb= 0; while((b= in.read(buf, 0, buf.length))!=- 1){for( inti= 0;i《b;i++){ if((buf[i]& 0xff)《= 0xf){ //單位數(shù)前面補(bǔ)0System. out.print( “0”); } System. out.print(Integer.toHexString(buf[i]& 0xff)+ “ ”); if(j++% 10== 0){ System.out.println(); } } } in.close(); } }

  好了,我們用一個(gè)大于數(shù)組的文件來(lái)測(cè)試一下結(jié)果(太長(zhǎng),只截圖末尾):

  java 字節(jié)流轉(zhuǎn)字符流

  大家可以比較兩者的不同,第二種優(yōu)化后更適合日常的使用,因?yàn)闊o(wú)論文件大小我們都可以一次性直接讀完。

  —————–FileOutputStream類的使用

  FileOutputStream類和FileInputStream類的使用相類似,它實(shí)現(xiàn)了向文件中寫出btye數(shù)據(jù)的方法。里面的一些細(xì)節(jié)跟FileInputStream差不多的我就不提了,大家自己可以理解的。

  1.構(gòu)造方法

  FileOutputStream類構(gòu)造時(shí)根據(jù)不同的情況可以使用不同的方法構(gòu)造,如:

  1//如果該文件不存在,則直接創(chuàng)建,如果存在,刪除后創(chuàng)建2FileOutputStream out=newFileOutputStream( “demo/new1.txt”); //以路徑名稱構(gòu)造1//如果該文件不存在,則直接創(chuàng)建,如果存在,在文件后追加內(nèi)容2FileOutputStream out= newFileOutputStream(“demo/new1.txt”, true);

  更多內(nèi)容可以查詢API。

  2.使用write()方法寫入文件

  write()方法和read()相似,只能操作一個(gè)字節(jié),即只能寫入一個(gè)字節(jié)。例如:

  1out.wirte(‘A’) ;//寫出了‘A’的低八位2int a= 10;//wirte只能寫八位,那么寫一個(gè)int需要寫4次,每次八位3out.write(a》》》 24) ;4out.write(a》》》 16) ;5out.write(a》》》 8) ;6out.wirte(a) ;

  每次只寫一個(gè)字節(jié),顯然是不效率的,OutputStream當(dāng)然跟InputStream一樣可以直接對(duì)byte數(shù)組操作。

  3.使用write(byte[] buf,int start, int size)方法寫入文件

  意義:把byte[]數(shù)組從start位置到size位置結(jié)束長(zhǎng)度的字節(jié)寫入到文件中。

  語(yǔ)法格式和read相同,不多說(shuō)明

  三、FileInputStream和FileOutputStream結(jié)合案例

  了解了InputStream和OutputStream的使用方法,這次結(jié)合兩者來(lái)寫一個(gè)復(fù)制文件的方法。

  publicstaticvoidcopyFile(File srcFile,F(xiàn)ile destFile)throws IOException{ if(!srcFile.exists()){thrownewIllegalArgumentException( “文件:”+srcFile+ “不存在”); } if(!srcFile.isFile()){thrownewIllegalArgumentException(srcFile+ “不是一個(gè)文件”); } FileInputStream in=newFileInputStream(srcFile); FileOutputStream out= newFileOutputStream(destFile);byte[] buf= newbyte[ 8* 1024]; intb; while((b= in.read(buf, 0, buf.length))!=- 1){out.write(buf, 0, b); out.flush(); //最好加上} in.close(); out.close(); }

非常好我支持^.^

(0) 0%

不好我反對(duì)

(0) 0%

      發(fā)表評(píng)論

      用戶評(píng)論
      評(píng)價(jià):好評(píng)中評(píng)差評(píng)

      發(fā)表評(píng)論,獲取積分! 請(qǐng)遵守相關(guān)規(guī)定!

      ?