java.IO中提供了ByteArrayInputStream/ByteArrayOutputStream字節數組輸入輸出流。
其實質是在用,數組的思想來操作讀寫操作。
在進行IO操作的時候我們可以大概分為三個對象:
控制臺:System.in/System.out
硬盤:FileStream(包括字節流和字符流輸入輸出)
內存:ArrayStream(包括字節流中的ByteArray,字符流中的CharArray)。
ByteArrayOutputStream的用法:
(1)ByteArrayOutputStream,從某一輸入流中獲取字節數據,調用write(int var)方法寫入內部緩沖區。此方法由于沒有操作底層數據所以不許要關閉流,即使被關閉也可以再次被調用。
(2)ByteArrayOutputStream有兩個構造參數,空參數的構造參數提供一個默認的可變的緩沖區,另一構造參數OutputStream out = new ByteArrayOutputStream(int a)提供一個指定大小的緩沖區的初始值。
(3)public byte[] toByteArray()/public String toString()兩個方法提供了將緩沖區內容輸出的方法。
(4)public void writeTo(OutputStream os)提供了將緩沖去內的內容一次性寫入一個輸出流中的方法,這里可以是硬盤也可以是控制臺。
(5)實例:
public class Test {
public static void main(String[] args) {
ByteArrayInputStream bis = null;
ByteArrayOutputStream bos = null;
bis = new ByteArrayInputStream("ABCDEFG".getBytes());
//這里不指定緩沖區大小。
bos = new ByteArrayOutputStream();//初始化長度為0
//這里指定緩沖區大小
//bos = new ByteArrayOutputStream(1);//初始化長度為1
int b = 0;
while((b = bis.read()) != -1){
bos.write(b);
}
//寫入緩沖區后可以查看緩沖區大小,也可以查看緩沖區內容
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
//將緩沖區內寫入一個outputStream流中字節數組流中只有這個方法會報異常
try {
bos.writeTo(new FileOutputStream("d://text.txt"));
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
ByteArrayInputStream的用法:
(1)ByteArrayInputStream對象接受一個字節數組作為參數。如果需要存放的數據很多可以提前聲明一個指定大小的數組,如果不多可以直接同過相應的轉化獲取如:string類的getByte()方法。
(2)該字節數組的內容來源可以是一個文件的輸入流中數據,通過read(buf)方法得到的字節數據,也可同過string類的getByte()方法直接的的到一個。
(3)字節數組輸如流的的操作方法同其他輸入流一樣,通過循環判斷read返回值來輸出數組中的內容,每次從緩沖buf中獲取一個字節數據。
(4)應用實例:
public class Test {
public static void main(String[] args) {
FileInputStream fis= null;
ByteArrayInputStream bis = null;
try {
fis = new FileInputStream("D://text.txt");
//確定緩沖區數組大小
byte[] buf = new byte[512];
bis = new ByteArrayInputStream(buf);
//將文件寫入緩存區,調用fileInputSream的read(Byte[] b)方法
fis.read(buf);
//讀取ByteArrayInputStream緩沖區數組中的內容
int i = 0;
while((i = bis.read()) != -1){
System.out.println((char)i);
}
//不用關閉bis流
fis.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
總結
(1)從繼承關系來看字節數組流直接繼承自基類InputStream和OutputStream,他起到的作用看來起到了 裝飾/提高效率的作用。
(2)這兩個IO類,其實起到了從控制臺,或者硬盤(文件)讀取流到內存中的作用。
FileInputStream -> ByteArrayOutputStream ->FileOutputsStream
FileInputStream -> ByteArrayInputStream ->System.out