一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

InputStream.read、OutputStream.write、Reader.read、Writer. write區(qū)別

 windli筆記 2011-09-16

InputStream.read()

返回int ,且范圍為0到255間int值 ,從輸入流讀取下一個數據字節(jié),它是以字節(jié)為單位來讀的,即每次只讀取一個字節(jié)內容 ,讀取后面三前面補三個字節(jié)的0,這樣讀取出來的結果就永遠為正,且為0到255間的數。如果因已到達流末尾而沒有可用的字節(jié),則返回值-1 。用于進制文件的讀取。 


如果我們讀取的是二進制文件,如圖片聲音文件時,我們應該使用如下兩種方式來讀?。?br>第一種 :還是使用InputStream.read(),方法來讀取,只不過我們把int型強制轉換byte型即可,這樣在轉換的過程中,會丟棄前三個字節(jié)所補的零,最終得到從流中讀取的真實的編碼。但如果這樣直接通過read()方法讀取,而不是通過read(byte[] b)時,我們判斷流是否結尾,最好使用available()方法來判斷,當然也可以使用直接比較讀出的結果是否為-1,但是要注意的是我們不能在讀取后強轉成byte型后再判斷,因為二進制文件有可能有-1的編碼。


第二種 :使用InputStream.read(byte[] b)來接收,因為這樣不會有byte到int提升的過程,byte數組b里存儲的就是真實的編碼。如果read(byte[] b)讀取到流的尾,則返回-1,所以我們直接判斷返回的讀取子節(jié)數就可知道流是否結束。

 

 

 

OutputStream.write(int b)

將指定的字節(jié)寫入此輸出流。write 的規(guī)定是:向輸出流寫入一個字節(jié)。要寫入的字節(jié)是參數b的八個低位。b 的24個高位將被忽略。此方法能向文件中寫入負數編碼,即可寫入二進制流的文件,如聲音、圖片等文件。

 

 

我們再來看看Reader與Writer字符流相應方法:

Reader.read

Reader.read:讀取單個字符。在有可用字符、發(fā)生 I/O 錯誤或者已到達流的末尾前,此方法一直阻塞。范圍在 0 到 65535 之間 (0x00-0xffff),實質上讀取出來的就是一個char型,即為Unicode編碼了。如果已到達流的末尾,則返回 -1

 

Writer. write(int c)

Writer. write(int c):寫入單個字符。要寫入的字符包含在給定整數值的 16 個低位中,16 高位被忽略。

 

從上面可以看出是兩類字符流,一種是字節(jié)流,另一種是字符流,如果我們讀取/寫入的是一個二進制文件,則使用字節(jié)流InputStream.read/OutputStream.write;如果我們讀取/寫入的是一個字符文件,則使用字符流Reader.read/Writer.write會很方便,當然字符流也可以使用字節(jié)流來操作,只是在某些情況下不是很方便。

 

 

Java代碼 復制代碼 收藏代碼
  1. import java.io.File;   
  2. import java.io.FileInputStream;   
  3. import java.io.FileNotFoundException;   
  4. import java.io.FileOutputStream;   
  5. import java.io.IOException;   
  6.   
  7. import junit.framework.TestCase;   
  8.   
  9. public class TestBinaryStreamReadWrite extends TestCase {   
  10.     /*  
  11.      * 寫二進制文件(如聲音文件)時,只能使用字節(jié)流寫。outputStream.write方法 只寫入最低八位,  
  12.      * 前三字節(jié)會丟棄掉,只存儲最后一字節(jié)  
  13.      */  
  14.     public void testCreateByteFile() {   
  15.         try {   
  16.             FileOutputStream fo = new FileOutputStream("e:/tmp/tmp");   
  17.             byte b = -1;   
  18.             //向文件寫兩個-1,沒有編碼為-1的字符,所以創(chuàng)建出的文件為純二進制文件   
  19.             fo.write(b);   
  20.             fo.write(b);   
  21.             fo.close();   
  22.         } catch (FileNotFoundException e) {   
  23.             e.printStackTrace();   
  24.         } catch (IOException e) {   
  25.             e.printStackTrace();   
  26.         }   
  27.     }   
  28.   
  29.     /*  
  30.      * InputStream.read方式是讀取一個字節(jié)內容后,以int型返回,在這之間有一個轉換的過程:當讀  
  31.      * 取一個字節(jié)內容后,會在這八位二進制前再補24位二進制的0,所以最后返回的字節(jié)編碼為正數,永不  
  32.      * 會為負數,且范圍為0-255間的整數。這樣如果使用read方法讀取二進制文件時,讀出的編碼是整數,  
  33.      * 原本可能為負編碼,最終顯示成了正編碼。為了確保得到正確的原本二進制編碼,在讀取后只能強制轉  
  34.      * 換成byte型,或使用read(byte b)方式來讀取。  
  35.      */  
  36.     public void testReadEncodeError() {   
  37.         try {   
  38.             FileInputStream fi = new FileInputStream("e:/tmp/tmp");   
  39.             //read方ifc讀取的一個字節(jié)內容,返回0到255范圍內的int字節(jié)值,如果因已到達流   
  40.             //末尾而沒有可用的字節(jié),則返回值-1   
  41.   
  42.             int readInt = fi.read();   
  43.             //如果已到達文件末尾,則返回-1。雖然的文件中的每個字節(jié)的內容都是-1,但讀出來的不是-1,   
  44.             //所以第二個字節(jié)也能輸出,而不會出現只能讀取第一個字節(jié),第二個字節(jié)讀不出的問題   
  45.             while (readInt != -1) {   
  46.                 //輸入兩個255,但輸入的編碼是錯誤的,應該為-1才對   
  47.                 System.out.println(readInt);   
  48.                 //讀下一字節(jié)   
  49.                 readInt = fi.read();   
  50.             }   
  51.             fi.close();   
  52.         } catch (FileNotFoundException e) {   
  53.             e.printStackTrace();   
  54.         } catch (IOException e) {   
  55.             e.printStackTrace();   
  56.         }   
  57.     }   
  58.   
  59.     /*  
  60.      * 使用InputStream.read讀取出的編碼如果經過強轉換byte型后,我們就不能再使用 readByte   
  61.      * != -1 來判斷文件流是否結束了,因為如果為二進制文件,讀出的編碼就有 為負的,總之,如果讀取  
  62.      * 的是二進制文件,就不能直接使用真實編碼與-1比較,只能使用available或通InputStream.read  
  63.      * (byte[] b)方法返回的所讀字節(jié)數來判斷  
  64.      */  
  65.     public void testAvailable() {   
  66.         try {   
  67.             File file =  new File("e:/tmp/tmp");   
  68.             FileInputStream fi = new FileInputStream(file);   
  69.             System.out.println("available實質上與file的length相同:" +file.length());   
  70.             //當使用read方法讀取出的編碼后經強轉byte后,不能使用 (byte) fi.read() != -1 來   
  71.             //判斷是文件流是否結束,這里我們只能使用available來判斷是否達文件尾   
  72.             while (fi.available() > 0) {   
  73.                 System.out.println("available=" + fi.available());   
  74.                 //使用read()方法讀取字節(jié)內容的編碼后,只能強轉byte型才能得到真實的編碼   
  75.                 System.out.println((byte) fi.read());   
  76.             }   
  77.             fi.close();   
  78.         } catch (FileNotFoundException e) {   
  79.             e.printStackTrace();   
  80.         } catch (IOException e) {   
  81.             e.printStackTrace();   
  82.         }   
  83.     }   
  84.   
  85.     /*  
  86.      * 讀取二進制文件(如圖片)而非字符文件時,除了使用read()讀取強轉byte型,使用 InputStream.  
  87.      * read(byte[] b)是最好的方式,此時使用讀取返回的字節(jié)數來判斷是否讀完  
  88.      */  
  89.     public void testReadByByteArr() {   
  90.         try {   
  91.             FileInputStream fi = new FileInputStream("e:/tmp/tmp");   
  92.             byte[] byteArr = new byte[1024];   
  93.             //讀取的字節(jié)數   
  94.             int readCount = fi.read(byteArr);   
  95.             //如果已到達文件末尾,則返回-1   
  96.             while (readCount != -1) {   
  97.                 for (int i = 0; i < readCount; i++) {   
  98.                     System.out.println(byteArr[i]);   
  99.                 }   
  100.                 readCount = fi.read(byteArr);   
  101.             }   
  102.             fi.close();   
  103.   
  104.         } catch (FileNotFoundException e) {   
  105.             e.printStackTrace();   
  106.         } catch (IOException e) {   
  107.             e.printStackTrace();   
  108.         }   
  109.     }   
  110.   
  111.     /*  
  112.      * 使用InputStream.read讀取二進制文件強轉換byte型獲取真實編碼后,不能使用readByte !=   
  113.      * -1 來判斷是否到文件尾  
  114.      */  
  115.     public void testGetBytecodeByConvernt() {   
  116.         try {   
  117.             FileInputStream fi = new FileInputStream("e:/tmp/tmp");   
  118.             //讀取的一個字節(jié)內容,強制轉byte型,得到真實的編碼   
  119.             byte readByte = (byte) fi.read();   
  120.             //這里我們不能使用如下方式來判斷是否讀流結束,因為編碼內容本身就是-1,所以不會輸出任何內容   
  121.             while (readByte != -1) {   
  122.                 System.out.println((byte) readByte);   
  123.                 readByte = (byte) fi.read();   
  124.             }   
  125.             fi.close();   
  126.         } catch (FileNotFoundException e) {   
  127.             e.printStackTrace();   
  128.         } catch (IOException e) {   
  129.             e.printStackTrace();   
  130.         }   
  131.     }   
  132. }  

    本站是提供個人知識管理的網絡存儲空間,所有內容均由用戶發(fā)布,不代表本站觀點。請注意甄別內容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現有害或侵權內容,請點擊一鍵舉報。
    轉藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多

    国产三级不卡在线观看视频| 国产麻豆精品福利在线| 中文人妻精品一区二区三区四区| 亚洲国产综合久久天堂| 91欧美日韩一区人妻少妇| 国产大屁股喷水在线观看视频| 国产精品久久精品国产| 亚洲成人精品免费在线观看| 翘臀少妇成人一区二区| 国产免费黄片一区二区| 好吊视频有精品永久免费| 国内自拍偷拍福利视频| 亚洲欧美中文字幕精品| 一级片黄色一区二区三区| 日韩国产亚洲欧美激情| 午夜视频成人在线观看| 欧美人妻盗摄日韩偷拍| 中文字幕人妻日本一区二区| 国产亚洲精品久久99| 日韩人妻av中文字幕| 国内九一激情白浆发布| 久久精品国产一区久久久| 福利一区二区视频在线| 日本加勒比系列在线播放| 国产三级视频不卡在线观看| 日本午夜免费啪视频在线| 亚洲精品国产福利在线| 亚洲成人免费天堂诱惑| 日本丰满大奶熟女一区二区| 国产在线观看不卡一区二区| 亚洲精品国产福利在线| 日韩欧美亚洲综合在线| 国产一区二区三区草莓av| 91老熟妇嗷嗷叫太91| 亚洲国产性生活高潮免费视频| 欧美一区二区口爆吞精| 亚洲精品深夜福利视频| 日本视频在线观看不卡| 91麻豆精品欧美视频| 在线观看视频国产你懂的| 午夜久久久精品国产精品|