最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

InputStreamReader和BufferedReader用法及實(shí)例講解

 更新時(shí)間:2015年12月22日 09:20:50   投稿:mrr  
這篇文章主要介紹了InputStreamReader和BufferedReader用法及實(shí)例講解的相關(guān)資料,需要的朋友可以參考下

一、BufferedReader類

. 所屬類庫:

         java.lang.Object 

              java.io.Reader 

                         java.io.BufferedReader

. 基本概念 :

           public class BufferedReader    extends Reader

從字符輸入流中讀取文本,緩沖各個(gè)字符,從而實(shí)現(xiàn)字符、數(shù)組和行的高效讀取。 可以指定緩沖區(qū)的大小,或者可使用默認(rèn)的大小。大多數(shù)情況下,默認(rèn)值足夠大。

通常, Reader 所作的每個(gè)讀取請求都會(huì)導(dǎo)致對底層字符或字節(jié)流進(jìn)行相應(yīng)的讀取請求。因此,建議用 BufferedReader 包裝所有其 read() 操作可能開銷很高的 Reader (如 FileReader 和 InputStreamReader )。

BufferedReader 流能夠讀取文本行 , 通過向 BufferedReader 傳遞一個(gè) Reader 對象 , 來創(chuàng)建一個(gè) BufferedReader 對象 , 之所以這樣做是因?yàn)?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 是字節(jié)流通向字符流的橋梁

二、InputStreamReader類

InputStreamReader 將字節(jié)流轉(zhuǎn)換為字符流。是字節(jié)流通向字符流的橋梁。如果不指定字符集編碼,該解碼過程將使用平臺(tái)默認(rèn)的字符編碼,如:GBK。

構(gòu)造方法 : 

    InputStreamReader isr = new InputStreamReader(InputStream in);//構(gòu)造一個(gè)默認(rèn)編碼集的InputStreamReader類
    InputStreamReader isr = new InputStreamReader(InputStream in,String charsetName);//構(gòu)造一個(gè)指定編碼集的

InputStreamReader類。  

   參數(shù) in對象通過 InputStream in = System.in;獲得。//讀取鍵盤上的數(shù)據(jù)。 

    或者 InputStream in = new FileInputStream(String fileName);//讀取文件中的數(shù)據(jù)??梢钥闯?FileInputStream 為InputStream的子類。

主要方法 :int read();//讀取單個(gè)字符。 

                 int read(char []cbuf);//將讀取到的字符存到數(shù)組中。返回讀取的字符數(shù)。

. Demo :

import java.io.*;
class InputStreamReaderDemo {
 public static void transReadNoBuf() throws IOException {
  /**
   * 沒有緩沖區(qū),只能使用read()方法。
   */
  //讀取字節(jié)流
  //InputStream in = System.in;//讀取鍵盤的輸入。
  InputStream in = new FileInputStream("D:\\demo.txt");//讀取文件的數(shù)據(jù)。
  //將字節(jié)流向字符流的轉(zhuǎn)換。要啟用從字節(jié)到字符的有效轉(zhuǎn)換,
  //可以提前從底層流讀取更多的字節(jié).
  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 {
  /**
   * 使用緩沖區(qū) 可以使用緩沖區(qū)對象的 read() 和 readLine()方法。
   */
  //讀取字節(jié)流
  //InputStream in = System.in;//讀取鍵盤上的數(shù)據(jù)
  InputStream in = new FileInputStream("D:\\demo.txt");//讀取文件上的數(shù)據(jù)。
  //將字節(jié)流向字符流的轉(zhuǎn)換。
  InputStreamReader isr = new InputStreamReader(in);//讀取
  //創(chuàng)建字符流緩沖區(qū)
  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();
 }
}

三、InputStreamReader、BufferedReader真實(shí)案例(非編碼集)

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 放于項(xiàng)目的根目錄下

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;
 }
}

總結(jié):

InputStreamReader 類

是字節(jié)流通向字符流的橋梁,封裝了InputStream在里頭, 它以較高級的方式,一次讀取一個(gè)一個(gè)字符,以文本格式輸入 / 輸出,可以指定編碼格式;

BufferedReader 類

BufferedReader 由Reader類擴(kuò)展而來,提供通用的緩沖方式文本讀取,而且提供了很實(shí)用的readLine,讀取一個(gè)文本行,從字符輸入流中讀取文本,緩沖各個(gè)字符,從而提供字符、數(shù)組和行的高效讀取。

ps:InputStream、InputStreamReader和Reader的關(guān)系

InputStream:得到的是字節(jié)輸入流,InputStream.read("filename")之后,得到字節(jié)流

Reader:讀取的是字符流

InputStreamReader:從字節(jié)到字符的橋梁。InputStreamReader(InputStream.read("filename"));

reader.read(InputStreamReader(InputStream in));便可從字節(jié)變?yōu)樽址?,打印顯示了。

java.io.Reader 和 java.io.InputStream 組成了Java 輸入類。

Reader 用于讀入16位字符,也就是Unicode 編碼的字符;而 InputStream 用于讀入 ASCII 字符和二進(jìn)制數(shù)據(jù)。

Reader支持16位的Unicode字符輸出,InputStream支持8位的字符輸出。

Reader和InputStream分別是I/O庫提供的兩套平行獨(dú)立的等級機(jī)構(gòu),1byte = 8bits  InputStream、OutputStream是用來處理8位元的流,Reader、Writer是用來處理16位元的流。

而在JAVA語言中,byte類型是8位的,char類型是16位的,所以在處理中文的時(shí)候需要用Reader和Writer。

值得說明的是,在這兩種等級機(jī)構(gòu)下,還有一道橋梁InputStreamReader、OutputStreamWriter負(fù)責(zé)進(jìn)行InputStream到Reader的適配和由OutputStream到Writer的適配。

在 Java中,有不同類型的 Reader 輸入流對應(yīng)于不同的數(shù)據(jù)源:

FileReader 用于從文件輸入; CharArrayReader 用于從程序中的字符數(shù)組輸入; StringReader 用于從程序中的字符串輸入; PipedReader 用于讀取從另一個(gè)線程中的 PipedWriter 寫入管道的數(shù)據(jù)。

相應(yīng)的也有不同類型的 InputStream 輸入流對應(yīng)于不同的數(shù)據(jù)源:FileInputStream,ByteArrayInputStream,StringBufferInputStream,PipedInputStream。

另外,還有兩種沒有對應(yīng) Reader 類型的 InputStream 輸入流: Socket 用于套接字; URLConnection 用于 URL 連接。 這兩個(gè)類使用 getInputStream() 來讀取數(shù)據(jù)。

相應(yīng)的,java.io.Writer 和 java.io.OutputStream 也有類似的區(qū)別。

 關(guān)于InputStream.read(byte[] b)和InputStream.read(byte[] b,int off,int len)這兩個(gè)方法都是用來從流里讀取多個(gè)字節(jié)的,有經(jīng)驗(yàn)的程序員就會(huì)發(fā)現(xiàn),這兩個(gè)方法經(jīng)常 讀取不到自己想要讀取的個(gè)數(shù)的字節(jié)。比如第一個(gè)方法,程序員往往希望程序能讀取到b.length個(gè)字節(jié),而實(shí)際情況是,系統(tǒng)往往讀取不了這么多。仔細(xì)閱讀Java的API說明就發(fā)現(xiàn)了,這個(gè)方法 并不保證能讀取這么多個(gè)字節(jié),它只能保證最多讀取這么多個(gè)字節(jié)(最少1個(gè))。因此,如果要讓程序讀取count個(gè)字節(jié),最好用以下代碼:

  byte[] b = new byte[count];
 int readCount = 0; // 已經(jīng)成功讀取的字節(jié)的個(gè)數(shù)
 while (readCount < count) {
  readCount += in.read(bytes, readCount, count - readCount);
 }

      用這段代碼可以保證讀取count個(gè)字節(jié),除非中途遇到IO異常或者到了數(shù)據(jù)流的結(jié)尾(EOFException)

相關(guān)文章

  • Java自動(dòng)讀取指定文件夾下所有文件的方法

    Java自動(dòng)讀取指定文件夾下所有文件的方法

    這篇文章主要為大家詳細(xì)介紹了Java自動(dòng)讀取指定文件夾下所有文件的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-02-02
  • Springboot項(xiàng)目啟動(dòng)時(shí)如何用命令動(dòng)態(tài)指定環(huán)境

    Springboot項(xiàng)目啟動(dòng)時(shí)如何用命令動(dòng)態(tài)指定環(huán)境

    這篇文章主要介紹了Springboot項(xiàng)目啟動(dòng)時(shí)如何用命令動(dòng)態(tài)指定環(huán)境的操作,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • JAVA將中文轉(zhuǎn)換為拼音簡單實(shí)現(xiàn)方法

    JAVA將中文轉(zhuǎn)換為拼音簡單實(shí)現(xiàn)方法

    拼音轉(zhuǎn)換是中文處理的常見需求,TinyPinyin、HanLP、pinyin4j是常用的本地拼音轉(zhuǎn)換庫,各有特點(diǎn),開發(fā)者可根據(jù)具體需求選擇合適的拼音轉(zhuǎn)換工具,需要的朋友可以參考下
    2024-10-10
  • HttpClient的KeepAlive接口方法源碼解析

    HttpClient的KeepAlive接口方法源碼解析

    這篇文章主要為大家介紹了HttpClient的KeepAlive接口方法源碼解析,
    有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-10-10
  • Java中的StringJoiner類使用示例深入詳解

    Java中的StringJoiner類使用示例深入詳解

    這篇文章主要為大家介紹了Java中的StringJoiner類使用示例深入詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-09-09
  • Mybatis velocity腳本的使用教程詳解(推薦)

    Mybatis velocity腳本的使用教程詳解(推薦)

    很多朋友不清楚在mybatis可以使用各種腳本語言來定義Mapper文件里面的動(dòng)態(tài)SQL;目前mybatis支持的腳本語言有XML(默認(rèn)的);Velocity和Freemarker三種。下面通過本文給大家介紹Mybatis velocity腳本的使用,一起看看吧
    2016-11-11
  • Java Math.round(),Math.ceil(),Math.floor()的區(qū)別詳解

    Java Math.round(),Math.ceil(),Math.floor()的區(qū)別詳解

    這篇文章主要介紹了Java Math.round(),Math.ceil(),Math.floor()的區(qū)別詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-08-08
  • Java使用云片API發(fā)送短信驗(yàn)證碼

    Java使用云片API發(fā)送短信驗(yàn)證碼

    這篇文章主要介紹了Java使用云片API發(fā)送短信驗(yàn)證碼,主要用的是Java實(shí)現(xiàn)短信驗(yàn)證碼。需要的朋友可以參考下
    2017-02-02
  • MyBatis?多表聯(lián)合查詢及優(yōu)化方法

    MyBatis?多表聯(lián)合查詢及優(yōu)化方法

    大家都知道Hibernate 是全自動(dòng)的數(shù)據(jù)庫持久層框架,它可以通過實(shí)體來映射數(shù)據(jù)庫,通過設(shè)置一對多、多對一、一對一、多對多的關(guān)聯(lián)來實(shí)現(xiàn)聯(lián)合查詢,接下來通過本文給大家介紹MyBatis?多表聯(lián)合查詢及優(yōu)化,需要的朋友可以參考下
    2022-08-08
  • java時(shí)間日期使用與查詢代碼詳解

    java時(shí)間日期使用與查詢代碼詳解

    這篇文章主要介紹了java時(shí)間日期使用與查詢代碼詳解,具有一定借鑒價(jià)值,需要的朋友可以參考下。
    2017-11-11

最新評論

望城县| 息烽县| 镇原县| 临邑县| 甘肃省| 鄂伦春自治旗| 德令哈市| 新巴尔虎左旗| 壤塘县| 宕昌县| 西城区| 高碑店市| 扎赉特旗| 海安县| 额尔古纳市| 尼勒克县| 翁牛特旗| 滦平县| 普洱| 神木县| 固原市| 田林县| 资溪县| 含山县| 红桥区| 资中县| 金寨县| 观塘区| 商河县| 吕梁市| 县级市| 衡山县| 兴城市| 遵义县| 泗阳县| 达孜县| 六安市| 通江县| 开原市| 河源市| 柯坪县|