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

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

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

Java StringReader流的使用

一、StringReader流定義

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

二、StringReader的實例域

    //流對象
    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開始存儲,返回實際讀取的字節(jié)數(shù)

 /**
     * 讀取最多l(xiāng)en個字節(jié)到目標(biāo)數(shù)組中,從目標(biāo)數(shù)組的下標(biāo)off開始存儲,返回實際讀取的字節(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)記點
    

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)該點外的";
        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   重置指針
            // 單獨使用 reset() 方法
            stringReader.reset();
            char[] chars3=new char[3];
            int read4 = stringReader.read(chars3,0,3);
            System.out.println("單獨使用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();
    }
}

運行結(jié)果

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

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

相關(guān)文章

  • Java泛型定義與用法實例詳解

    Java泛型定義與用法實例詳解

    這篇文章主要介紹了Java泛型定義與用法,結(jié)合實例形式較為詳細(xì)的分析了Java中泛型的概念、原理、定義、使用方法及相關(guān)操作注意事項,需要的朋友可以參考下
    2018-08-08
  • SpringBoot集成tensorflow實現(xiàn)圖片檢測功能

    SpringBoot集成tensorflow實現(xiàn)圖片檢測功能

    TensorFlow名字的由來就是張量(Tensor)在計算圖(Computational?Graph)里的流動(Flow),它的基礎(chǔ)就是前面介紹的基于計算圖的自動微分,本文將給大家介紹Spring?Boot集成tensorflow實現(xiàn)圖片檢測功能,需要的朋友可以參考下
    2024-06-06
  • spring security如何擴展自定義登錄

    spring security如何擴展自定義登錄

    本文詳細(xì)介紹了Spring Security的認(rèn)證原理和具體實現(xiàn),認(rèn)證原理基于過濾器鏈,通過驗證用戶憑證和構(gòu)建認(rèn)證對象來保護應(yīng)用程序資源,實現(xiàn)自定義認(rèn)證功能的步驟包括創(chuàng)建自定義認(rèn)證提供程序、實現(xiàn)UserDetailsService接口以及在配置類中進行相應(yīng)的配置
    2024-11-11
  • java發(fā)送heartbeat心跳包(byte轉(zhuǎn)16進制)

    java發(fā)送heartbeat心跳包(byte轉(zhuǎn)16進制)

    這篇文章主要介紹了java發(fā)送heartbeat心跳包(byte轉(zhuǎn)16進制),需要的朋友可以參考下
    2014-05-05
  • 詳解 問題:HttpServlet cannot be resolved to a type

    詳解 問題:HttpServlet cannot be resolved to a type

    這篇文章主要介紹了詳解 問題:HttpServlet cannot be resolved to a type的相關(guān)資料,需要的朋友可以參考下
    2017-03-03
  • java9開始——接口中可以定義private私有方法

    java9開始——接口中可以定義private私有方法

    這篇文章主要介紹了從java9開始 接口中可以定義private私有方法,幫助大家更好的理解和學(xué)習(xí)Java,感興趣的朋友可以了解下
    2020-10-10
  • Java 線程池詳解

    Java 線程池詳解

    本文給大家總結(jié)了java中的線程池的相關(guān)問題,非常的詳細(xì)也很實用,有需要的小伙伴可以參考下。
    2016-03-03
  • Java虛擬機常見內(nèi)存溢出錯誤匯總

    Java虛擬機常見內(nèi)存溢出錯誤匯總

    這篇文章主要匯總了Java虛擬機常見的內(nèi)存溢出錯誤,警示大家,避免出錯,感興趣的朋友可以了解下
    2020-09-09
  • Java 替換字符串右側(cè)出現(xiàn)的第一個子串方式

    Java 替換字符串右側(cè)出現(xiàn)的第一個子串方式

    這篇文章主要介紹了Java 替換字符串右側(cè)出現(xiàn)的第一個子串方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • java數(shù)據(jù)結(jié)構(gòu)基礎(chǔ):順序隊列和循環(huán)隊列

    java數(shù)據(jù)結(jié)構(gòu)基礎(chǔ):順序隊列和循環(huán)隊列

    下面小編就為大家分享一篇java隊列實現(xiàn)方法(順序隊列,循環(huán)隊列),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-08-08

最新評論

澄城县| 大城县| 巫山县| 杂多县| 镇远县| 阆中市| 西城区| 苍山县| 得荣县| 丹寨县| 西和县| 繁峙县| 舒兰市| 乐清市| 灵宝市| 镇远县| 雅安市| 慈溪市| 平泉县| 台北市| 方山县| 富源县| 南宁市| 安福县| 原阳县| 襄城县| 两当县| 邹平县| 灵武市| 渭南市| 慈溪市| 五华县| 游戏| 九龙城区| 澄城县| 东台市| 龙州县| 闽侯县| 广灵县| 磐石市| 安乡县|