JAVA-----IO篇二(FileOutputStream以及文件拷貝)

IO篇之FileOutputStream

這篇文章主要對該類作爲字節輸出流的代表進行學習理解。與FileInputStream有一點區別

輸入流最後一定要close,輸出流最後一定要flush。

因此輸出流的兩個最爲重要的方法是wirte(),以及flush(),wirte方法中即可以傳1個ASCI碼值,也可以傳入byte數組,也能夠自定義傳入byte數組的長度。
具體例子:在a.txt文件中寫入abcd。

import java.io.FileOutputStream;

/**
 * @author cz
 * @date 2020/6/12/012
 * 文件字節輸出流,負責寫
 **/
public class FileOutputStreamTest {
    public static void main(String[] args) {
        FileOutputStream fileOutputStream = null;
        try {
            fileOutputStream = new FileOutputStream("F:\\a.txt");  
            //如果傳入的文件不存在,會自動新建
//            fileOutputStream.write(97);   // 傳入字節的ASCI值,會將原文件的內容請空,只寫入a
            byte[] b = {'a','b',99,100};    //abcd,即使寫數字會當做ASCI值進行處理
            fileOutputStream.write(b);
            //  fileOutputStream.write(b,0,2); 會寫入ab
//            寫完之後一定要進行刷新
            fileOutputStream.flush();
        } catch (Exception e) {
            e.printStackTrace();
        }

    }
}

注意:這三種寫入方式,都會將原文件的內容進行清空!謹慎使用。

在創建fileOutputStream對象時,有多種構造方法,源碼中該類存在private final boolean append;實現是否追加。只使用文件名進行創建對象時,默認append屬性爲false。即內容不以追加的方式進行添加。

而如果不希望清空,而是以在文件內容的末尾進行追加的方式,也很簡單。 fileOutputStream = new FileOutputStream(“F:\a.txt”,true);

只輸入abc也不符合常用使用規範,現在輸入字符串“我是中國人”。
只需要將String轉爲btye數組即可。

String s = "我是中國人";
            byte[] b = s.getBytes();
            fileOutputStream.write(b);
//            寫完之後一定要進行刷新
            fileOutputStream.flush();

當對fileInputStream以及fileOutputStream 有一定的理解後,就可以進行文件的拷貝工作。這個還是比較有意思的功能實現點

要點有三:
1.使用字節流進行拷貝,這樣就不受文件類型限制,聲音、視頻、文本、等等都可以。
2.當拷貝完,輸出流一定要flush。
3.兩個流應該分開關閉,這樣當某一流出現異常時,另一流還能正常關閉。
4.這裏只能拷貝一個文件,不能進行文件目錄的拷貝。

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

/**
 * @author cz
 * @date 2020/6/12/012
 * 文件拷貝
 * 使用FileInput以及FileOutput相結合完成文件拷貝
 * 拷貝的過程其實相當於一邊讀,一邊寫。
 * 使用字節流進行拷貝時,文件的類型不容易受到限制
 **/
public class FileOutputStreamTest {
    public static void main(String[] args) {
       FileOutputStream fileOutputStream = null;
       FileInputStream fileInputStream = null;

        try {
//            創建一個輸入流對象
            fileInputStream = new FileInputStream("F:\\javastudy\\32\\part01-基礎(1-25天)\\WEB01_HTML\\WEB01_HTML\\視頻\\01_javaWEB課程體系結構介紹_.flv");

//            創建一個輸出流對象
            fileOutputStream = new FileOutputStream("F:\\01_javaWEB課程體系結構介紹_.flv",true);
//            一次最多拷貝一兆,一邊讀取,一邊寫
            byte[] bytes = new byte[1024*1024];
            int read = 0;  // 當read等於-1時,證明該文件已經被全部讀取完畢
            while ((read=fileInputStream.read(bytes))!=-1){
                fileOutputStream.write(bytes,0,read);    //讀多少就寫多少
            }
//注意刷新
            fileOutputStream.flush();
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
//            輸出、輸出流的try catch要分開,不應該一起trycatch,防止一個流出現異常時,另一個流無法關閉
            if (fileInputStream!=null){
                try {
                    fileInputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }if (fileOutputStream!=null){
                try {
                    fileOutputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }

    }
}

如果對您有用歡迎點贊、留言,發表看法。
轉發請註明出處。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章