1. 程式人生 > >Java學習之InputStream中read()與read(byte[] b)

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

這兩個方法在抽象類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!! 最是那一低頭的溫柔,像一朵水蓮花不勝涼風的嬌羞。

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"));

  }

轉自:http://www.cnblogs.com/pengyingh/articles/2507207.html

相關推薦

Java學習InputStreamread()read(byte[] b)

這兩個方法在抽象類InputStream中都是作為抽象方法存在的,        JDK API中是這樣描述兩者的: read() :  從輸入流中讀取資料的下一個位元組,返回0到255範圍內的int位元組值。如果因為已經到達流末尾而沒有可用的位元組,則返回-1。在

Java學習HttpClient的GETPOST請求

create ppa user 構建 依賴 cut nal cdc array 這篇隨筆記錄了HttpClient的GET和POST請求 使用maven構建依賴包,我使用的版本是4.5.3 <dependency> <groupId>org.apa

Java學習路——氣泡排序選擇排序

Java學習之路——for迴圈實現氣泡排序 基本步驟為: 利用for迴圈輸入並輸出陣列各個元素的值 利用冒泡法(選擇法)進行排序 利用for迴圈將排序完成的陣列元素進行輸出   冒泡法方法:氣泡排序採取從頭至尾以此比較相鄰的兩個元素;小數放前,大數放後。第一輪

Java學習路——Java的變數常量

在Java中應用變數與常量進行資料操作,資料型別處理及轉換 1. Java中的關鍵字 Java 語言中有一些具有特殊用途的詞被稱為關鍵字。關鍵字對 Java 的編譯器有著特殊的意義,在Java程式的編寫中,需慎重使用關鍵字。 Java 中常用關鍵字: Java

java學習單例模式(餓漢式懶漢式)

分用 單例設計 單例 null 並發 auth 設計 pack 過多 ---恢復內容開始--- 設計模式:解決某一類問題最行之有效的方法 java中有23種設計模式 今天學習其中一種:單例設計模式:解決一個類在內存只存在一個對象 想要保證對象唯一。 1.為了避免其他程序

21 Java學習字節流(InputStream和OutPutStream)

亂碼 form exc 傳輸數據 圖片 兩個 為什麽 效率 取數 一.流的分類 1、從功能上:輸入流、輸出流 2、從結構上:字節流、字符流 3、從來源上:節點流、過濾流   其中InputStream/OutputStream是為字節流而設計的,Reader/Wr

21 Java學習位元組流(InputStream和OutPutStream)

  一.流的分類   1、從功能上:輸入流、輸出流 2、從結構上:位元組流、字元流 3、從來源上:節點流、過濾流   其中InputStream/OutputStream是為位元組流而設計的,Reader/Writer是為字元流而設計的。處理位元組或者二進位制物件使用位元組

Stoker的Java學習封裝資料庫連線工具類commons-dbutils

Java學習之封裝資料庫連線工具類與commons-dbutils 一.封裝資料庫連結工具類 public class JDBCUitl { // 宣告連結 private static Connection connection; // 註冊驅動 st

《Hadoop權威指南大資料的儲存分析第版修訂版升級版》pdf附網盤下載連結+(附一個菜鳥的java學習路)

技術書閱讀方法論 一.速讀一遍(最好在1~2天內完成) 人的大腦記憶力有限,在一天內快速看完一本書會在大腦裡留下深刻印象,對於之後複習以及總結都會有特別好的作用。 對於每一章的知識,先閱讀標題,弄懂大概講的是什麼主題,再去快速看一遍,不懂也沒有關係,但是一定要在不懂的

Java學習——深複製淺複製

物件的建立 要想理解什麼是深複製(深拷貝)和淺複製(淺拷貝)我們首先要知道物件是怎麼建立的。Java建立物件的方式有兩種: 1.使用new關鍵字來建立物件,2.使用clone方法來複制物件 那麼這兩種方式有什麼相同和不同呢? new操作符的本意是分配記憶體。程式執行到n

《HTMLCSS設計構建網站》(中文版)》pdf附網盤下載連結+(附一個菜鳥的java學習路)

技術書閱讀方法論 一.速讀一遍(最好在1~2天內完成) 人的大腦記憶力有限,在一天內快速看完一本書會在大腦裡留下深刻印象,對於之後複習以及總結都會有特別好的作用。 對於每一章的知識,先閱讀標題,弄懂大概講的是什麼主題,再去快速看一遍,不懂也沒有關係,但是一定要在不懂的

《你不知道的 JavaScript(上下卷)》pdf附網盤下載連結+(附一個菜鳥的java學習路)

技術書閱讀方法論 一.速讀一遍(最好在1~2天內完成) 人的大腦記憶力有限,在一天內快速看完一本書會在大腦裡留下深刻印象,對於之後複習以及總結都會有特別好的作用。 對於每一章的知識,先閱讀標題,弄懂大概講的是什麼主題,再去快速看一遍,不懂也沒有關係,但是一定要在不懂的

2018年11月13日Java學習包裝類,裝箱拆箱,

1.將八種基本資料型別定義相應的引用型別—包裝類 這樣做的好處就是可以呼叫類的方法了。 2.裝箱與拆箱 裝箱 int i = 500; Integer t = new Integer(i); 拆箱 boolean b = bObj.booleanValue

JAVA學習StringBuffer Sring類的區別(例項展示)

一、字串連線方法不同 String 類中用“+”連線,StringBuffer類中用append()方法連線; 例如如下程式碼: package Test; public class String

Java學習容器上(Collection介面常用方法,Iterator介面,使用foreach迴圈遍歷Collection集合元素,Set集合通用知識(Hashset類,hashcode()Lin

1.容器API的類圖結構如下: JAVA的集合類是一種特別有用的工具類,它可以用於儲存數量不等的多個物件,並可以實現常用資料結構,如棧,佇列等,除此之外,JAVA集合還可用於儲存具有對映關係的關聯陣列。 JAVA的集合大致上可分為:Set,List和Map三

JAVA學習路---刪除集合的元素

1.有的時候在做業務邏輯處理的時候, 我們需要刪除集合中的元素。可是如何按照正常的邏輯進行刪除,往往達不到預期的效果,那就是報錯。以下展示通過foreach迴圈進行元素的刪除,會出現如下錯誤。 程式碼展示: public static void main(String[]

Java學習jdkcglib動態代理

宣告:參考部分部落格做記錄 1.jdk動態代理實現 介面: public interface UserService { String getName(); } 介面實現: public class UserServiceImpl impl

Java學習面向物件面向過程的比較

前言   Java程式語言是一門面向物件的語言,這與之前的程式語言來說,是一個重大的進步和發展,下面主要來分析一下面向物件和麵向過程兩者之間的關係。程式語言的發展  如下圖,程式語言的發展經歷了大體四個

Java學習棧記憶體堆記憶體

堆:(物件) 引用型別的變數,其記憶體分配在堆上或者常量池(字串常量、基本資料型別常量),需要通過new等方式來建立。 堆記憶體主要作用是存放執行時建立(new)的物件。 (主要用於存放物件,存取速度慢,可以執行時動態分配記憶體,生存期不需要提前確定)

Java學習初始化塊

java學習初始化塊: 分類: 1、靜態初始化塊 2、非靜態初始化塊 語法: [修飾符]{ 初始化塊邏輯 } 例子: 父類public class Block { static { Syste