[重學Java基礎][JavaIO流][Part.4]過濾字符輸入輸出流
FilterReader 與PushbackReader
概述
FilterReader是用於過濾輸入字符的抽象類 PushbackReader是FilterReader的一個具體實現
官方註釋
FilterReader是讀入過濾字符流的抽象類,這個抽象類的默認方法允許所有流內容通過。繼承FilterReader的子類必須重寫其中一些方法或者添加附加方法和屬性(用於是實現過濾讀取)
PushbackReader 允許回滾的字符輸入流 繼承自FilterReader
源碼分析
可以看到FilterReader 基本沒有什麼自己的方法 全部是繼承自Reader的方法
而回退流有自己的回退方法unread
成員變量
提供回滾的緩衝字符數組
private char[] buf;
緩衝數組遊標
private int pos;
成員方法
構造方法
public PushbackReader(Reader in, int size) {
super(in);
if (size <= 0) {
throw new IllegalArgumentException("size <= 0");
}
按size大小創建回退緩衝數組
this.buf = new char[size];
this.pos = size;
}
public PushbackReader(Reader in) {
this(in, 1);
}
回退方法 其實就是把讀入的內容緩衝到緩衝字符數組中
public int read() throws IOException {
synchronized (lock) {
ensureOpen();
if (pos < buf.length)
return buf[pos++];
else
return super.read();
}
}
代碼示例
try (
// 創建一個PushbackReader對象,指定推回緩衝區的長度爲64
PushbackReader pr = new PushbackReader(new FileReader(
"d://2017.txt"), 64);
) {
char[] buf = new char[32];
// 用以保存上次讀取字符串的內容
String lastContent = "";
int hasRead = 0;
// 循環讀取文件內容
while ((hasRead = pr.read(buf)) > 0) {
// 將讀取的內容轉化爲字符串
String content = new String(buf, 0, hasRead);
int targetIndex = 0;
// 將上次讀取的字符串和本次讀取的字符串拼接起來
// 查看是否包含目標字符串,
// 如果包含目標字符串
if ((targetIndex = (lastContent + content)
.indexOf("幹物妹")) > 0) {
// 將本次的內容和上次的內容一起推回緩衝區
pr.unread((lastContent + content).toCharArray());
// 重現定義一個長度爲targetIndex的char類型的數組
if (targetIndex > 32) {
buf = new char[targetIndex];
}
// 再次讀取指定長度的內容,即目標字符串之前的內容
pr.read(buf, 0, targetIndex);
// 答應讀取指定長度的內容
System.out.println(new String(buf, 0, targetIndex));
System.exit(0);
} else {
// 打印上次讀取的內容
System.out.println(lastContent);
// 將本次讀取的內容設置爲上次讀取的內容
lastContent = content;
}
}
} catch (IOException ioe) {
ioe.printStackTrace();
}
FilterWriter
概述
官方註釋
FilterWriter類是用於寫出過濾後字節流的抽象類
該類提供了默認的方法把全部請求傳遞到包裹的底層流中
以該類作爲基類的類需要覆寫該類的一些方法並可能需要提供額外的方法和參數
源碼分析
FilterWriter類和FilterReader類似
基本沒有什麼自己的方法 全部是繼承自Reader的方法
需要繼承FilterWriter並實現自己的方法纔可以使用