[重學Java基礎][Java IO流] [Part.1] 字符數組輸入/輸出流
CharArrayReader
概述
CharArrayReader字符數組輸入流,繼承了所有字符輸入流的超類Reader類,是一個具體功能的子類,用於讀取字符數組
此類是數據始終儲存在內存中的節點流,也可稱之爲內存流
實際上並沒有對外部數據源進行讀入操作 直接採用內存中的數據
主要用於適配以字符輸入流爲參數的接口
源碼分析
成員屬性
public class CharArrayReader extends Reader {
/** 字符數組緩衝流 */
protected char buf[];
/** 當前字符緩衝流 下一次讀取的開始位置*/
protected int pos;
/** 在緩衝流中的被標記的位置. */
protected int markedPos = 0;
/**字符數組緩衝流的長度*/
protected int count;
……
}
可以看到CharArrayReader存在四個成員屬性
- 字符數組形式char buf[],實際上就是流的內容體
- 當前字符緩衝流下一次讀取的開始位置int pos,每次讀取就從pos標記的位置開始
- 在緩衝流中的被標記的位置 int markedPos 用戶手動調用以保存當前讀取位置
- 流內容長度int count
-
成員方法
成員方法一共有11個,主要的就是讀取方法CharArrayReader,標記方法mark,重置方法reset
CharArrayReader構造方法有兩個重載,一個直接讀入字符數組char buf[]作爲輸入流,起始位置爲0位,流的大小等於字符數組的大小。
public CharArrayReader(char buf[]) {
this.buf = buf;
this.pos = 0;
this.count = buf.length;
}
另一個從指定位置讀入入字符數組char buf[]作爲輸入流,起始位置爲指定的offset,讀入時從offset位置開始讀入數據,讀入的大小等於length,流的大小等於讀入的length大小,但最大不超過字符數組buf的大小
public CharArrayReader(char buf[], int offset, int length) {
if ((offset < 0) || (offset > buf.length) || (length < 0) ||
((offset + length) < 0)) {
throw new IllegalArgumentException();
}
this.buf = buf;
this.pos = offset;
this.count = Math.min(offset + length, buf.length);
this.markedPos = offset;
}
read方法 讀取一個單字符 並移動遊標 返回一個整型
public int read() throws IOException {
synchronized (lock) {
ensureOpen();
if (pos >= count)
return -1;
else
return buf[pos++];
}
}
重載和CharArrayReader構造方法類似 加入了初始位置和讀入大小
public int read(char b[], int off, int len) throws IOException {
……
}
skip方法 跳過流的一部分內容 入參long n 跳過n大小的字符流內容 下次讀入從n+1開始
public long skip(long n) throws IOException {
synchronized (lock) {
ensureOpen();
if (pos + n > count) {
n = count - pos;
}
if (n < 0) {
return 0;
}
pos += n;
return n;
}
}
mark方法 標記當前流讀取位置 配合reset方法使用 入參int readAheadLimit 無作用
public void mark(int readAheadLimit) throws IOException {
synchronized (lock) {
ensureOpen();
markedPos = pos;
}
}
reset方法 將流讀取位置重置爲標記的位置 配合mark方法使用
public void reset() throws IOException {
synchronized (lock) {
ensureOpen();
pos = markedPos;
}
}
代碼示例
示例1
char chs[]=new char[] {'a','b','c','d','e','f','g','h','i','j','k','l','m','n'};
//讀入字符數組初始化CharArrayReader
CharArrayReader charArrayReader=new CharArrayReader(chs);
int i=0;
//循環讀取流內容並打印到控制檯 -1結束
while ((i=charArrayReader.read())!=-1)
{
System.out.printf("%s,",(char)i);
}
- 運行結果
a,b,c,d,e,f,g,h,i,j,k,l,m,n
示例2
char chs[]=new char[]{'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o'};
//讀入字符數組初始化CharArrayReader
CharArrayReader charArrayReader=new CharArrayReader(chs);
int i=0;
//讀入字符流內容並循環輸出前5位
for(;i<=4;i++)
{
System.out.printf("%s ",(char)charArrayReader.read());
}
System.out.println();
//保存當前讀取位置 已讀取5位 所以當前遊標在f 下一位正常讀入爲f
charArrayReader.mark(0);
//跳過5個 所以讀入遊標移動到k
charArrayReader.skip(5);
for(i=0;i<=4;i++)
{
System.out.printf("%s ",(char)charArrayReader.read());
}
System.out.println();
//重置讀入遊標到標記的位置
charArrayReader.reset();
for(i=0;i<=4;i++)
{
System.out.printf("%s ",(char)charArrayReader.read());
}
System.out.println();
運行結果
a b c d e k l m n o f g h i j
CharArrayWriter
概述
CharArrayWriter字符數組輸出流,繼承了所有字符輸出流的超類Writer類,是一個具體功能的子類,用於輸出字符數組
此類是數據始終儲存在內存中的節點流,也可稱之爲內存流
實際上並沒有對外部數據匯進行寫入操作 直接寫入到內存中
主要用於適配以字符輸出流爲參數的接口
源碼分析
成員屬性
public class CharArrayWriter extends Writer {
protected char buf[];
protected int count;
}
字符串數組char buf[] 存儲流內容體
流內容大小 int count
成員方法
可以看到主要也就是幾個方法
可以初始化字符流數組大小的構造方法
public CharArrayWriter() {
this(32);
}
/**
public CharArrayWriter(int initialSize) {
if (initialSize < 0) {
throw new IllegalArgumentException
("Negative initial size: " + initialSize);
}
buf = new char[initialSize];
}
不同入參的多重載append write方法
public void write(int c) {
synchronized (lock) {
int newcount = count + 1;
if (newcount > buf.length) {
buf = Arrays.copyOf(buf, Math.max(buf.length << 1, newcount));
}
buf[count] = (char)c;
count = newcount;
}
}
public void write(char c[], int off, int len) {
if ((off < 0) || (off > c.length) || (len < 0) ||
((off + len) > c.length) || ((off + len) < 0)) {
throw new IndexOutOfBoundsException();
} else if (len == 0) {
return;
}
synchronized (lock) {
int newcount = count + len;
if (newcount > buf.length) {
buf = Arrays.copyOf(buf, Math.max(buf.length << 1, newcount));
}
System.arraycopy(c, off, buf, count, len);
count = newcount;
}
}
public void write(String str, int off, int len) {
synchronized (lock) {
int newcount = count + len;
if (newcount > buf.length) {
buf = Arrays.copyOf(buf, Math.max(buf.length << 1, newcount));
}
str.getChars(off, off + len, buf, count);
count = newcount;
}
}
reset重置方法
public void reset() {
count = 0;
}
示例代碼
示例1
CharArrayWriter charArrayWriter=new CharArrayWriter();
charArrayWriter.write(97);
charArrayWriter.write(98);
charArrayWriter.write(99);
System.out.println(charArrayWriter.toString());
輸出結果
abc
示例2
CharArrayWriter charArrayWriter=new CharArrayWriter();
charArrayWriter.write("abcdefg",3,2);
System.out.println(charArrayWriter.toString());
結語
其實這兩個類和StringWriter StringReader兩個字符串輸入\輸出流操作類很像
只不過一個流的入參是char型 另一個是String型