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();
}
}
}
}
}
如果對您有用歡迎點贊、留言,發表看法。
轉發請註明出處。