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é),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-06-06Java中BigDecimal除法使用不當(dāng)導(dǎo)致精度問題
本文主要介紹了Java中BigDecimal除法使用不當(dāng)導(dǎo)致精度問題,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-11-11Spring 實(shí)現(xiàn)excel及pdf導(dǎo)出表格示例
本篇文章主要介紹了Spring 實(shí)現(xiàn)excel及pdf導(dǎo)出表格示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-03-03Simple Java Mail郵件發(fā)送實(shí)現(xiàn)過程解析
這篇文章主要介紹了Simple Java Mail郵件發(fā)送實(shí)現(xiàn)過程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-11-11Mybatis Plus select 實(shí)現(xiàn)只查詢部分字段
這篇文章主要介紹了Mybatis Plus select 實(shí)現(xiàn)只查詢部分字段的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-09-09