(IO流類示例三)BufferedOutputStream、BufferedInputStream、DataOutputStream、DataInputStream
BufferedOutputStream(輸入流)、BufferedInputStream(輸出流):緩衝位元組輸入輸出流(高階流),高階流都需要低階流的支援,在其內部維護了一個預設大小為8k的緩衝區,當我們在進行檔案複製讀取內容時,會將讀取到的內容先寫入緩衝區中,當緩衝區滿了,會一次性將資料寫到硬碟上,如果我我們設定的位元組陣列大小大於緩衝區預設大小,則緩衝區失效,直接從硬碟上進行讀取,如果我們設定的位元組陣列 大小小於緩衝區預設大小,則緩衝區有效。在對檔案進行寫操作時,或者手動呼叫flush方法進行寫入。
BufferedOutputStream方法:
①BufferedOutputStream(OutputStream out):引數為一個位元組輸入流物件
②BufferedOutputStream(OutputStream out,int size):引數為一個位元組輸入流物件,此構造方法可以設定緩衝區長度,即size
③void write(int b):向緩衝區內寫入,引數為int值,檔案中顯示的為ASCII碼所對應的字元,且該方法輸入以位元組為單位,每次輸入一個位元組,int值為32為四位元組,但是write為單位元組輸入,即每次輸入八位,所以輸入值為int值的32位二進位制數的低八位。
④void write(byte[] b):向緩衝區內寫入,引數為位元組陣列,可向緩衝區中同時寫入多個位元組
⑤void write(byte[] b,int off,int len):向緩衝區內寫入,引數為位元組陣列,兩個int值,off表示從位元組陣列的哪一位開始,len表示向緩衝區內輸入的位元組陣列的長度
⑥void flush():關閉緩衝區,在寫入時,呼叫write方法後要寫入的內容並未存在於目標檔案中,而是存在緩衝區中,只有關閉緩衝區後jvm才會將緩衝區內容寫入目標檔案中,或者在緩衝區滿後也會將內容寫入目標檔案。如果位元組陣列大於緩衝區,則緩衝區失效,BuffereedOutputStream直接對檔案進行寫操作。在使用完流後必須手動將其關閉。
⑦void close:;在結束輸入時,可以呼叫flush方法進行清空緩衝區寫入檔案,也可以不呼叫flush直接呼叫close方法,也可以實現相同作用,因為close方法底層預設呼叫flush方法
BufferedInputStream方法:
①BufferedInputStream(InputStream In):引數為一個位元組輸出流物件
②BufferedInputStream(InputStream In,int size):引數為一個位元組輸出流物件,此構造方法可以設定緩衝區長度,即size
③int read():讀檔案內容,該方法以位元組為單位讀出,每次讀出一個位元組,如果已經讀到該檔案的末尾,則讀方法返回-1
④int read(byte[] b):讀檔案內容,引數為位元組陣列,可同時讀出多個位元組,如果檔案的位元組數大於1024,那麼該方法的返回值就是1024,如果檔案的位元組數小於1024,那麼該方法的返回值就是檔案的實際大小
⑤int read(byte[] b,int off,int len):讀檔案內容,引數為位元組陣列,兩個int值,off表示從位元組陣列的哪一位開始,len表示從目標檔案內讀出的位元組陣列的長度
⑥void close():關閉流
例一:
①寫入
import java.io.BufferedOutputStream;
import java.io.FileOutputStream;
public class BufferedOutputStreamDemo {
public static void main(String[] args) throws Exception {
FileOutputStream fis=new FileOutputStream("a.txt");
BufferedOutputStream bos=new BufferedOutputStream(fis);
bos.write(97);
bos.flush();
bos.close();
fis.close();
}
}
結果:
②讀出
import java.io.BufferedInputStream;
import java.io.FileInputStream;
public class BufferedInputStreamDemo {
public static void main(String[] args) throws Exception{
FileInputStream fis=new FileInputStream("a.txt");
BufferedInputStream bis=new BufferedInputStream(fis);
int a=bis.read();
System.out.println(a);
bis.close();
fis.close();
}
}
結果:97
注:關閉時先關閉高階流再關閉低階流
例二:用BufferedOutputStream與BufferedInputStream進行檔案複製
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
public class BufferedCopy {
public static void main(String[] args) throws Exception{
FileInputStream fis=new FileInputStream("a.txt");
BufferedInputStream bis=new BufferedInputStream(fis);
FileOutputStream fos=new FileOutputStream("aCopy.txt");
BufferedOutputStream bos=new BufferedOutputStream(fos);
byte[] bs=new byte[1024];
int len=0;
long l1=System.currentTimeMillis();
while((len=bis.read(bs))>0) {
bos.write(bs, 0, len);
}
bos.close();
bis.close();
fos.close();
fis.close();
long l2=System.currentTimeMillis();
System.out.println(l2-l1);
}
}
結果:
注:currentTimeMillis()方法為System提供的靜態方法,用來調取系統當前時間,在本例中用於計算程式碼執行時長
DataOutputStream(輸入流)、DataInputStream(輸出流):資料位元組輸入輸出流(高階流),在用該流進行檔案複製時,不支援複製視訊音訊檔案,會出現編碼錯誤,只支援普通檔案。
DataOutputStream方法:
①DataOutputStream(OutputStream out):引數為一個位元組輸入流物件
②void write(int b):向檔案內寫入,引數為int值,檔案中顯示的為ASCII碼所對應的字元,且該方法輸入以位元組為單位,每次輸入一個位元組,int值為32為四位元組,但是write為單位元組輸入,即每次輸入八位,所以輸入值為int值的32位二進位制數的低八位。
③void write(byte[] b):向檔案內寫入,引數為位元組陣列,可向檔案內同時寫入多個位元組
④void write(byte[] b,int off,int len):向檔案內寫入,引數為位元組陣列,兩個int值,off表示從位元組陣列的哪一位開始,len表示向檔案內輸入的位元組陣列的長度
⑤void writeBoolean(boolean v):向檔案內寫入一個布林值
⑥void writeByte(int v):向檔案內寫入一個位元組,為v值的低八位
⑦void writeBytes(String s):向檔案內寫入一個位元組陣列,即輸入一個字串
⑧void writeChar(int v):向檔案內寫入一個字元,引數為對應的ASCII值
⑨void writeChars(String s):向檔案內寫入一個字串
⑩void writeDouble(double v):向檔案內寫入一個double型別值
⑪void writeFloat(float v):向檔案內寫入一個浮點數
⑫void writeInt(int v):向檔案內寫入一個int值
⑬void writeLong(long v):向檔案內輸入一個long型別值
⑭void writeShort(int v):向檔案內輸入一個short型別值
⑮void writeUTF(String str):向檔案內輸入一個字串
⑯void close:關閉流
DataInputStream方法:
①DataInputStream(InputStream In):引數為一個位元組輸入流物件
②void read(int b):向檔案內寫入,引數為int值,檔案中顯示的為ASCII碼所對應的字元,且該方法輸入以位元組為單位,每次輸入一個位元組,int值為32為四位元組,但是write為單位元組輸入,即每次輸入八位,所以輸入值為int值的32位二進位制數的低八位。
③void read(byte[] b):向檔案內寫入,引數為位元組陣列,可向檔案內同時寫入多個位元組
④void read(byte[] b,int off,int len):向檔案內寫入,引數為位元組陣列,兩個int值,off表示從位元組陣列的哪一位開始,len表示向檔案內輸入的位元組陣列的長度
⑤void readBoolean(boolean v):從檔案內讀出一個布林值
⑥void readByte(int v):從檔案內讀出一個位元組,為v值的低八位
⑦void readBytes(String s):從檔案內讀出一個位元組陣列,即輸入一個字串
⑧void readChar(int v):從檔案內讀出一個字元,引數為對應的ASCII值
⑨void readChars(String s):從檔案內讀出一個字串
⑩void readDouble(double v):從檔案內讀出一個double型別值
⑪void readFloat(float v):從檔案內讀出一個浮點數
⑫void readInt(int v):從檔案內讀出一個int值
⑬void readLong(long v):從檔案內讀出一個long型別值
⑭void readShort(int v):從檔案內讀出一個short型別值
⑮void readUTF(String str):從檔案內讀出一個字串
⑯void close:關閉流
例三:
①寫入
import java.io.DataOutputStream;
import java.io.FileOutputStream;
public class DataOutputStreamDemo {
public static void main(String[] args) throws Exception {
DataOutputStream dos=new DataOutputStream(new FileOutputStream("a.txt"));
dos.writeInt(100);
dos.writeByte(10);
dos.writeShort(99);
dos.writeDouble(100.99);
dos.writeBoolean(true);
dos.writeUTF("噠噠噠達");
dos.close();
}
}
結果:
②讀出
import java.io.DataInputStream;
import java.io.FileInputStream;
public class DataInputStreamDemo {
public static void main(String[] args) throws Exception{
DataInputStream dis=new DataInputStream(new FileInputStream("a.txt"));
System.out.println(dis.readInt()+","+dis.readByte()+","+
dis.readShort()+","+dis.readDouble()+","+
dis.readBoolean()+","+dis.readUTF());
dis.close();
}
}
結果:100,10,99,100.99,true,噠噠噠達