Java基礎(chǔ)知識(shí)之CharArrayWriter流的使用
Java CharArrayWriter流
一、CharArrayWriter流定義
API說明:該類實(shí)現(xiàn)了一個(gè)可用作字符輸出流的字符緩沖區(qū),當(dāng)數(shù)據(jù)寫入流時(shí),緩沖區(qū)自動(dòng)增長,請(qǐng)注意在此類上調(diào)用close()無效,并且可以在流關(guān)閉后調(diào)用此類的方法而不生成IOException。
二、CharArrayWriter流構(gòu)造函數(shù)
根據(jù)指定緩沖區(qū)大小或者默認(rèn)緩沖區(qū)大小創(chuàng)建CharArrayWriter流對(duì)象
/**
*創(chuàng)造默認(rèn)緩沖區(qū)大小的CharArrayWriter對(duì)象
*/
public CharArrayWriter() {
this(32);
}
/**
* 創(chuàng)造指定緩沖區(qū)大小的CharArrayWriter對(duì)象
*/
public CharArrayWriter(int initialSize) {
if (initialSize < 0) {
throw new IllegalArgumentException("Negative initial size: "
+ initialSize);
}
buf = new char[initialSize];
}
三、CharArrayWriter流實(shí)例域
/**
* 字符緩沖區(qū)
*/
protected char buf[];
/**
* 緩沖區(qū)中的當(dāng)前位置
*/
protected int count;
四、CharArrayWriter流方法
1)write(int c):寫一個(gè)字符到緩沖區(qū)中
/**
* 寫一個(gè)單個(gè)字符到緩沖區(qū)中
*/
public void write(int c) {
synchronized (lock) {
int newcount = count + 1;
//判定寫入的下個(gè)元素是否超出緩沖區(qū)長度
if (newcount > buf.length) {
//進(jìn)行擴(kuò)容
buf = Arrays.copyOf(buf, Math.max(buf.length << 1, newcount));
}
buf[count] = (char)c;
count = newcount;
}
}
實(shí)際流程:

2)write(char c[], int off, int len):從字符數(shù)組中寫len個(gè)字符到緩沖區(qū)中
/**
* 將字符數(shù)組的一部分寫入到緩沖區(qū)中,自動(dòng)擴(kuò)容增長
*/
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;
//判定緩沖區(qū)寫入len個(gè)字符后長度是否超出限制
if (newcount > buf.length) {
buf = Arrays.copyOf(buf, Math.max(buf.length << 1, newcount));
}
System.arraycopy(c, off, buf, count, len);
count = newcount;
}
}
實(shí)際流程:

3)write(String str, int off, int len):將字符串的一部分寫入到緩沖區(qū)中
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;
}
}
4)writeTo(Writer out):將緩沖區(qū)的內(nèi)容寫入到另一個(gè)字符輸出流中
public void writeTo(Writer out) throws IOException {
synchronized (lock) {
out.write(buf, 0, count); //本質(zhì)理解為將緩沖區(qū)的內(nèi)容給寫了出去
}
}
5)檢索緩沖區(qū)中的數(shù)據(jù)
/**
* 將緩沖區(qū)中的數(shù)據(jù)轉(zhuǎn)成字符串
* @return the string.
*/
public String toString() {
synchronized (lock) {
return new String(buf, 0, count);
}
}
/**
* 將緩沖區(qū)的數(shù)據(jù)轉(zhuǎn)成字符數(shù)組
*/
public char toCharArray()[] {
synchronized (lock) {
return Arrays.copyOf(buf, count);
}
}
6)close():關(guān)閉流無效,本質(zhì)沒有做任何操作
/**
* 刷新流--無效
*/
public void flush() { }
/**
* 關(guān)閉流--無效
*/
public void close() { }
四、CharArrayWriter流的作用
與CharArrayReader流一樣,待后期理解加深、實(shí)際項(xiàng)目運(yùn)用過后再來補(bǔ)充
Java基礎(chǔ)之什么是CharArrayWriter
CharArrayWriter 實(shí)現(xiàn)了以數(shù)組作為目標(biāo)的輸出流。CharArrayWriter 有兩個(gè)構(gòu)造函數(shù):
CharArrayWriter( ) CharArrayWriter(int numChars)
第一種形式,創(chuàng)建了一個(gè)默認(rèn)長度的緩沖器。
第二種形式,緩沖器長度由numChars指定。
緩沖器保存在CharArrayWriter的buf 成員中。緩沖器大小在需要的情況下可以自動(dòng)增長。緩沖器保持的字符數(shù)包含在CharArrayWriter的count 成員中。buf 和count 都是受保護(hù)的域。
下面的例子闡述了CharArrayWriter
我們繼續(xù)使用前面顯示的ByteArrayOutputStream 例子中演示的程序。它的輸出與以前的例子輸出相同:
// Demonstrate CharArrayWriter.
import java.io.*;
class CharArrayWriterDemo {
public static void main(String args[]) throws IOException {
CharArrayWriter f = new CharArrayWriter();
String s = "This should end up in the array";
char buf[] = new char[s.length()];
s.getChars(0, s.length(), buf, 0);
f.write(buf);
System.out.println("Buffer as a string");
System.out.println(f.toString());
System.out.println("Into array");
char c[] = f.toCharArray();
for (int i=0; i<c.length; i++) {
System.out.print(c[i]);
}
System.out.println("\nTo a FileWriter()");
FileWriter f2 = new FileWriter("test.txt");
f.writeTo(f2);
f2.close();
System.out.println("Doing a reset");
f.reset();
for (int i=0; i<3; i++)
f.write('X');
System.out.println(f.toString());
}
}
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- ByteArrayInputStream簡介和使用_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
- Java使用ByteArrayOutputStream 和 ByteArrayInputStream 避免重復(fù)讀取配置文件的方法
- Java 8 Stream流強(qiáng)大的原理
- Java基礎(chǔ)知識(shí)之ByteArrayOutputStream流的使用
- Java基礎(chǔ)知識(shí)之StringWriter流的使用
- Java?IO流之StringWriter和StringReader用法分析
- Java基礎(chǔ)知識(shí)之ByteArrayInputStream流的使用
相關(guān)文章
SpringBoot帶你實(shí)現(xiàn)一個(gè)點(diǎn)餐小程序
有個(gè)小伙伴臨時(shí)找到我,要開發(fā)一個(gè)點(diǎn)餐的系統(tǒng),時(shí)間比較著急,給了2天的時(shí)間。馬馬虎虎的搞出來了,頭發(fā)掉了一撮!下面介紹下本系統(tǒng),感興趣的小伙伴,可以參考開發(fā)下2022-07-07
Java 如何將網(wǎng)絡(luò)資源url轉(zhuǎn)化為File文件
這篇文章主要介紹了Java 如何將網(wǎng)絡(luò)資源url轉(zhuǎn)化為File文件的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-09-09
Spring-AOP-ProceedingJoinPoint的使用詳解
這篇文章主要介紹了Spring-AOP-ProceedingJoinPoint的使用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2025-03-03
java使用Base64實(shí)現(xiàn)文件加密解密
這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)Base64給文件加密、解密,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-03-03
eclipse報(bào)錯(cuò) eclipse啟動(dòng)報(bào)錯(cuò)解決方法
本文將介紹eclipse啟動(dòng)報(bào)錯(cuò)解決方法,需要了解的朋友可以參考下2012-11-11
Spring Boot實(shí)現(xiàn)STOMP協(xié)議的WebSocket的方法步驟
這篇文章主要介紹了Spring Boot實(shí)現(xiàn)STOMP協(xié)議的WebSocket的方法步驟,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2019-05-05
Java EasyExcel導(dǎo)出報(bào)內(nèi)存溢出的解決辦法
使用EasyExcel進(jìn)行大數(shù)據(jù)量導(dǎo)出時(shí)容易導(dǎo)致內(nèi)存溢出,特別是在導(dǎo)出百萬級(jí)別的數(shù)據(jù)時(shí),你有遇到過這種情況嗎,以下是小編整理的解決該問題的一些常見方法,需要的朋友可以參考下2024-10-10

