Java學習之InputStream中read()與read(byte[] b)
這兩個方法在抽象類InputStream中都是作為抽象方法存在的,
JDK API中是這樣描述兩者的:
read() : 從輸入流中讀取資料的下一個位元組,返回0到255範圍內的int位元組值。如果因為已經到達流末尾而沒有可用的位元組,則返回-1。在輸入資料可用、檢測到流末尾或者丟擲異常前,此方法一直阻塞。
read(byte[] b) : 從輸入流中讀取一定數量的位元組,並將其儲存在緩衝區陣列 b 中。以整數形式返回實際讀取的位元組數。在輸入資料可用、檢測到檔案末尾或者丟擲異常前,此方法一直阻塞。
如果 b 的長度為 0,則不讀取任何位元組並返回 0;否則,嘗試讀取至少一個位元組。如果因為流位於檔案末尾而沒有可用的位元組,則返回值 -1
將讀取的第一個位元組儲存在元素 b[0] 中,下一個儲存在 b[1] 中,依次類推。讀取的位元組數最多等於b 的長度。設 k為實際讀取的位元組數;這些位元組將儲存在 b[0] 到 b[k-1] 的元素中,不影響 b[k] 到b[b.length-1] 的元素。
由幫助文件中的解釋可知,read()方法每次只能讀取一個位元組,所以也只能讀取由ASCII碼範圍內的一些字元。這些字元主要用於顯示現代英語和其他西歐語言。而對於漢字等unicode中的字元則不能正常讀取。只能以亂碼的形式顯示。
對於read()方法的上述缺點,在read(byte[] b)
下面用例項來演示一下二者的用法:
例項說明:類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學習之InputStream中read()與read(byte[] b)
這兩個方法在抽象類InputStream中都是作為抽象方法存在的, JDK API中是這樣描述兩者的: read() : 從輸入流中讀取資料的下一個位元組,返回0到255範圍內的int位元組值。如果因為已經到達流末尾而沒有可用的位元組,則返回-1。在
Java學習之HttpClient的GET與POST請求
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學習之jdk與cglib動態代理
宣告:參考部分部落格做記錄 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