java.IO中提供了ByteArrayInputStream/ByteArrayOutputStream字節(jié)數(shù)組輸入輸出流溪窒。
其實(shí)質(zhì)是在用,數(shù)組的思想來操作讀寫操作。
在進(jìn)行IO操作的時候我們可以大概分為三個對象:
控制臺:System.in/System.out
硬盤:FileStream(包括字節(jié)流和字符流輸入輸出)
內(nèi)存:ArrayStream(包括字節(jié)流中的ByteArray,字符流中的CharArray)。
ByteArrayOutputStream的用法:
(1)ByteArrayOutputStream笑诅,從某一輸入流中獲取字節(jié)數(shù)據(jù),調(diào)用write(int var)方法寫入內(nèi)部緩沖區(qū)疮鲫。此方法由于沒有操作底層數(shù)據(jù)所以不許要關(guān)閉流苟鸯,即使被關(guān)閉也可以再次被調(diào)用。
(2)ByteArrayOutputStream有兩個構(gòu)造參數(shù)棚点,空參數(shù)的構(gòu)造參數(shù)提供一個默認(rèn)的可變的緩沖區(qū),另一構(gòu)造參數(shù)OutputStream out = new ByteArrayOutputStream(int a)提供一個指定大小的緩沖區(qū)的初始值湾蔓。
(3)public byte[] toByteArray()/public String toString()兩個方法提供了將緩沖區(qū)內(nèi)容輸出的方法瘫析。
(4)public void writeTo(OutputStream os)提供了將緩沖去內(nèi)的內(nèi)容一次性寫入一個輸出流中的方法,這里可以是硬盤也可以是控制臺。
(5)實(shí)例:
public class Test {
public static void main(String[] args) {
ByteArrayInputStream bis = null;
ByteArrayOutputStream bos = null;
bis = new ByteArrayInputStream("ABCDEFG".getBytes());
//這里不指定緩沖區(qū)大小贬循。
bos = new ByteArrayOutputStream();//初始化長度為0
//這里指定緩沖區(qū)大小
//bos = new ByteArrayOutputStream(1);//初始化長度為1
int b = 0;
while((b = bis.read()) != -1){
bos.write(b);
}
//寫入緩沖區(qū)后可以查看緩沖區(qū)大小咸包,也可以查看緩沖區(qū)內(nèi)容
System.out.println(bos.size());//7
byte[] be = bos.toByteArray();
for(byte bt : be){
System.out.print(bt + " ");//65 66 67 68 69 70 71
}
System.out.println();
System.out.println(bos.toString());//ABCDEFG
//將緩沖區(qū)內(nèi)寫入一個outputStream流中字節(jié)數(shù)組流中只有這個方法會報異常
try {
bos.writeTo(new FileOutputStream("d://text.txt"));
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
ByteArrayInputStream的用法:
(1)ByteArrayInputStream對象接受一個字節(jié)數(shù)組作為參數(shù)。如果需要存放的數(shù)據(jù)很多可以提前聲明一個指定大小的數(shù)組杖虾,如果不多可以直接同過相應(yīng)的轉(zhuǎn)化獲取如:string類的getByte()方法烂瘫。
(2)該字節(jié)數(shù)組的內(nèi)容來源可以是一個文件的輸入流中數(shù)據(jù),通過read(buf)方法得到的字節(jié)數(shù)據(jù)奇适,也可同過string類的getByte()方法直接的的到一個坟比。
(3)字節(jié)數(shù)組輸如流的的操作方法同其他輸入流一樣,通過循環(huán)判斷read返回值來輸出數(shù)組中的內(nèi)容嚷往,每次從緩沖buf中獲取一個字節(jié)數(shù)據(jù)葛账。
(4)應(yīng)用實(shí)例:
public class Test {
public static void main(String[] args) {
FileInputStream fis= null;
ByteArrayInputStream bis = null;
try {
fis = new FileInputStream("D://text.txt");
//確定緩沖區(qū)數(shù)組大小
byte[] buf = new byte[512];
bis = new ByteArrayInputStream(buf);
//將文件寫入緩存區(qū),調(diào)用fileInputSream的read(Byte[] b)方法
fis.read(buf);
//讀取ByteArrayInputStream緩沖區(qū)數(shù)組中的內(nèi)容
int i = 0;
while((i = bis.read()) != -1){
System.out.println((char)i);
}
//不用關(guān)閉bis流
fis.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
總結(jié)
(1)從繼承關(guān)系來看字節(jié)數(shù)組流直接繼承自基類InputStream和OutputStream皮仁,他起到的作用看來起到了 裝飾/提高效率的作用籍琳。
(2)這兩個IO類,其實(shí)起到了從控制臺贷祈,或者硬盤(文件)讀取流到內(nèi)存中的作用趋急。
FileInputStream -> ByteArrayOutputStream ->FileOutputsStream
FileInputStream -> ByteArrayInputStream ->System.out