1. 程式人生 > >(IO流類示例三)BufferedOutputStream、BufferedInputStream、DataOutputStream、DataInputStream

(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,噠噠噠達