欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java基礎(chǔ)知識之StringReader流的使用

 更新時間:2021年12月10日 09:43:54   作者:咕嚕是個大胖子  
這篇文章主要介紹了Java基礎(chǔ)知識之StringReader流的使用,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

Java StringReader流的使用

一、StringReader流定義

API說明:字符串輸入流、其本質(zhì)就是字符串

二、StringReader的實(shí)例域

    //流對象
    private String str;
    
    //流的長度
    private int length;
    
    //流的當(dāng)前位置,下個字符的索引
    private int next = 0;
    
    //流的標(biāo)記位置
    private int mark = 0;

三、StringReader流構(gòu)造函數(shù)

    /**
     * 利用字符串創(chuàng)建字符輸入流
     */
    public StringReader(String s) {
        this.str = s;
        this.length = s.length();
    }

四、StringReader流的API

1)read():從流中讀取單個字符,若到文件末尾則返回-1

    /**
     * 從流中讀取單個字符,若到文件末尾則返回-1
     */
    public int read() throws IOException {
        synchronized (lock) {
            ensureOpen();
            if (next >= length)
                return -1;
            return str.charAt(next++);
        }
    }

2)read(char cbuf[], int off, int len):讀取最多l(xiāng)en個字節(jié)到目標(biāo)數(shù)組中,從目標(biāo)數(shù)組的下標(biāo)off開始存儲,返回實(shí)際讀取的字節(jié)數(shù)

 /**
     * 讀取最多l(xiāng)en個字節(jié)到目標(biāo)數(shù)組中,從目標(biāo)數(shù)組的下標(biāo)off開始存儲,返回實(shí)際讀取的字節(jié)數(shù)
     * @exception  IOException  If an I/O error occurs
     */
    public int read(char cbuf[], int off, int len) throws IOException {
        synchronized (lock) {
            ensureOpen();
            if ((off < 0) || (off > cbuf.length) || (len < 0) ||
                ((off + len) > cbuf.length) || ((off + len) < 0)) {
                throw new IndexOutOfBoundsException();
            } else if (len == 0) {
                return 0;
            }
            if (next >= length)
                return -1;
            int n = Math.min(length - next, len);
            str.getChars(next, next + n, cbuf, off);
            next += n;
            return n;
        }
    }

3)close():關(guān)閉流無效,關(guān)閉后調(diào)用該類其它方法會報異常

 
    /**
     * 關(guān)閉流無效,關(guān)閉后調(diào)用該類其它方法會報異常
     */
    public void close() {
        str = null;
    }

五、StringReader流的作用

暫未使用故未知曉,故先了解功能

StringReader分析

IO流分類圖

在這里插入圖片描述

訪問字符串

  • StringReader是字符輸入流,Reader的子類,從一個String中讀取,所以需要一個String ,通過構(gòu)造方法傳遞
  • StringWriter是字符輸出流,Writer的子類,寫入到一個String中去,所以它內(nèi)部提供了一個StringBuffer中用來保存數(shù)據(jù)

StringReader

1. 屬性和構(gòu)造方法

    private String str;
    private int length;
    private int next = 0;
    private int mark = 0;
    
    public StringReader(String s) {      //傳入字符串
        this.str = s;
        this.length = s.length();
    }
    
    str    :指向這個字符串
    length :為字符串長度
    next   :為讀取元素的下標(biāo)索引
    mark   :為標(biāo)記點(diǎn)
    

2. 基本方法

read()方法

    //讀取一個字符
    public int read() throws IOException {
        synchronized (lock) {
            ensureOpen();
            if (next >= length)
                return -1;
            return str.charAt(next++);
        }
    }

注::從中可看出StringReader 將String字符串操作 適配成 Reader字符操作 對外提供服務(wù) —> StringReader是一個適配器類

//批量讀取
 public int read(char cbuf[], int off, int len) throws IOException {
        synchronized (lock) {
            ensureOpen();
            if ((off < 0) || (off > cbuf.length) || (len < 0) ||
                ((off + len) > cbuf.length) || ((off + len) < 0)) {
                throw new IndexOutOfBoundsException();
            } else if (len == 0) {
                return 0;
            }
            if (next >= length)
                return -1;
            int n = Math.min(length - next, len);
            str.getChars(next, next + n, cbuf, off);
            next += n;
            return n;
        }
    }

標(biāo)記相關(guān)方法

	//判斷是否支持標(biāo)記
    public boolean markSupported() {
        return true;
    }

注: FileInputStream 和 FileReader 都不支持標(biāo)記

 //標(biāo)記
    public void mark(int readAheadLimit) throws IOException {
        if (readAheadLimit < 0){
            throw new IllegalArgumentException("Read-ahead limit < 0");
        }
        synchronized (lock) {
            ensureOpen();
            mark = next;
        }
    }

注: mark的使用并不相當(dāng)于指針,需要和reset()方法一起使用 --> 和RandomAccessFile的seek操作不是一個性質(zhì)

 //重置指針
 public void reset() throws IOException {
      synchronized (lock) {
          ensureOpen();
          next = mark;
      }
  }

注: 將mark標(biāo)記賦給next,reset()和mark()兩個方法配合使用

//跳過流中指定數(shù)量的字符  返回跳過的字符數(shù)
    public long skip(long ns) throws IOException {
        synchronized (lock) {
            ensureOpen();
            if (next >= length)
                return 0;
            // Bound skip by beginning and end of the source
            long n = Math.min(length - next, ns);
            n = Math.max(-next, n);
            next += n;
            return n;
        }
    }

注: 正數(shù)往前跳,負(fù)數(shù)往后跳

3. 測試代碼

//訪問字符串 StringReader
    import java.io.IOException;
    import java.io.StringReader;
    
public class StringReader_work {
    public static void StringReader() {
        String str = "今天外面真的冷啊果然應(yīng)該點(diǎn)外的";
        try {
            //1. 構(gòu)造方法  傳入字符串
            StringReader stringReader = new StringReader(str);
            //2. int read() 讀操作,讀取一個字符   (將String字符串操作 適配成 Reader字符操作 對外提供服務(wù))
//            int read=stringReader.read();
//            System.out.println((char) read);
            //int read(char cbuf[]) throws IOException   批量讀
            char[] chars = new char[3];
            int read1=stringReader.read(chars);
            System.out.println(new String(chars,0,3));
            //int read(char cbuf[], int off, int len)   批量讀
//            char[] chars1 = new char[3];
//            int read2=stringReader.read(chars1,0,3);
//            System.out.println(new String(chars1,0,3));
            // boolean ready()  判斷數(shù)據(jù)源是否存在
            stringReader.ready();
            //3. markSupported()  是否支持標(biāo)記    FileInputStream和FileReader 都不支持
            System.out.println("是否支持標(biāo)記:"+stringReader.markSupported());
            // void mark(int readAheadLimit) throws IOException  標(biāo)記
   //TODO: 測試發(fā)現(xiàn)并未從標(biāo)記位置讀,依舊是接著原先next所指位置讀數(shù)據(jù)
            stringReader.mark(5);
            char[] chars2=new char[3];
            int read3 = stringReader.read(chars2,0,3);
            System.out.println("mark標(biāo)記后讀三個數(shù):"+new String(chars2,0,3));
            //TODO:mark使用并不相當(dāng)于指針 --> 和RandomAccessFile的seek操作不是一個性質(zhì)
            // void reset() throws IOException   重置指針
            // 單獨(dú)使用 reset() 方法
            stringReader.reset();
            char[] chars3=new char[3];
            int read4 = stringReader.read(chars3,0,3);
            System.out.println("單獨(dú)使用reset()方法:"+new String(chars3,0,3));
            // mark()方法 與 reset()方法 結(jié)合使用
            stringReader.mark(2);
            stringReader.reset();
            char[] chars4=new char[3];
            int read5 = stringReader.read(chars4,0,3);
            System.out.println("mark()與reset()結(jié)合使用:"+new String(chars4,0,3));
          
            // long skip(long ns) throws IOException   跳過流中指定數(shù)量的字符 返回跳過的字符數(shù)
            stringReader.skip(2);     //正數(shù)往前跳
//            stringReader.skip(-2);    //負(fù)數(shù)往后跳
            char[] chars5=new char[3];
            int read6 = stringReader.read(chars5,0,3);
            System.out.println("向前跳兩個字符:"+new String(chars5,0,3));
            //關(guān)閉流
            stringReader.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    
    public static void main(String[] args) {
        StringReader();
    }
}

運(yùn)行結(jié)果

讀取前三個字符:今天外
是否支持標(biāo)記:true
mark標(biāo)記后讀三個數(shù):面真的
單獨(dú)使用reset()方法:面真的
mark()與reset()結(jié)合使用:冷啊果
向前跳兩個字符:該點(diǎn)外

以上為個人經(jīng)驗(yàn),希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • SpringBoot異步Async使用Future與CompletableFuture區(qū)別小結(jié)

    SpringBoot異步Async使用Future與CompletableFuture區(qū)別小結(jié)

    本文主要介紹了SpringBoot異步Async使用Future與CompletableFuture區(qū)別小結(jié),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-06-06
  • 詳解Java如何實(shí)現(xiàn)自定義注解

    詳解Java如何實(shí)現(xiàn)自定義注解

    注解(Annotation),也叫元數(shù)據(jù)。一種代碼級別的說明。它是JDK1.5及以后版本引入的一個特性,與類、接口、枚舉是在同一個層次。本文將通過示例詳解Java如何實(shí)現(xiàn)自定義注解,需要的可以參考一下
    2022-06-06
  • 詳解Java設(shè)計(jì)模式之備忘錄模式的使用

    詳解Java設(shè)計(jì)模式之備忘錄模式的使用

    這篇文章主要介紹了Java設(shè)計(jì)模式之備忘錄模式的使用,備忘錄模式中的發(fā)起者和管需要的朋友可以參考下
    2016-02-02
  • Java中BigDecimal除法使用不當(dāng)導(dǎo)致精度問題

    Java中BigDecimal除法使用不當(dāng)導(dǎo)致精度問題

    本文主要介紹了Java中BigDecimal除法使用不當(dāng)導(dǎo)致精度問題,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • 記錄一次connection reset 錯誤的解決全過程

    記錄一次connection reset 錯誤的解決全過程

    這篇文章主要介紹了記錄一次connection reset 錯誤的解決全過程,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-04-04
  • 在IDEA中集成maven詳細(xì)流程圖示例

    在IDEA中集成maven詳細(xì)流程圖示例

    最近利用兩天時間學(xué)習(xí)了MyBatis以及maven,避免經(jīng)典的學(xué)過就忘記,我打算做出點(diǎn)總結(jié)以便日后復(fù)習(xí),當(dāng)然如果能幫到需要的人也是極好的,需要的朋友可以參考下
    2021-06-06
  • Spring 實(shí)現(xiàn)excel及pdf導(dǎo)出表格示例

    Spring 實(shí)現(xiàn)excel及pdf導(dǎo)出表格示例

    本篇文章主要介紹了Spring 實(shí)現(xiàn)excel及pdf導(dǎo)出表格示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-03-03
  • Simple Java Mail郵件發(fā)送實(shí)現(xiàn)過程解析

    Simple Java Mail郵件發(fā)送實(shí)現(xiàn)過程解析

    這篇文章主要介紹了Simple Java Mail郵件發(fā)送實(shí)現(xiàn)過程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-11-11
  • Mybatis Plus select 實(shí)現(xiàn)只查詢部分字段

    Mybatis Plus select 實(shí)現(xiàn)只查詢部分字段

    這篇文章主要介紹了Mybatis Plus select 實(shí)現(xiàn)只查詢部分字段的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • 在Java內(nèi)存模型中測試并發(fā)程序代碼

    在Java內(nèi)存模型中測試并發(fā)程序代碼

    這篇文章主要介紹了在Java內(nèi)存模型中測試并發(fā)程序代碼,輔以文中所提到的JavaScript庫JCStress進(jìn)行,需要的朋友可以參考下
    2015-07-07

最新評論