Java輸出流FileOutputStream使用詳解

2020-12-13 米粒教育

前面介紹了如何應用輸入流FileInputStream從本地文件讀取數據。本節介紹應用輸出流FileOutputStream把數據寫入本地文件。

用FileOutputStream寫入文件流程如下:

使用FileOutputStream寫入文件的過程同使用FileInputStream過程相同,都是先用File類打開本地文件,實例化輸入輸出流,然後調用流的讀寫方法讀取或寫入數據,最後關閉流。

FileOutputStream的構造方法

FileOutputStream提供了4個常用構造方法,用於實例化FileOutputStream對象,不同的場景使用不同的構造方法。

場景1:使用File對象打開本地文件,從文件讀取數據。

場景2:不使用File對象,直接傳入文件路徑。

FileOutputStream的構造方法允許直接傳入文件路徑,而無須使用File對象。查看該構造方法的原始碼,其內部使用了File對象打開文件。

場景3:打開文件,在文件的尾部追加寫入數據。

場景要求在文件的尾部寫入數據,由於前面兩個構造函數都是文件開始寫入數據(覆蓋原文件),因此不能使用前面2個場景的構造函數。FileOutputStream提供了另外兩個構構造方法,分別是:

FileOutputStream(File file, boolean append);

FileOutputStream(String name, boolean append);

同前面的構造方法相比,這兩個構造方法各多了一個boolean參數append。append參數為true時,數據從文件尾部寫入;append參數為false時,數據覆蓋原文件。

FileOutputStream的寫入方法

FileOutputStream類提供了多種文件寫入方法,可以單獨寫一個字節到文件,也可以寫一個byte數組到文件,也可以取byte數組的部分數據寫入到文件。

例1:使用write(int b)方法寫入文件。

例子程序首先調用File類的createNewFile()創建new.txt文件,然後將str內容寫入到新創建的new.txt文件中。

例2:使用write(byte[] b)方法寫入文件。

write(byte[] b)方法用於將b.length個字節從指定的byte數組寫入到輸出流。

String類的getBytes()方法可以將字符串轉換為byte數組,使用FileOutputStream 類的write(byte[] b)方法,將轉換的byte數組寫入文件。

例3:使用write(byte[] b,int off,int len)方法寫入文件。

該方法將len個字節的數據,並從數組b的off位置開始寫入到輸出流。

程序把指定的str內容寫入到文件,fos.write(str.getBytes(),5,10)語句的第一個參數為byte數組,第二個參數5是從byte數組的下標5開始,第三個參數是寫入的字節數。程序執行後,寫入的內容為「is new file」。

使用該方法一定要注意數組越界的問題。例如,byte數組長度為20,從第下標12開始,寫入15個字節到文件,就會造成數組越界,程序報錯。

例4:使用FileOutputStream複製文件

複製文件是將源文件數據寫入到新文件,在實際編程中,實現文件的複製有很多種方法,本案例使用FileInputStream和FileOutputStream實現文件的複製。

代碼中的copyFile完成文件的複製,在複製之前,先判斷一下源文件是否存在,然後申請一個byte數組,用於存儲讀取的源文件數據,該數組大小與源文件總字節數相同,讀取成功後,再將數組內容寫入到目標文件。程序輸出結果如下圖所示:

■ 知識點撥

使用FileOutputStream流可以寫入字節數據到目標文件,FileOutputStream提供了單字節寫入和byte數組寫入兩種方式。建議使用byte數組寫入,將待寫入的數據存儲到一個byte數組中,然後再寫入文件。當寫入的文件已經存在時,需要指明寫入方式是覆蓋還是追加。

相關焦點

  • java之字符輸出流的續寫與換行
    java之字符輸出流寫入數據的其它方法,現在小編要介紹的是java當中的字符輸入流的續寫與換行,雖然很簡單,但是,小編還是要介紹以下的,具體如下:續寫和換行:續寫,追加寫:使用兩個參數的構造方法FileWriter(String fileName,boolean append)
  • java之字符緩衝輸出流,BufferedWriter的簡單介紹
    各位小夥伴們,大家好在之前的文章中小編介紹了字節緩衝流的相關知識,這次小編要介紹的是字符緩衝輸出流,BufferedWriter,具體如下:java.io.BufferedWriter extends Writer
  • JAVA IO Stream流總結
    我們把這種數據的傳輸,可以看做是一種數據的流動,按照流動的方向,以內存為基準,分為 輸入input 和 輸出 output ,即流向內存是輸入流,流出內存的輸出流。Java中I/O操作主要是指使用 java.io 包下的內容,進行輸入、輸出操作。輸入也叫做讀取數據,輸出也叫做作寫 出數據。
  • Java之字節輸入流InputStream的簡單介紹
    各位小夥伴們大家好,在之前的文章中,小編介紹了字節輸出流java.io.InputStream:字節輸入流,此抽象類是表示字節輸入流的所有類的超類。定義了所有子類共性的方法:1.int read()從輸入流中讀取數據的下一個字節。
  • Java之File類的簡單介紹
    各位小夥伴們大家好,這次小編要向大家介紹的是File類,java.io.file類是文件和目錄路徑名的抽象表示,主要用於文件還有目錄的創建、查找和刪除等操作。具體是這樣的,Java把電腦中的文件和文件夾封裝為一個File類,我們可以使用File類對文件還有文件夾進行操作,如:1.創建一個文件/文件夾2.獲取文件/文件夾3.刪除文件/文件夾4.判斷文件/文件夾是否存在
  • Java常見問題集錦(來自sun官方) 第二部分
    答: 使用預設的serializetion的實現時,一個ObjectOutputStream的構造和一個ObjectInputStream的構造必須一一對應.ObjectOutputStream的構造函數會向輸出流中寫入一個標識頭,而ObjectInputStream會首先讀入這個標識頭.因此,多次以追加方式向一個文件中寫入object時,該文件將會包含多個標識頭
  • 理解JAVA輸入輸出流
    一、IO流作用IO流就是用來處理設備上的數據,包括文件,磁碟,網絡等二、分類按處理的數據類型不同:字符流、字節流按流向不同:JAVA 中流的處理是單向的,分為輸入流和輸出流>三、抽象類1、字節流抽象類InputStream 輸入流OutputStream輸出流2、字符流抽象類Reader 輸入字符流Writer 輸出字符流
  • 「JAVA」屬性、路徑分隔符有何不同?file對象創建,文件過濾器
    ,但由於轉義,在開發中更多使用的是後一種。獲取file路徑的操作獲取file對象的狀態:獲取file對象的狀態file對象中的文件操作:file對象中的文件操作file對象中的目錄操作:java.io.FileFilter和java.io.FilenameFilter都是接口,在這兩個接口中都只提供了一個方法accept();。但是兩個方法又略有不同。在java.io.FileFilter中:
  • Java開發之log日誌的使用儘量不用e.printStackTrace
    談到log日誌,小編建議初學java的朋友使用框架集成的log4j、logback這類統一列印日誌,儘量不使用catch的e.printStackTrace(),為什麼呢?下面我們來做簡單介紹。2、日誌交錯混合,不易讀從開始學習java,老師就教我們寫代碼要具有可讀性,易讀性。同樣,日誌的輸出如果不具有易讀性,也是讓程式設計師非常頭疼的一件事。那麼為什麼e.printStackTrace輸出的日誌具有不易讀性了呢?
  • java 如何訪問hadoop - CSDN
    查看 hadoop 使用情況hadoop dfsadmin -report網絡配置1.;import java.io.InputStream;import java.security.PrivilegedExceptionAction;/** * 實現java遠程操作hdfs:遠程創建目錄、創建文件、上傳文件、下載文件、讀取文件、重命名、刪除文件 */public class HDFSApp { static FileSystem hdfs; //初始化訪問hdfs的配置信息
  • java 中的輸入與輸出流(I/O)
    在Java中,從其中讀入一個字節序列的對象做作輸入流,而可以從其中寫入一個字節序列的對象稱做輸出流。讀入和寫入的來源地和目的地可以是文件,網絡以及內存。其中抽象類InputStream和OutputStream構成輸入和輸出類的基礎。
  • Java IO流詳解(面試不要再問我IO流)
    下面通過一個例子講解InputStream中常用的方法的使用:字節輸出流 OutputStream與字節輸入流類似,java.io 包下所有字節輸出流大多是從抽象類 OutputStream 繼承而來的。
  • 代碼詳解:如何藉助Valohai進行Java深度學習
    代碼針對代碼,筆者選擇了一個使用DL4J改進的例子。該MNist項目的訓練集含6萬張鏡像,測試集含1萬張手寫數字的鏡像。在DL4J庫中這些數據集都是可用的(就像Keras儲存的大量數據集)。/runMLPMnist.sh {parameters}inputs:- name: dl4j-java-appdescription: DL4J Java app file (jar) generated in the previous step 'Build-dl4j-mnist-single-layer-java-app
  • Java之FileFilter過濾器的使用與及原理的簡單介紹
    「創作開運禮」Java之使用遞歸進行文件搜索,這次小編要介紹的是過濾器,我們可以使用過濾器來遍歷文件夾以及裡面的子文件夾還有相對應的文件1.File[] listFiles(FileFilter filter)java.io.FileFilter接口:用於抽象路徑名(File對象)的過濾器。
  • java之字符緩衝輸入流,BufferedReader的簡單介紹
    各位小夥伴們大家好,在之前的文章中,小編介紹了字符緩衝輸出流java之字符緩衝輸出流,BufferedWriter的簡單介紹,這次小編要介紹的是字符緩衝輸入流,具體如下:java.io.BufferedReader extends Reader繼承自父類的共性成員文件:int read()讀取單個字符並返回int read(char[] cbuf)一次讀取多個字符
  • java命令總結(經典篇)
    >-force 始終寫輸出文件 指定 <classes> 時必須使用全名(例如 java.lang.Object)。-keepgenerated 為 stub 和 skeleton 文件保留所生成的 .java 源文件,並將這些源文件寫到與 .class 文件相同的目錄中,如果要指定目錄,則使用 -d 選項。 -nowarn 關閉警告。如果使用該選項,則編譯器不輸出任何警告信息。
  • 阿里華為Dockerfile命令規範及最佳實踐
    有以下倆種格式:Shell格式RUN apt-get install -y vimCMD echo "hello docker"ENTRYPOINT echo "hello docker"Dockerfiledocker build -t javaedge/centos-shell
  • 每個Java開發者都應該知道的5個JDK工具
    目前,有許多工具可以綁定到Java JDK上面,其中java.exe和javac.exe是每位Java工程師的必 備武器,與此同時,還有許多其它Java JDK工具呈現在大家眼前。大多數Java程式設計師都沒有使用過這些工具,但如果使用,它們會讓你的工作事半功倍。
  • 從Java中的FileInputStream讀取字節
    importjava.io.File;import java.io.FileInputStream;publicclass fileInputStream {publicstaticbytes//be careful about how to declare an array in JavaintreadBytes;try{File file