InputStreamReader和BufferedReader用法及實例講授。本站提示廣大學習愛好者:(InputStreamReader和BufferedReader用法及實例講授)文章只能為提供參考,不一定能成為您想要的結果。以下是InputStreamReader和BufferedReader用法及實例講授正文
1、BufferedReader類
. 所屬類庫:
java.lang.Object
java.io.Reader
java.io.BufferedReader
. 根本概念 :
public class BufferedReader extends Reader
從字符輸出流中讀取文本,緩沖各個字符,從而完成字符、數組和行的高效讀取。 可以指定緩沖區的年夜小,或許可以使用默許的年夜小。年夜多半情形下,默許值足夠年夜。
平日, Reader 所作的每一個讀取要求都邑招致對底層字符或字撙節停止響應的讀取要求。是以,建議用 BufferedReader 包裝一切其 read() 操作能夠開支很高的 Reader (如 FileReader 和 InputStreamReader )。
BufferedReader 流可以或許讀取文本行 , 經由過程向 BufferedReader 傳遞一個 Reader 對象 , 來創立一個 BufferedReader 對象 , 之所以如許做是由於 FileReader 沒有供給讀取文本行的功效 .
. Demo :
經由過程 Bufferedreader 捕捉所輸出的語句 :
import java.io.*; class BufferedReaderDemo{ public static void main(String[] args)throws IOException { BufferedReader bufferedReader =new BufferedReader( new InputStreamReader(System.in)); System.out.print("請輸出一系列文字,可包含空格:"); String text =bufferedReader.readLine(); System.out.println("請輸出文字:"+text); } }
注解:
throws IOException 拋出異常
InputStreamReader 是字撙節通向字符流的橋梁
2、InputStreamReader類
InputStreamReader 將字撙節轉換為字符流。是字撙節通向字符流的橋梁。假如不指定字符集編碼,該解碼進程將應用平台默許的字符編碼,如:GBK。
結構辦法 :
InputStreamReader isr = new InputStreamReader(InputStream in);//結構一個默許編碼集的InputStreamReader類
InputStreamReader isr = new InputStreamReader(InputStream in,String charsetName);//結構一個指定編碼集的
InputStreamReader類。
參數 in對象經由過程 InputStream in = System.in;取得。//讀取鍵盤上的數據。
或許 InputStream in = new FileInputStream(String fileName);//讀取文件中的數據。可以看出 FileInputStream 為InputStream的子類。
重要辦法 :int read();//讀取單個字符。
int read(char []cbuf);//將讀取到的字符存到數組中。前往讀取的字符數。
. Demo :
import java.io.*; class InputStreamReaderDemo { public static void transReadNoBuf() throws IOException { /** * 沒有緩沖區,只能應用read()辦法。 */ //讀取字撙節 //InputStream in = System.in;//讀取鍵盤的輸出。 InputStream in = new FileInputStream("D:\\demo.txt");//讀取文件的數據。 //將字撙節向字符流的轉換。要啟用從字節到字符的有用轉換, //可以提早從底層流讀取更多的字節. InputStreamReader isr = new InputStreamReader(in);//讀取 //綜合到一句。 //InputStreamReader isr = new InputStreamReader( //new FileInputStream("D:\\demo.txt")); char []cha = new char[1024]; int len = isr.read(cha); System.out.println(new String(cha,0,len)); isr.close(); } public static void transReadByBuf() throws IOException { /** * 應用緩沖區 可使用緩沖區對象的 read() 和 readLine()辦法。 */ //讀取字撙節 //InputStream in = System.in;//讀取鍵盤上的數據 InputStream in = new FileInputStream("D:\\demo.txt");//讀取文件上的數據。 //將字撙節向字符流的轉換。 InputStreamReader isr = new InputStreamReader(in);//讀取 //創立字符流緩沖區 BufferedReader bufr = new BufferedReader(isr);//緩沖 //BufferedReader bufr = new BufferedReader( //new InputStreamReader(new FileInputStream("D:\\demo.txt")));可以綜合到一句。 /*int ch =0; ch = bufr.read(); System.out.println((char)ch); */ String line; while((line = bufr.readLine())!=null){ System.out.println(line); } isr.close(); } }
3、InputStreamReader、BufferedReader真實案例(非編碼集)
import java.io.*; class UtilResource { private void initializeResource() { try { //讀取文件,而且以utf-8的情勢寫出去 BufferedReader bufread; String read; bufread = new BufferedReader(new InputStreamReader(ResourceHelper .getResourceInputStream("pinyin.txt"))); while ((read = bufread.readLine()) != null) { System.out.println(read); } bufread.close(); } catch (FileNotFoundException ex) { ex.printStackTrace(); } catch (IOException ex) { ex.printStackTrace(); } } }
注:個中 pinyin.txt 放於項目標根目次下
import java.io.BufferedInputStream; import java.io.FileInputStream; import java.io.FileNotFoundException; class ResourceHelper { /** * @param resourceName * @return * @return */ static BufferedInputStream getResourceInputStream(String resourceName) { try { return new BufferedInputStream(new FileInputStream(resourceName)); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } return null; } }
總結:
InputStreamReader 類
是字撙節通向字符流的橋梁,封裝了InputStream在外頭, 它以較高等的方法,一次讀取一個一個字符,以文本格局輸出 / 輸入,可以指定編碼格局;
BufferedReader 類
BufferedReader 由Reader類擴大而來,供給通用的緩沖方法文本讀取,並且供給了很適用的readLine,讀取一個文本行,從字符輸出流中讀取文本,緩沖各個字符,從而供給字符、數組和行的高效讀取。
ps:InputStream、InputStreamReader和Reader的關系
InputStream:獲得的是字節輸出流,InputStream.read("filename")以後,獲得字撙節
Reader:讀取的是字符流
InputStreamReader:從字節到字符的橋梁。InputStreamReader(InputStream.read("filename"));
reader.read(InputStreamReader(InputStream in));即可從字節變成字符,打印顯示了。
java.io.Reader 和 java.io.InputStream 構成了Java 輸出類。
Reader 用於讀入16位字符,也就是Unicode 編碼的字符;而 InputStream 用於讀入 ASCII 字符和二進制數據。
Reader支撐16位的Unicode字符輸入,InputStream支撐8位的字符輸入。
Reader和InputStream分離是I/O庫供給的兩套平行自力的品級機構,1byte = 8bits InputStream、OutputStream是用來處置8位元的流,Reader、Writer是用來處置16位元的流。
而在JAVA說話中,byte類型是8位的,char類型是16位的,所以在處置中文的時刻須要用Reader和Writer。
值得解釋的是,在這兩種品級機構下,還有一道橋梁InputStreamReader、OutputStreamWriter擔任停止InputStream到Reader的適配和由OutputStream到Writer的適配。
在 Java中,有分歧類型的 Reader 輸出流對應於分歧的數據源:
FileReader 用於從文件輸出; CharArrayReader 用於從法式中的字符數組輸出; StringReader 用於從法式中的字符串輸出; PipedReader 用於讀取從另外一個線程中的 PipedWriter 寫入管道的數據。
響應的也有分歧類型的 InputStream 輸出流對應於分歧的數據源:FileInputStream,ByteArrayInputStream,StringBufferInputStream,PipedInputStream。
別的,還有兩種沒有對應 Reader 類型的 InputStream 輸出流: Socket 用於套接字; URLConnection 用於 URL 銜接。 這兩個類應用 getInputStream() 來讀取數據。
響應的,java.io.Writer 和 java.io.OutputStream 也有相似的差別。
關於InputStream.read(byte[] b)和InputStream.read(byte[] b,int off,int len)這兩個辦法都是用來從流裡讀取多個字節的,有經歷的法式員就會發明,這兩個辦法常常 讀取不到本身想要讀取的個數的字節。好比第一個辦法,法式員常常願望法式能讀取到b.length個字節,而現實情形是,體系常常讀取不了這麼多。細心浏覽Java的API解釋就發明了,這個辦法 其實不包管能讀取這麼多個字節,它只能包管最多讀取這麼多個字節(起碼1個)。是以,假如要讓法式讀取count個字節,最好用以下代碼:
byte[] b = new byte[count]; int readCount = 0; // 曾經勝利讀取的字節的個數 while (readCount < count) { readCount += in.read(bytes, readCount, count - readCount); }
用這段代碼可以包管讀取count個字節,除非半途碰到IO異常或許到了數據流的開頭(EOFException)