1. 程式人生 > >檔案位元組流FileInputStream和FileOutputStream

檔案位元組流FileInputStream和FileOutputStream

1.完成基本檔案複製
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

/**
 * 功能:使用檔案位元組流實現檔案的複製
 * 
 * 1.如何建立輸入流
 *     
 * File file1 = new File("e:/readme.txt");
   InputStream fis = new FileInputStream(file1);
 * 
 * InputStream fis = new FileInputStream("e:/readme.txt");
 * 
 * 2.如何建立輸出流
 *         File file2 = new File("e:/readme2.txt");
        OutputStream fos = new FileOutputStream(file2);
 * 
 *     OutputStream fos = new FileOutputStream("e:/readme2.txt");
 * 3.如何使用輸入流和輸出流
 *     n = fis.read();
 *     fos.write(n);
 * 
 * 4.如何關閉流
 * 
 *     fis.close();
 *     fos.close(); 
 *  流使用完畢一定要關閉,垃圾回收器無能為力
 *  
 *  
 * @author Administrator
 *
 */
public class TestCopy1 {

    public static void main(String[] args) throws IOException {
        //1.建立一個輸入流和輸出流
//        File file1 = new File("e:/readme.txt");
//        InputStream fis = new FileInputStream(file1);
        //InputStream fis = new FileInputStream(new File("e:/readme.txt"));
        InputStream fis = new FileInputStream("e:/readme.txt");
//        File file2 = new File("e:/readme2.txt");
//        OutputStream fos = new FileOutputStream(file2);
        //OutputStream fos = new FileOutputStream(new File("e:/readme2.txt"));//預設覆蓋
        //OutputStream fos = new FileOutputStream("e:/readme2.txt");
        OutputStream fos = new FileOutputStream(new File("e:/readme2.txt"), true);//追加
        
        //2.使用輸入流和輸出流完成複製
        //2.1準備一箇中轉站:水杯
        int n; //
        
        //2.2藉助迴圈和中轉站完成複製操作
        n = fis.read(); //從檔案中讀取一個位元組 byte
        
        while(n != -1){
            //寫一個位元組到目的檔案(將水杯的水放入水缸)
            fos.write(n);
            //再讀一個位元組(再接一杯水)
            n = fis.read();
        }
        
        
        //3.關閉輸入流和輸出流
        fis.close();
        fos.close();

    }
}


2.完善檔案複製--中轉站使用位元組陣列
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

/**
 * 功能:使用檔案位元組流實現檔案的複製
 *  
 *  缺點1:可以實現複製,但是漢字無法正常顯示
 *  缺點2:中轉站太小,影響效率
 *  缺點3:沒有進行異常處理try-catch
 *  
 * @author Administrator
 *
 */
public class TestCopy2 {

    public static void main(String[] args) throws IOException {
        //1.建立一個輸入流和輸出流
//        File file1 = new File("e:/readme.txt");
//        InputStream fis = new FileInputStream(file1);
        //InputStream fis = new FileInputStream(new File("e:/readme.txt"));
        InputStream fis = new FileInputStream("e:/JDK_API_1_6_zh_CN.CHM");
//        File file2 = new File("e:/readme2.txt");
//        OutputStream fos = new FileOutputStream(file2);
        //OutputStream fos = new FileOutputStream(new File("e:/readme2.txt"));//預設覆蓋
        OutputStream fos = new FileOutputStream("e:/JDK_API_1_6_zh_CN2.CHM");
        //OutputStream fos = new FileOutputStream(new File("e:/readme2.txt"), true);//追加
        
        //2.使用輸入流和輸出流完成複製
        //2.1準備一箇中轉站:水桶
        byte [] buf = new byte[1024];
        
        //2.2藉助迴圈和中轉站完成複製操作
        int len = fis.read(buf); //讀取檔案的內容到buf陣列,返回的真正讀取的位元組數。檔案結束,返回-1
        while(len !=-1){
            //寫陣列的內容到目的檔案
            //fos.write(buf);//寫1024
            fos.write(buf, 0, len);
            //再讀一次
            len = fis.read(buf);
        }
        
        //3.關閉輸入流和輸出流
        fis.close();
        fos.close();

    }
}

3.完善檔案複製--進行異常處理
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

/**
 * 功能:使用檔案位元組流實現檔案的複製
 * 
 *  記住:使用位元組流不僅可以複製文字檔案(.txt, .java),
 *  而且可以複製二進位制檔案(音訊 視訊 ....)
 *  使用位元組流可以複製所有檔案
 *  
 *  doc檔案是二進位制檔案
 * @author Administrator
 *
 */
public class TestCopy3 {

    public static void main(String[] args) {
        InputStream fis = null;
        OutputStream fos = null;
        try{
            //1.建立一個輸入流和輸出流
            fis = new FileInputStream("e:/JDK_API_1_6_zh_CN.CHM");
            fos = new FileOutputStream("e:/JDK_API_1_6_zh_CN2.CHM");
            //2.使用輸入流和輸出流完成複製
            //2.1準備一箇中轉站:水桶
            byte [] buf = new byte[1024];
            
            //2.2藉助迴圈和中轉站完成複製操作
            int len = fis.read(buf); //讀取檔案的內容到buf陣列,返回的真正讀取的位元組數。檔案結束,返回-1
            while(len !=-1){
                //寫陣列的內容到目的檔案
                //fos.write(buf);//寫1024
                fos.write(buf, 0, len);
                //再讀一次
                len = fis.read(buf);
            }
            
        }catch(FileNotFoundException e){
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }finally{
            //3.關閉輸入流和輸出流
            try {
                if(fis != null){
                    fis.close();    
                }        
            } catch (IOException e) {
                e.printStackTrace();
            }
            try {
                if(fos != null){
                    fos.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        
    }
}