1. 程式人生 > >Java 中InputStream與Reader的區別

Java 中InputStream與Reader的區別

java.io下面有兩個抽象類:InputStream和Reader
InputStream是表示位元組輸入流的所有類的超類
Reader是用於讀取字元流的抽象類
InputStream提供的是位元組流的讀取,而非文字讀取,這是和Reader類的根本區別。
即用Reader讀取出來的是char陣列或者String ,使用InputStream讀取出來的是byte陣列。
弄清了兩個超類的根本區別,再來看他們底下子類的使用,這裡只對最常用的幾個說明

InputStream 
   | __FileInputStream 


FileInputStream 從檔案系統中的某個檔案中獲得輸入位元組。
構造方法摘要  
FileInputStream (File  file) 

          通過開啟一個到實際檔案的連線來建立一個 FileInputStream ,該檔案通過檔案系統中的 File 物件 file 指定。 
FileInputStream (FileDescriptor  fdObj) 
          通過使用檔案描述符 fdObj 建立一個 FileInputStream ,該檔案描述符表示到檔案系統中某個實際檔案的現有連線。 
FileInputStream (String  name) 
          通過開啟一個到實際檔案的連線來建立一個 FileInputStream ,該檔案通過檔案系統中的路徑名 name 指定。 


Reader

   |——BufferedReader 

   |___InputStreamReader 
         |__FileReader 


BufferedReader : 從字元輸入流中讀取文字,緩衝各個字元,從而實現字元、陣列和行的高效讀取。

構造方法摘要  
BufferedReader (Reader  in) 
          建立一個使用預設大小輸入緩衝區的緩衝字元輸入流。 
BufferedReader (Reader  in, int sz) 
          建立一個使用指定大小輸入緩衝區的緩衝字元輸入流。 
BufferedReader (Java Platform SE 6) 
BufferedReader的最大特點就是緩衝區的設定。通常Reader 所作的每個讀取請求都會導致對底層字元或位元組流進行相應的讀取請求,
如果沒有緩衝,則每次呼叫 read() 或 readLine() 都會導致從檔案中讀取位元組,並將其轉換為字元後返回,而這是極其低效的。
使用BufferedReader可以指定緩衝區的大小,或者可使用預設的大小。大多數情況下,預設值就足夠大了。 
因此,建議用 BufferedReader 包裝所有其 read() 操作可能開銷很高的 Reader(如 FileReader 和InputStreamReader)。例如, 
 BufferedReader in
   = new BufferedReader(new FileReader("foo.in"));
 將緩衝指定檔案的輸入。 
InputStreamReader (Java Platform SE 6) 
InputStreamReader 是位元組流通向字元流的橋樑:它使用指定的 charset 讀取位元組並將其解碼為字元。它使用的字符集可以由名稱指定或顯式給定,或者可以接受平臺預設的字符集。 

構造方法摘要  
InputStreamReader (InputStream  in) 
          建立一個使用預設字符集的 InputStreamReader。 
InputStreamReader (InputStream  in, Charset  cs) 
          建立使用給定字符集的 InputStreamReader。 
InputStreamReader (InputStream  in, CharsetDecoder  dec) 
          建立使用給定字符集解碼器的 InputStreamReader。 
InputStreamReader (InputStream  in, String  charsetName) 
          建立使用指定字符集的 InputStreamReader。 

每次呼叫 InputStreamReader 中的一個 read() 方法都會導致從底層輸入流讀取一個或多個位元組。要啟用從位元組到字元的有效轉換,可以提前從底層流讀取更多的位元組,使其超過滿足當前讀取操作所需的位元組。 
為了達到最高效率,可要考慮在 BufferedReader 內包裝 InputStreamReader。例如: 
 BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
InputStreamReader最大的特點是可以指轉換的定編碼格式
,這是其他類所不能的,從構造方法就可看出,
這一點在讀取中文字元時非常有用

FileReader
1)FileReader類介紹:
InputStreamReader類的子類,所有方法(read()等)都從父類InputStreamReader中繼承而來;
2)與InputStreamReader類的區別:
構造方法摘要  
FileReader (File  file) 
          在給定從中讀取資料的 File 的情況下建立一個新 FileReader 。 
FileReader (FileDescriptor  fd) 
          在給定從中讀取資料的 FileDescriptor 的情況下建立一個新 FileReader 。 
FileReader (String  fileName) 
          在給定從中讀取資料的檔名的情況下建立一個新 FileReader  

該類與它的父類InputStreamReader的主要不同在於建構函式,主要區別也就在於建構函式!
從InputStreamReader的建構函式中看到,引數為InputStream和編碼方式,可以看出,
當要指定編碼方式時,必須使用InputStreamReader
類;而FileReader建構函式的引數與FileInputStream同,為File物件或表示path的String,可以看出,當要根據File物件或者String讀取一個檔案時,用FileReader;
我想FileReader子類的作用也就在於這個小分工吧。該類與它的父類InputStreamReader
的主要不同在於建構函式,主要區別也就在於建構函式!
從InputStreamReader
的建構函式中看到,引數為InputStream和編碼方式,可以看出,
當要指定編碼方式時,必須使用InputStreamReader
類;而FileReader建構函式的引數與FileInputStream
同,為File物件或表示path的String,可以看出,當要根據File物件或者String讀取一個檔案時,用FileReader;
我想FileReader子類的作用也就在於這個小分工吧。
二 聯絡與區別 
(1)字元與位元組: 
FileInputStream 類以二進位制輸入/輸出,I/O速度快且效率搞,但是它的read()方法讀到的是一個位元組(二進位制資料),很不利於人們閱讀,而且無法直接對檔案中的字元進行操作,比如替換,查詢(必須以位元組形式操作);
而Reader類彌補了這個缺陷,可以以文字格式輸入/輸出,非常方便;比如可以使用while((ch = filereader.read())!=-1 )迴圈來讀取檔案;可以使用BufferedReader的readLine()方法一行一行的讀取文字。
(2)編碼
InputStreamReader ,它是位元組轉換為字元的橋樑。 你可以在構造器重指定編碼的方式,如果不指定的話將採用底層作業系統的預設編碼方式,例如GBK等。 
FileReader與InputStreamReader 涉及編碼轉換(指定編碼方式或者採用os預設編碼),可能在不同的平臺上出現亂碼現象!而FileInputStream 以二進位制方式處理,不會出現亂碼現象. 
因此要指定編碼方式時,必須使用InputStreamReader 類,所以說它是位元組轉換為字元的橋樑;
(3) 快取區
    BufferReader類用來包裝所有其 read() 操作可能開銷很高的 Reader(如 FileReader 和InputStreamReader)。
(4)規範用法
總結以上內容,得出比較好的規範用法: 
1) File file = new File ("hello.txt"); 
FileInputStream in=new FileInputStream (file); 
2) File file = new File ("hello.txt"); 
FileInputStream in=new FileInputStream (file); 
InputStreamReader inReader=new InputStreamReader (in,"UTF-8"); 
BufferedReader bufReader=new BufferedReader(inReader); 
3) File file = new File ("hello.txt"); 
FileReader fileReader=new FileReader(file); 
BufferedReader bufReader=new BufferedReader(fileReader);

相關推薦

Java InputStreamReader區別

java.io下面有兩個抽象類:InputStream和ReaderInputStream是表示位元組輸入流的所有類的超類Reader是用於讀取字元流的抽象類InputStream提供的是位元組流的讀取,而非文字讀取,這是和Reader類的根本區別。即用Reader讀取出來的是char陣列或者String ,

javaa++++a區別

demo div main highlight print class 結果 public 別了 java中a++與++a區別 a++與++a的區別,如果單獨使用沒有任何區別,如果在運算中就有區別了,a++是先運算在賦值,而++a是先賦值在運算!! class dem

JavaInputStreamReader的理解

java.io下面有兩個抽象類:InputStream和Reader InputStream是表示位元組輸入流的所有類的超類 Reader是用於讀取字元流的抽象類 InputStream提供的是位元組流的讀取,而非文字讀取,這是和Reader類的根本區別。 即用Reader讀取出來的是char陣列或

javaarrayListlinkedList區別

這個問題其實好早就想做筆記了,一次面試問到了, ArrayList與linkedList在效能上各有優缺點,都有各自的地方, 1.對ArrayList和LinkedList而言,在列表中末尾新增一個元素所花的開銷是固定的 2.在ArrayList中間插入一個元素或刪除一個元

JAVAextends implements區別

1. 在類的宣告中,通過關鍵字extends來建立一個類的子類。一個類通過關鍵字implements宣告自己使用一個或者多個介面。 extends 是繼承某個類, 繼承之後可以使用父類的方法, 也可以重寫父類的方法; implements 是實現多個介面, 介面的方法一般為

Javasleep()wait()區別

學習時正好碰到這兩個方法,就查閱相關資料,並通過程式實現,進行區別一下:1、每個物件都有一個鎖來控制同步訪問,Synchronized關鍵字可以和物件的鎖互動,來實現同步方法或同步塊。sleep()方法正在執行的執行緒主動讓出CPU(然後CPU就可以去執行其他任務),在slee

Javasleep()wait()區別標記一下

學習時正好碰到這兩個方法,就查閱相關資料,並通過程式實現,進行區別一下: 1、每個物件都有一個鎖來控制同步訪問,Synchronized關鍵字可以和物件的鎖互動,來實現同步方法或同步塊。sleep()方法正在執行的執行緒主動讓出CPU(然後CPU就可以去執行其他任務),

201671010145 2016-2017-3《Java程序設計》Java對象的區別

import -c indent cin ria wid let isp ans 1.什麽是類呢? 書面語句:類是一種事物,或者一類相同物體的抽象.類是對一個或者幾個相似對象的描述,它把不同對象具有的共性抽象出來.也可以說類是同一類對象的原型. 例如:人就是一個類,因為它是

讓你徹底明白JAVA棧的區別

java程序 運行 一點 動態 自動變 key 空間 類型 lin 原文地址:http://www.2cto.com/kf/201302/190704.html 簡單的說: Java把內存劃分成兩種:一種是棧內存,一種是堆內存。 在函數中定義的一些基本類型的變量和對象的引用

Javafinal static final 修飾的常量的區別

評論 tin 產生 建立 dom code 隨機數 ren 使用 喵喵開車,新手上路,多多關照。有任何錯誤請在評論區指出。 ...........................................我是萬惡的分界線( ? ?ω?? )?.............

Javathissuper的區別以及用法

輸出結果 類構造 pan tex 成員變量 靜態 public 裏的 一個 super()用法 super()函數在子類構造函數中調用父類的構造函數時使用,必須要在構造函數的第一行。 1 class Animal { 2 public Anima

JavanextnextLine方法的區別

1. Java中的Scanner類中的方法next()與nextLine()都是吸取輸入控制檯輸入的字元 ①next()方法不會吸取字元前和後的空格/Tab,只吸取字元,開始吸取字元(字元前後不算) 直到遇到空格/Tab/回車擷取吸取 ②nextLine()吸取字元前後的空格/Tab鍵,回車鍵截

c#javabyte位元組的區別及轉換方法

在java中  byte的範圍在 [-128,127] 在C#中  byte的範圍在 [0,255] 所以 java程式與C#程式 進行資料傳輸的時候 要先把java的byte陣列轉換成在[0,255]範圍內的int型陣列a[];再把a[]進行加密得到字串str, 把字串

Java == 號equals()方法區別詳解

== 號與equals()方法區別這個問題在面試中經常被問到,如果你瞭解的不透徹,很容易被問蒙。下面我們來一起看看吧。 1.基本資料型別,也稱原始資料型別。byte,short,char,int,long,float,double,boolean 他們之間的比較,應用雙等號(==)

javaintInteger的區別

java中int與Integer的區別 本文引自: https://www.cnblogs.com/guodongdidi/p/6953217.html. 兩者之間的區別 1、Integer是int的包裝類,int則是java的一種基本資料型別 2、Integer變數必須例項化後

Java陣列變數的區別

LinkedList list; LinkedList list2; list=list2; list2.add("GGGg"); System.out.println(list); 上面是list2,list 為變數,因為list2 沒有初始化,必須得先初始化,後賦值&

java重寫過載的區別

ava—重寫與過載的區別 這幾周開始看Java的知識,發現有一個有趣的現象就是,前兩天剛看過的知識點,過一天又忘掉了。而且很多東西堆在腦子裡像漿糊一樣。所以邊學習邊總結是很重要的,今天想寫一篇關於重寫和過載的部落格,為什麼?因為面試會問啊,這是基礎中比較重要的地方,但我百度了幾篇部落格之後發現寫

JavaStringBufferedReader、InputStream轉換

1、String –> InputStream InputStrem is = new ByteArrayInputStream(str.getBytes()); 或者 ByteArrayInputStream stream= new ByteArrayInputStream(str.getB

JavaRMIRPC的區別

隨著Java技術學習的不斷深入,越來越覺得保持初心是多麼重要,無論我們學到哪個程度,在學習的時候始終保持初學者的心態,才能在自己的技術之上實現突破! 今天有點像雞湯,迴歸正題,繼續更新我的學習筆記:Java技術中的 RMI與RPC的區別。 一:RPC遠端過程呼叫 RPC(Remote Procedure

JavahasNext()next()的區別,hasNextInt()nextInt()的區別,hasNextDouble()nextDouble()的區別

轉載自:https://blog.csdn.net/weixin_37770552/article/details/77431961 還有補充:https://zhidao.baidu.com/question/198579166802848525.html java.util.Scanne