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

Java?IO流之StringWriter和StringReader用法分析

 更新時間:2021年12月10日 10:00:33   作者:DreamTech1113  
這篇文章主要介紹了Java?IO流之StringWriter和StringReader用法分析,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

簡介

StringWriter和StringReader分別繼承自Writer和Reader抽象類,作用就是將字符串String類型適配到StringWriter和StringReader類.

其中StringWriter實際上是用StringBuffer實現(xiàn)的,StringBuffer是一個線程安全的類,實際上默認的是16個字符的char數(shù)組.所以通過方法write()和append()等其他重載的方法.將字符串添加到StringBuffer中,可以調(diào)用toString()或者getBuffer()方法顯示StringWriter流中所有的數(shù)據(jù).其中close()方法和flush()方法,無實際的功能,只是簡單的繼承.

StringReader的有參構(gòu)造方法傳入的是String類型的數(shù)據(jù),通過read()重載方法讀取流中部分或者全部的字符內(nèi)容.

StringWriter介紹

1.構(gòu)造方法

public StringWriter() {}
public StringWriter(int initialSize) {}

無參構(gòu)造方法,創(chuàng)建的是默認大小為StringBuffer的StringWriter流,其中StringBuffer底層實際是一個字符數(shù)組,默認大小是16個字符.

有參構(gòu)造方法,創(chuàng)建的是指定大小的StringBuffer的StringWriter流,也就是指定initialSize個字符的字符數(shù)組.

2.內(nèi)部變量

private StringBuffer buf;

StringWriter流中緩沖區(qū)實際上通過StringBuffer來實現(xiàn)的.

3. 內(nèi)部方法

public void write(int c) {}
public void write(char cbuf[], int off, int len){}
public void write(String str) {}
public void write(String str, int off, int len){}
public StringWriter append(CharSequence csq){}
public StringWriter append(CharSequence csq, int start, int end){}
public StringWriter append(char c){}
public String toString() {}
public StringBuffer getBuffer() {}
public void flush() {}
public void close() {}
  • write(int c)---將單個字符寫到流中.
  • write(char cbuf[] ,int off,int len)---將字符數(shù)組cbuf中off開始,len個字符寫到流中.
  • write(String str)---將字符串str寫到流中.
  • write(String str,int off,int len)---將字符串str中off位置開始,len個字符寫到流中.
  • append(charsequence csq)---將字符序列csq寫到流中.
  • append(charsequence csq,int start ,int end)----將字符序列中start到end之間字符寫到流中.
  • append(char c)---將單個字符寫到流中.
  • toString()---將流中所有字符轉(zhuǎn)換成字符串返回.
  • getBuffer()----將流中內(nèi)容,實際是StringBuffer返回.
  • flush()---僅僅是繼承,方法內(nèi)沒有任何實現(xiàn).
  • close()----僅僅是繼承,方法內(nèi)沒有任何實現(xiàn).

StringReader介紹

1.構(gòu)造方法

public StringReader(String s) {}

有參構(gòu)造方法,傳入的實際上是流中內(nèi)容為字符串s.

2.內(nèi)部變量

  private String str;
  private int length;
  private int next = 0;
  private int mark = 0;
  • str---StringReader流中實際的數(shù)據(jù)就是通過構(gòu)造方法傳入的字符串str.
  • length---流中字符串的長度.
  • next---要讀取的下一個字符的位置.
  • mark---標(biāo)記字符位置,調(diào)用mark()方法會將當(dāng)前位置保存到mark中.

3. 內(nèi)部方法

private void ensureOpen(){}
public int read(){}
public int read(char cbuf[], int off, int len){}
public long skip(long ns){}
public boolean ready(){}
public boolean markSupported() {}
public void mark(int readAheadLimit){}
public void reset(){}
public void close(){}
  • ensureOpen()---確保流沒有關(guān)閉,實際判斷是流中內(nèi)容字符串str不為null.
  • read()---從流中讀取一個字符.
  • read(char cbuf[],int off,int len)---將流中最多l(xiāng)en個字符讀取到字符數(shù)組cbuf中,cbuf中從off開始.
  • skip(long ns)---跳過ns個字符.
  • ready()---流是否準(zhǔn)備讀取.
  • markSupported()---是否支持標(biāo)記
  • mark(int readAheadLimit)---標(biāo)記當(dāng)前位置,readAheadLimit表示的是在標(biāo)記有效情況下,從當(dāng)前位置開始可取的最大字符數(shù).
  • reset()---將流中當(dāng)前位置重置到標(biāo)記位置.
  • close()---關(guān)閉流,實際上是將流中內(nèi)容字符串str置為null.

案例

public class StringWriterDemo {
  public static void main(String[] args) throws IOException {
    testStringWriter();
    testStringReader();
    testOfAnotherStringWriter();
  }
  //測試StringWriter
  private static void testStringWriter() throws IOException {
    StringWriter sw = new StringWriter();
    sw.append("this is a");
    sw.write("demo of StringWriter");
    System.out.println(sw.toString());
    sw.close();
  }
   
  //測試StringReader
  private static void testStringReader() throws IOException {
   String content = "this is a demo of StringReader";
   StringReader sr = new StringReader(content);
   int c;
   while((c=sr.read())!=-1) {
     System.out.println((char)c);
   }
    sr.close();
  }
  
  //將讀取的數(shù)據(jù)先寫到StringWriter流中,然后直接調(diào)用toString()方法打印結(jié)果
  private static void testOfAnotherStringWriter() throws IOException {
    FileReader fr = new FileReader("D:\\java.txt");
    BufferedReader br = new BufferedReader(fr);
    StringWriter sw = new StringWriter();
    int n;
    char cbuf[] = new char[1024];
    while((n=br.read(cbuf))!=-1) {
      sw.write(cbuf, 0, n);
    }
    System.out.println(sw.toString());
    fr.close();
    br.close();
  }
}

源碼分析

1.StringWriter源碼分析

public class StringWriter extends Writer {
    //StringWriter中緩沖功能是通過StringBuffer來實現(xiàn)的.
    private StringBuffer buf;
 
    //創(chuàng)建默認緩沖為16個字符的StringWriter.默認的StringBuffer實際是大小為16個字符的字符數(shù)組.
    public StringWriter() {
        buf = new StringBuffer();
        lock = buf;
    }
 
    //創(chuàng)建指定大小StringBuffer的StringWriter,也就是指定了initialSize個字符的字符數(shù)組.
    public StringWriter(int initialSize) {
        if (initialSize < 0) {
            throw new IllegalArgumentException("Negative buffer size");
        }
        buf = new StringBuffer(initialSize);
        lock = buf;
    }
 
    //向流寫入單個字符c
    public void write(int c) {
        buf.append((char) c);
    }
 
    //將字符數(shù)組cbuf中off位置開始,len個字符寫到流中
    public void write(char cbuf[], int off, int len) {
        if ((off < 0) || (off > cbuf.length) || (len < 0) ||
            ((off + len) > cbuf.length) || ((off + len) < 0)) {
            throw new IndexOutOfBoundsException();
        } else if (len == 0) {
            return;
        }
        buf.append(cbuf, off, len);
    }
 
    //將字符串str寫到流中
    public void write(String str) {
        buf.append(str);
    }
 
    //將字符串str中off位置開始,len個字符寫到流中
    public void write(String str, int off, int len)  {
        buf.append(str.substring(off, off + len));
    }
 
    //將字符序列csq添加到流中.
    public StringWriter append(CharSequence csq) {
        if (csq == null)
            write("null");
        else
            write(csq.toString());
        return this;
    }
 
    //將字符序列csq中start位置到end之間的字符添加到流中
    public StringWriter append(CharSequence csq, int start, int end) {
        CharSequence cs = (csq == null ? "null" : csq);
        write(cs.subSequence(start, end).toString());
        return this;
    }
 
    //向流中添加一個字符c
    public StringWriter append(char c) {
        write(c);
        return this;
    }
 
    //將流中字符轉(zhuǎn)換成字符串返回.
    public String toString() {
        return buf.toString();
    }
 
    //返回流的內(nèi)容,即StringBuffer
    public StringBuffer getBuffer() {
        return buf;
    }
 
    //刷新流,沒有具體實現(xiàn).
    public void flush() {
    }
 
    //關(guān)閉流后讀取數(shù)據(jù)不會拋出異常,因為沒有具體實現(xiàn)
    public void close() throws IOException {
    }
 
}

2,StringReader源碼分析

public class StringReader extends Reader {
    //流中實際數(shù)據(jù)就是通過構(gòu)造方法傳入str字符串.
    private String str;
    //字符串str的長度
    private int length;
    //下一個要讀取字符的位置.
    private int next = 0;
    //標(biāo)記的位置.
    private int mark = 0;
 
    //創(chuàng)建一個StringReader流,參數(shù)傳入的是字符串s
    public StringReader(String s) {
        this.str = s;
        this.length = s.length();
    }
 
   //確保流沒有關(guān)閉,實際判斷的是StringReader構(gòu)造方法是否有傳入字符串.
    private void ensureOpen() throws IOException {
        if (str == null)
            throw new IOException("Stream closed");
    }
 
    //讀取單個字符
    public int read() throws IOException {
        synchronized (lock) {
            ensureOpen();
            if (next >= length)
                return -1;
            return str.charAt(next++);
        }
    }
 
    //將緩沖區(qū)中最多l(xiāng)en個字符寫到字符數(shù)組cbuf中,位置從off開始,長度為len個
    public int read(char cbuf[], int off, int len) throws IOException {
        synchronized (lock) {
            ensureOpen();
            //檢測參數(shù)的合法性
            if ((off < 0) || (off > cbuf.length) || (len < 0) ||
                ((off + len) > cbuf.length) || ((off + len) < 0)) {
                throw new IndexOutOfBoundsException();
            } else if (len == 0) {
                return 0;
            }
            //超過字符串的長度,返回-1
            if (next >= length)
                return -1;
            //剩余可讀取的字符為length-next,
            //如果len超過剩余可讀取字符,實際只能讀取剩余可讀取字符
            //如果len小于剩余可讀取字符,實際上讀取的是len個字符
            int n = Math.min(length - next, len);
            str.getChars(next, next + n, cbuf, off);
            next += n;
            return n;
        }
    }
 
    //跳過ns個字符,返回跳過的字符數(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
            //緩沖區(qū)中剩余字符數(shù)與要跳過的字符數(shù)比較.取較小值
            long n = Math.min(length - next, ns);
            n = Math.max(-next, n);
            next += n;
            return n;
        }
    }
 
    //流是否準(zhǔn)備讀取.
    public boolean ready() throws IOException {
        synchronized (lock) {
        ensureOpen();
        return true;
        }
    }
 
    //流是否支持標(biāo)記
    public boolean markSupported() {
        return true;
    }
 
   //標(biāo)記緩沖區(qū)中當(dāng)前位置,readAheadLimit表示的是在保留標(biāo)記的情況下,最大可讀取的字符數(shù)
    public void mark(int readAheadLimit) throws IOException {
        if (readAheadLimit < 0){
            throw new IllegalArgumentException("Read-ahead limit < 0");
        }
        synchronized (lock) {
            ensureOpen();
            mark = next;
        }
    }
 
    //將緩沖區(qū)當(dāng)前位置重置到標(biāo)記位置
    public void reset() throws IOException {
        synchronized (lock) {
            ensureOpen();
            next = mark;
        }
    }
 
    //關(guān)閉流,釋放相關(guān)資源(實際只是將流中內(nèi)容字符串置為空)
    public void close() {
        str = null;
    }
}
 

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

相關(guān)文章

  • Java高級之虛擬機加載機制的實例講解

    Java高級之虛擬機加載機制的實例講解

    下面小編就為大家分享一篇Java高級之虛擬機加載機制的實例講解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2017-12-12
  • Java通過反射機制將對象封裝成JSON和JsonArray格式

    Java通過反射機制將對象封裝成JSON和JsonArray格式

    這篇文章主要介紹了Java通過反射機制將對象封裝成JSON和JsonArray格式,JAVA反射機制是在運行狀態(tài)中,對于任意一個實體類,都能夠知道這個類的所有屬性和方法,需要的朋友可以參考下
    2023-10-10
  • 總結(jié)Java常用加解密方法AES?SHA1?md5

    總結(jié)Java常用加解密方法AES?SHA1?md5

    這篇文章主要為大家介紹了Java常用加密方法AES?SHA1?md5總結(jié)及示例demo,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-06-06
  • SpringMVC @RequestBody Date類型的Json轉(zhuǎn)換方式

    SpringMVC @RequestBody Date類型的Json轉(zhuǎn)換方式

    這篇文章主要介紹了SpringMVC @RequestBody Date類型的Json轉(zhuǎn)換方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • Java實現(xiàn)產(chǎn)生隨機字符串主鍵的UUID工具類

    Java實現(xiàn)產(chǎn)生隨機字符串主鍵的UUID工具類

    這篇文章主要介紹了Java實現(xiàn)產(chǎn)生隨機字符串主鍵的UUID工具類,涉及java隨機數(shù)與字符串遍歷、轉(zhuǎn)換等相關(guān)操作技巧,需要的朋友可以參考下
    2017-10-10
  • 淺談@RequestBody和@RequestParam可以同時使用

    淺談@RequestBody和@RequestParam可以同時使用

    這篇文章主要介紹了@RequestBody和@RequestParam可以同時使用,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • SpringMVC中@Valid不起效BindingResult讀取不到Error信息

    SpringMVC中@Valid不起效BindingResult讀取不到Error信息

    在寫SpringMVC項目時,由于要對表單數(shù)據(jù)進行校驗,需要使用@Valid進行校驗,但是在進行數(shù)據(jù)校驗時,BindingResult對象無法攔截非法表單數(shù)據(jù),result.hasErrors()無論怎么輸入都會返回false,本文詳細的介紹一下解決方法
    2021-09-09
  • 從零開始搭建springboot+springcloud+mybatis本地項目全過程(圖解)

    從零開始搭建springboot+springcloud+mybatis本地項目全過程(圖解)

    這篇文章主要介紹了從零開始搭建springboot+springcloud+mybatis本地項目全過程(圖解),本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-01-01
  • 劍指Offer之Java算法習(xí)題精講鏈表與二叉樹專項訓(xùn)練

    劍指Offer之Java算法習(xí)題精講鏈表與二叉樹專項訓(xùn)練

    跟著思路走,之后從簡單題入手,反復(fù)去看,做過之后可能會忘記,之后再做一次,記不住就反復(fù)做,反復(fù)尋求思路和規(guī)律,慢慢積累就會發(fā)現(xiàn)質(zhì)的變化
    2022-03-03
  • 詳解Spring中BeanUtils工具類的使用

    詳解Spring中BeanUtils工具類的使用

    這篇文章主要通過一些示例為大家詳細介紹了Spring中BeanUtils工具類的使用,文中的示例代碼講解詳細,感興趣的小伙伴可以了解一下
    2022-06-06

最新評論

通山县| 松溪县| 高陵县| 邮箱| 华容县| 郸城县| 治县。| 信阳市| 通辽市| 府谷县| 思茅市| 山阳县| 新晃| 怀仁县| 丰城市| 金乡县| 黄浦区| 新乡市| 工布江达县| 泽普县| 吉安县| 交口县| 东乌| 维西| 中西区| 壶关县| 嘉荫县| 安丘市| 鄂尔多斯市| 常德市| 南陵县| 青阳县| 金秀| 江源县| 西宁市| 留坝县| 渭源县| 东阿县| 许昌市| 三河市| 高雄市|