Java基礎(chǔ)知識(shí)之StringReader流的使用
Java StringReader流的使用
一、StringReader流定義
API說明:字符串輸入流、其本質(zhì)就是字符串
二、StringReader的實(shí)例域
//流對(duì)象
private String str;
//流的長(zhǎng)度
private int length;
//流的當(dāng)前位置,下個(gè)字符的索引
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():從流中讀取單個(gè)字符,若到文件末尾則返回-1
/**
* 從流中讀取單個(gè)字符,若到文件末尾則返回-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個(gè)字節(jié)到目標(biāo)數(shù)組中,從目標(biāo)數(shù)組的下標(biāo)off開始存儲(chǔ),返回實(shí)際讀取的字節(jié)數(shù)
/**
* 讀取最多l(xiāng)en個(gè)字節(jié)到目標(biāo)數(shù)組中,從目標(biāo)數(shù)組的下標(biāo)off開始存儲(chǔ),返回實(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)用該類其它方法會(huì)報(bào)異常
/**
* 關(guān)閉流無效,關(guān)閉后調(diào)用該類其它方法會(huì)報(bào)異常
*/
public void close() {
str = null;
}
五、StringReader流的作用
暫未使用故未知曉,故先了解功能
StringReader分析
IO流分類圖

訪問字符串
StringReader是字符輸入流,Reader的子類,從一個(gè)String中讀取,所以需要一個(gè)String ,通過構(gòu)造方法傳遞StringWriter是字符輸出流,Writer的子類,寫入到一個(gè)String中去,所以它內(nèi)部提供了一個(gè)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 :指向這個(gè)字符串
length :為字符串長(zhǎng)度
next :為讀取元素的下標(biāo)索引
mark :為標(biāo)記點(diǎn)
2. 基本方法
read()方法
//讀取一個(gè)字符
public int read() throws IOException {
synchronized (lock) {
ensureOpen();
if (next >= length)
return -1;
return str.charAt(next++);
}
}
注::從中可看出StringReader 將String字符串操作 適配成 Reader字符操作 對(duì)外提供服務(wù) —> StringReader是一個(gè)適配器類
//批量讀取
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操作不是一個(gè)性質(zhì)
//重置指針
public void reset() throws IOException {
synchronized (lock) {
ensureOpen();
next = mark;
}
}
注: 將mark標(biāo)記賦給next,reset()和mark()兩個(gè)方法配合使用
//跳過流中指定數(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. 測(cè)試代碼
//訪問字符串 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() 讀操作,讀取一個(gè)字符 (將String字符串操作 適配成 Reader字符操作 對(duì)外提供服務(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: 測(cè)試發(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)記后讀三個(gè)數(shù):"+new String(chars2,0,3));
//TODO:mark使用并不相當(dāng)于指針 --> 和RandomAccessFile的seek操作不是一個(gè)性質(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("向前跳兩個(gè)字符:"+new String(chars5,0,3));
//關(guān)閉流
stringReader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
StringReader();
}
}
運(yùn)行結(jié)果
讀取前三個(gè)字符:今天外
是否支持標(biāo)記:true
mark標(biāo)記后讀三個(gè)數(shù):面真的
單獨(dú)使用reset()方法:面真的
mark()與reset()結(jié)合使用:冷啊果
向前跳兩個(gè)字符:該點(diǎn)外
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
SpringBoot異步Async使用Future與CompletableFuture區(qū)別小結(jié)
本文主要介紹了SpringBoot異步Async使用Future與CompletableFuture區(qū)別小結(jié),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-06-06
Java中BigDecimal除法使用不當(dāng)導(dǎo)致精度問題
本文主要介紹了Java中BigDecimal除法使用不當(dāng)導(dǎo)致精度問題,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-11-11
記錄一次connection reset 錯(cuò)誤的解決全過程
這篇文章主要介紹了記錄一次connection reset 錯(cuò)誤的解決全過程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-04-04
Spring 實(shí)現(xiàn)excel及pdf導(dǎo)出表格示例
本篇文章主要介紹了Spring 實(shí)現(xiàn)excel及pdf導(dǎo)出表格示例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-03-03
Simple Java Mail郵件發(fā)送實(shí)現(xiàn)過程解析
這篇文章主要介紹了Simple Java Mail郵件發(fā)送實(shí)現(xiàn)過程解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-11-11
Mybatis Plus select 實(shí)現(xiàn)只查詢部分字段
這篇文章主要介紹了Mybatis Plus select 實(shí)現(xiàn)只查詢部分字段的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-09-09
在Java內(nèi)存模型中測(cè)試并發(fā)程序代碼
這篇文章主要介紹了在Java內(nèi)存模型中測(cè)試并發(fā)程序代碼,輔以文中所提到的JavaScript庫(kù)JCStress進(jìn)行,需要的朋友可以參考下2015-07-07

