Java——IO總結2

yesye發表於2021-09-09


 位元組陣列流ByteArrayInputStream和ByteArrayOutputStream

經常用在需要流和陣列之間轉化

FileInputStream是把檔案當做資料來源。ByteArrayInputStream則是把記憶體中的”某個位元組陣列物件”當做資料來源。

import java.io.ByteArrayInputStream;

import java.io.IOException;

 

public class TestByteArray {

    public static void main(String[] args) {

        //將字串轉變成位元組陣列

        byte[] b = "abcdefg".getBytes();

        test(b);

    }

    public static void test(byte[] b) {

        ByteArrayInputStream bais = null;

        StringBuilder sb = new StringBuilder();

        int temp = 0;

        //用於儲存讀取的位元組數

        int num = 0; 

        try {

            //該構造方法的引數是一個位元組陣列,這個位元組陣列就是資料來源

            bais = new ByteArrayInputStream(b);

            while ((temp = bais.read()) != -1) {

                sb.append((char) temp);

                num++;

            }

            System.out.println(sb);

            System.out.println("讀取的位元組數:" + num);

        } finally {

            try {

                if (bais != null) {

                    bais.close();

                }

            } catch (IOException e) {

                e.printStackTrace();

            }

        }

    }

}

資料流DataInputStream和DataOutputStream

     資料流將“基本資料型別與字串型別”作為資料來源,從而允許程式以與機器無關的方式從底層輸入輸出流中操作Java基本資料型別與字串型別。

public class TestDataStream {

    public static void main(String[] args) {

        DataOutputStream dos = null;

        DataInputStream dis = null;

        FileOutputStream fos = null;

        FileInputStream  fis = null;

        try {

            fos = new FileOutputStream("D:/data.txt");

            fis = new FileInputStream("D:/data.txt");

            //使用資料流對緩衝流進行包裝,新增緩衝功能

            dos = new DataOutputStream(new BufferedOutputStream(fos));

            dis = new DataInputStream(new BufferedInputStream(fis));

            //將如下資料寫入到檔案中

            dos.writeChar('a');

            dos.writeInt(10);

            dos.writeDouble(Math.random());

            dos.writeBoolean(true);

            dos.writeUTF("北京尚學堂");

            //手動重新整理緩衝區:將流中資料寫入到檔案中

            dos.flush();

            //直接讀取資料:讀取的順序要與寫入的順序一致,否則不能正確讀取資料。

            System.out.println("char: " + dis.readChar());

            System.out.println("int: " + dis.readInt());

            System.out.println("double: " + dis.readDouble());

            System.out.println("boolean: " + dis.readBoolean());

            System.out.println("String: " + dis.readUTF());

        } catch (IOException e) {

            e.printStackTrace();

        } finally {

            try {

                if(dos!=null){

                    dos.close();

                }

            } catch (IOException e) {

                e.printStackTrace();

            }

            try {

                if(dis!=null){

                    dis.close();

                }

            } catch (IOException e) {

                e.printStackTrace();

            }

            try {

                if(fos!=null){

                    fos.close();

                }

            } catch (IOException e) {

                e.printStackTrace();

            }

            try {

                if(fis!=null){

                    fis.close();

                }

            } catch (IOException e) {

                e.printStackTrace();

            }

        }

    }

}

物件流

如果要對某個物件進行讀寫操作,我們需要學習一對新的處理流:ObjectInputStream/ObjectOutputStream。

      ObjectInputStream/ObjectOutputStream是以“物件”為資料來源,但是必須將傳輸的物件進行序列化與反序列化操作。

注:序列化實體類實現序列化介面時

serialVersionUID適用於Java的序列化機制。簡單來說,Java的序列化機制是透過判斷類的serialVersionUID來驗證版本一致性的。在進行反序列化時,JVM會把傳來的位元組流中的serialVersionUID與本地相應實體類的serialVersionUID進行比較,如果相同就認為是一致的,可以進行反序列化,否則就會出現序列化版本不一致的異常,即是InvalidCastException。

public class TestObjectStream {

    public static void main(String[] args) throws IOException, ClassNotFoundException {

        write();

        read();

    }

   

    public static void write(){

        // 建立Object輸出流,幷包裝緩衝流,增加緩衝功能

        OutputStream os = null;

        BufferedOutputStream bos = null;

        ObjectOutputStream oos = null;

        try {

            os = new FileOutputStream(new File("d:/bjsxt.txt"));

            bos = new BufferedOutputStream(os);

            oos = new ObjectOutputStream(bos);

            // 使用Object輸出流

            //物件流也可以對基本資料型別進行讀寫操作

            oos.writeInt(12);

            oos.writeDouble(3.14);

            oos.writeChar('A');

            oos.writeBoolean(true);

            //物件流能夠對物件資料型別進行讀寫操作

            //Date是系統提供的類,已經實現了序列化介面

            //如果是自定義類,則需要自己實現序列化介面

            oos.writeObject(new Date());

        } catch (IOException e) {

            e.printStackTrace();

        } finally {

            //關閉輸出流

            if(oos != null){

                try {

                    oos.close();

                } catch (IOException e) {

                    e.printStackTrace();

                }

            }

            if(bos != null){

                try {

                    bos.close();

                } catch (IOException e) {

                    e.printStackTrace();

                }

            }

            if(os != null){

                try {

                    os.close();

                } catch (IOException e) {

                    e.printStackTrace();

                }

            }

        }

    }

   

    public static void read() {

        // 建立Object輸入流

        InputStream is = null;

        BufferedInputStream bis = null;

        ObjectInputStream ois = null;

        try {

            is = new FileInputStream(new File("d:/bjsxt.txt"));

            bis = new BufferedInputStream(is);

            ois = new ObjectInputStream(bis);

            // 使用Object輸入流按照寫入順序讀取

            System.out.println(ois.readInt());

            System.out.println(ois.readDouble());

            System.out.println(ois.readChar());

            System.out.println(ois.readBoolean());

            System.out.println(ois.readObject().toString());

        } catch (ClassNotFoundException e) {

            e.printStackTrace();

        } catch (IOException e) {

            e.printStackTrace();

        } finally {

            // 關閉Object輸入流

            if(ois != null){

                try {

                    ois.close();

                } catch (IOException e) {

                    e.printStackTrace();

                }

            }

            if(bis != null){

                try {

                    bis.close();

                } catch (IOException e) {

                    e.printStackTrace();

                }

            }

            if(is != null){

                try {

                    is.close();

                } catch (IOException e) {

                    e.printStackTrace();

                }

            }

        }

    }

}

轉換流

      InputStreamReader/OutputStreamWriter用來實現將位元組流轉化成字元流。

      System.in是位元組流物件,代表鍵盤的輸入,如果我們想按行接收使用者的輸入時,就必須用到緩衝字元流BufferedReader特有的方法readLine(),但是經過觀察會發現在建立BufferedReader的構造方法的引數必須是一個Reader物件,這時候我們的轉換流。

      而System.out也是位元組流物件,代表輸出到顯示器,按行讀取使用者的輸入後,並且要將讀取的一行字串直接顯示到控制檯,就需要用到字元流的write(String str)方法,所以我們要使用OutputStreamWriter將位元組流轉化為字元流。

使用InputStreamReader接收使用者的輸入,並輸出到控制檯

public class TestConvertStream {

    public static void main(String[] args) {

        // 建立字元輸入和輸出流:使用轉換流將位元組流轉換成字元流

        BufferedReader br = null;

        BufferedWriter bw = null;

        try {

            br = new BufferedReader(new InputStreamReader(System.in));

            bw = new BufferedWriter(new OutputStreamWriter(System.out));

            // 使用字元輸入和輸出流

            String str = br.readLine();

            // 一直讀取,直到使用者輸入了exit為止

            while (!"exit".equals(str)) {

                // 寫到控制檯

                bw.write(str);

                bw.newLine();// 寫一行後換行

                bw.flush();// 手動重新整理

                // 再讀一行

                str = br.readLine();

            }

        } catch (IOException e) {

            e.printStackTrace();

        } finally {

            // 關閉字元輸入和輸出流

            if (br != null) {

                try {

                    br.close();

                } catch (IOException e) {

                    e.printStackTrace();

                }

            }

            if (bw != null) {

                try {

                    bw.close();

                } catch (IOException e) {

                    e.printStackTrace();

                }

            }

        }

    }

}

©著作權歸作者所有:來自51CTO部落格作者huingsn的原創作品,如需轉載,請註明出處,否則將追究法律責任


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/2041/viewspace-2819471/,如需轉載,請註明出處,否則將追究法律責任。

相關文章