1. 程式人生 > 其它 >Java中I/O流實現字元流、位元組流和緩衝流對檔案的輸入輸出

Java中I/O流實現字元流、位元組流和緩衝流對檔案的輸入輸出

技術標籤:Java學習javastream

Java程式中,對於資料的輸入/輸出操作以 “流(stream)” 的方式進行。 java.io包下提供了各種“流”類和介面,用以獲取不同種類的資料,並通過標準的方法輸入或輸出資料。

一、原理

1.輸入input:讀取外部資料(磁碟、光碟等儲存裝置的資料)到程式(記憶體)中

2.輸出output:將程式(記憶體)資料輸出到磁碟、光碟等儲存裝置中。

二、流的體系結構

抽象基類                          節點流                                  緩衝流InputStream                  FileInputStream           BufferedInputStreamoutputStream                FileoutputStream         BufferedoutputStreamReader                          FileReader                  BufferedReaderwriter                             Filewriter                      Bufferedwriter

三、字元流實現文字檔案傳輸

說明:如果使用單元測試,檔案相對路徑為當前module。
如果使用main()測試,檔案相對路徑為當前工程

@Test
    public void test3(){
        FileReader fr = null;
        FileWriter fw = null;
        try {
            //1.File類的例項化
            //sorFile原始檔  outFile目標檔案
            File sorFile = new File("Hello.txt");
            File outFile = new File("Hi.txt");
            //2.提供具體的流
            fr = new FileReader(sorFile);
            fw = new FileWriter(outFile);
            //3.讀/寫操作
            char[] cbuf = new char[1024];
            int len;
            while ((len= fr.read(cbuf))!=-1){
//                String str = new String(cbuf,0,len);
                fw.write(cbuf,0,len);
            }
            System.out.println("檔案複製成功");
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            //4.關閉流
            try {
                fr.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
            try {
                fw.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

四、位元組流實現非文字檔案傳輸(如.jpg)

 @Test
    public void test4(){
        FileInputStream fis = null;
        FileOutputStream fos = null;
        try {
            //1.File類的例項化
            File sorFile = new File("1374225513544.jpg");
            File outFile = new File("an1374225513544.jpg");
            //2.提供具體的流
            fis = new FileInputStream(sorFile);
            fos = new FileOutputStream(outFile);
            //3.輸入/輸出操作
            byte[] bytes = new byte[1024];
            int len;
            while ((len=fis.read(bytes))!=-1){
                fos.write(bytes,0,len);
            }
            System.out.println("圖片複製成功");
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            //4.關閉流
            try {
                if (fis!=null)
                    fis.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
            try {
                if (fos!=null)
                fos.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

執行結果:
在這裡插入圖片描述
在這裡插入圖片描述

五、位元組型緩衝流實現非文字檔案傳輸

 public void copyFileWithBuffered(String sorFile,String outFile){
        BufferedInputStream bis = null;
        BufferedOutputStream bos = null;
        try {
            //1.File檔案例項化
            File ansorFile = new File(sorFile);
            File anoutFile = new File(outFile);
            //2.1提供具體的流---造節點流
            FileInputStream fis = new FileInputStream(ansorFile);
            FileOutputStream fos = new FileOutputStream(anoutFile);
            //2.2造緩衝流
            bis = new BufferedInputStream(fis);
            bos = new BufferedOutputStream(fos);
            //3.讀入/寫出操作
            byte[] bytes = new byte[5];
            int len;
            while ((len=bis.read(bytes))!=-1){
                bos.write(bytes,0,len);
            }
            System.out.println("複製成功!");
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            //4.關閉流
            //說明:關閉外層流的同時,內層流會自動關閉。
            try {
                if (bis!=null)
                bis.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
            try {
                if (bos!=null)
                bos.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    @Test
    public void test(){
        String sorFile="1374225513544.jpg";
        String outFile ="new1374225513544.jpg";

        long start = System.currentTimeMillis();
        copyFileWithBuffered(sorFile,outFile);
        long end = System.currentTimeMillis();

        System.out.println("複製花費時間:"+(end-start));
    }

這裡可以看到此次執行所花費時間:
在這裡插入圖片描述

說明:緩衝流提高了讀、寫操作的速度。處理流,就是“套接”在已有流的基礎上。

六、字元型緩衝流實現文字檔案傳輸

  @Test
    public void test5(){
        BufferedReader br = null;
        BufferedWriter bw = null;
        try {
            br = new BufferedReader(new FileReader("Hello.txt"));
            bw = new BufferedWriter(new FileWriter("sayHi.txt"));

            char[] cbuf = new char[5];
            int len;
            while ((len=br.read(cbuf))!=-1){
                bw.write(cbuf,0,len);
            }
            System.out.println("文字複製成功!");
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (br!=null)
                br.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
            try {
                if (bw!=null)
                bw.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

執行結果:
在這裡插入圖片描述
在這裡插入圖片描述