1. 程式人生 > >InputStream和OutputStream

InputStream和OutputStream

位元組輸入流和位元組輸出流:


    /*
        *   位元組輸入流和位元組輸出流可以操作任何檔案 但是是以位元組讀取檔案
        *   read()讀取的是一個位元組,為什麼返回int,而不是byte
        *
        *   因為讀到中間可能遇到11111111(8個1),這11111111表示byte型別的-1,就不會讀取後面的資料了,
        *   所以讀取的時候用int接受將11111111在前面添16個0,補足24位,那麼byte型別的-1就變成了int的255,
        *   就可以保證資料讀完,而結束的標記-1就是int型
     */

    @Test
    public void demo() throws Exception{
        //"xx01.txt"表示當前專案路徑下的檔案,xxx.txt必須存在,要不就會報錯
        FileInputStream file=new FileInputStream("xx01.txt");       //建立流物件

        int b;
        while ((b=file.read())!= -1){               //檔案結束的標誌是-1,,read()函式自動指向下一位
            System.out.println(b);
        }
        file.close();                      //關流釋放資源
    }

    //上面輸出97 98 99
    /*
     *   FileOutputStream 在new的時候,若檔案不存在,就建立一個,
     *    若存在先將檔案清空;如果想續寫就 new FileOutputStream("yyy.txt",true);
     */

    @Test
    public void demo2() throws Exception{
        //保證路徑存在即可,檔案不存在就會建立一個
        FileOutputStream file = new FileOutputStream("yyy.txt");
        file.write(97);
        file.write(98);
        file.close();
    }
  1. 檔案的拷貝(效率較慢):以下程式碼是一個位元組一個位元組讀取,再一個位元組一個位元組寫入,效率較慢,
        /*
         *  IO流的核心程式碼,讀取一個檔案內容,寫入另一個檔案
         */
        @Test
        public void demo3() throws Exception{
            FileInputStream fis=new FileInputStream("xx01.txt");    //檔案可以是txt,照片.jpg  或者其他
            FileOutputStream fos = new FileOutputStream("yyy.txt");
    
            int b;
            while ((b=fis.read())!= -1){
                fos.write(b);
            }
    
            fis.close();
            fos.close();
    }
        

     

  2. 檔案的拷貝(效率你上一個快,但不推薦使用,容易記憶體溢位):將檔案一次性讀取到位元組陣列中,在一次性寫入按時
        /*
         *  IO流的核心程式碼,一次性讀取一個檔案內容,再全部寫入另一個檔案
         */
        @Test
        public void demo4() throws Exception {
            FileInputStream fis = new FileInputStream("xx01.txt");    //檔案可以是txt,照片.jpg  或者其他
            FileOutputStream fos = new FileOutputStream("yyy.txt");
    
            byte[] file = new byte[fis.available()];          //建立一個與檔案一樣大小的位元組陣列
            fis.read(file);                                  //將檔案的內容全部讀取到位元組陣列中
            fos.write(file);                                 //將位元組陣列的內容寫入到另一個檔案中
    
            fis.close();
            fos.close();
    
    
        }
  3. 標準的拷貝格式(定義小陣列):
    
        /*
         *  定義小陣列的標準格式,一般長度是1024的整數倍
         */
        @Test
        public void demo5() throws Exception {
            FileInputStream fis = new FileInputStream("xx01.txt");    //檔案可以是txt,照片.jpg  或者其他
            FileOutputStream fos = new FileOutputStream("yyy.txt");
    
            byte[] file = new byte[1024 * 8];          //防止記憶體溢位
            int len;                                    //表示新讀取的位元組長度,保證不會重複
            while ((len=fis.read(file))!=-1){           //忘記加file,返回的不是位元組個數,而是位元組的碼錶值
                fos.write(file,0,len);
            }
    
            fis.close();
            fos.close();
        }

     

  4.  緩衝區實現

    
        /*
         *  BufferedInputStream和BufferedOutputStream
         *  位元組流緩衝區
         */
        @Test
        public void demo6() throws Exception {
            FileInputStream fis = new FileInputStream("xx01.txt");      //穿件檔案輸入流物件
            BufferedInputStream bfis=new BufferedInputStream(fis);               //建立緩衝區對fis修飾,預設建立byte[8192]陣列
            FileOutputStream fos = new FileOutputStream("yyy.txt");
            BufferedOutputStream bfos=new BufferedOutputStream(fos);
    
            int b;
            while ((b=bfis.read())!=-1){
                bfos.write(b);
            }
    
            bfis.close();
            bfos.close();
        }

    JDK1.7新特性

        /*
         *  異常處理,JDK1.7版本的新特性
         */
        @Test
        public void demo7()throws Exception{
            try(
                    FileInputStream fis = new FileInputStream("xx01.txt");      //具有自動關閉的功能(繼承了Closeable),{}執行完之後,會自動將()裡的流關閉
                    FileOutputStream fos = new FileOutputStream("yyy.txt");
                    ){
                int b;
                while ((b = fis.read()) != -1) {
                    fos.write(b);
                }
            }
        }