Java學習之InputStream中read()與read(byte[] b)


http://dingchaoqun12.blog.163.com/blog/static/1160625042010931193284/

Java學習之InputStream中read()與read(byte[] b)

IT之旅 2010-06-01 12:43:28 閱讀105 評論0   字號: 訂閱

    這兩個方法在抽象類InputStream中都是作為抽象方法存在的,

       JDK API中是這樣描述兩者的:

 

read() :  從輸入流中讀取數據的下一個字節,返回0255范圍內的int字節值。如果因為已經到達流末尾而沒有可用的字節,則返回-1。在輸入數據可用、檢測到流末尾或者拋出異常前,此方法一直阻塞。

read(byte[] b) :  從輸入流中讀取一定數量的字節,並將其存儲在緩沖區數組 b 中。以整數形式返回實際讀取的字節數。在輸入數據可用、檢測到文件末尾或者拋出異常前,此方法一直阻塞。

如果 b 的長度為 0,則不讀取任何字節並返回 0;否則,嘗試讀取至少一個字節。如果因為流位於文件末尾而沒有可用的字節,則返回值 -1;否則,至少讀取一個字節並將其存儲在 b 中。

將讀取的第一個字節存儲在元素 b[0] 中,下一個存儲在 b[1] 中,依次類推。讀取的字節數最多等於的長度。設 k 為實際讀取的字節數;這些字節將存儲在 b[0]  b[k-1] 的元素中,不影響 b[kb[b.length-1] 的元素。

 

由幫助文檔中的解釋可知,read()方法每次只能讀取一個字節,所以也只能讀取由ASCII碼范圍內的一些字符。這些字符主要用於顯示現代英語和其他西歐語言。而對於漢字等unicode中的字符則不能正常讀取。只能以亂碼的形式顯示。

對於read()方法的上述缺點,在read(byte[] b)中則得到了解決,就拿漢字來舉例,一個漢字占有兩個字節,則可以把參數數組b定義為大小為2的數組即可正常讀取漢字了。當然b也可以定義為更大,比如如果b=new byte[4]的話,則每次可以讀取兩個漢字字符了,但是需要注意的是,如果此處定義的大小為37等奇數,則對於全是漢字的一篇文檔則不能全部正常讀寫了。

下面用實例來演示一下二者的用法:

實例說明:類InputStreamTest.java 來演示read()方法的使用。類InputStreamTest1.java來演示read(byte[] b)的使用。兩個類的主要任務都是通過文件輸入流FileInputStream來讀取文本文檔yhw.txt中的內容,並且輸出到控制台上顯示。

     先看一下yhw.txt文檔的內容:

 

InputStreamTest.java代碼如下:

 

運行結果:3.1415926 No pains,No gains!!(亂碼亂碼)

 

InputStreamTest1.java代碼如下:

 

 

運行結果:

3.1415926 No pains,No gains!! 最是那一低頭的溫柔,像一朵水蓮花不勝涼風的嬌羞。

 

 

InputStream的三個read的區別

1.read
這個方法是對這個流一個一個字節的讀,返回的int就是這個字節的int表示方式
以下是代碼片段,經過測試當eclipse的編碼為gbk時,轉化出的字符串不需經過重新編碼,如果eclipse的編碼為utf-8時則由byte轉成字符串需重新編成utf-8的

InputStream in = Test.class.getResourceAsStream("/tt.txt");
  byte[]tt=new byte[15];//測試用的事前知道有15個字節碼
  while(in.available()!=0){
   
   for(int i=0;i<15;i++){
    tt[i]=(byte)in.read();
   }
  }
  String ttttt=new String(tt,"utf-8");
  System.out.println(ttttt);
  in.close();

2.read(byte[] b)
這個方法是先規定一個數組長度,將這個流中的字節緩沖到數組b中,返回的這個數組中的字節個數,這個緩沖區沒有滿的話,則返回真實的字節個數,到未尾時都返回-1

in = Test.class.getResourceAsStream("/tt.txt");
  byte [] tt=new byte[1024];
  int b;
  while((b=in.read(tt))!=-1){
   
   System.out.println(b);
  String tzt=new String(tt,"utf-8");
  
   
  System.out.println(tzt);

3.read(byte[] b, int off, int len)
此方法其實就是多次調用了read()方法

InputStream in = Test.class.getResourceAsStream("/tt.txt");
  //System.out.println(in.available());//此方法是返回這個流中有多少個字節數,可以把數組長度定為這個
  
  byte[]tt=new byte[in.available()];
  int z;
  while((z=in.read(tt, 0, tt.length))!=-1){
   System.out.println(new String(tt,"utf-8"));
  }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM