- File類不支持文件內容處理,如果要處理文件內容,必須要通過流的操作模式來完成。流分爲輸入流和輸出流。
- 在java.io包中,流分爲兩種:字節流與字符流
- 字節流:InputStream、OutputStream
- 字符流:Reader、Writer
字節流與字符流操作的本質區別只有一個:字節流是原生的操作,而字符流是經過處理後的操作。
在進行網絡數據傳輸、磁盤數據保存所保存所支持的數據類型只有:字節。
而所有磁盤中的數據必須先讀取到內存後才能進行操作,而內存中會幫助我們把字節變爲字符。字符更加適合處理中文。
不管使用的是字節流還是字符流,其基本的操作流程幾乎是一樣的,以文件操作爲例。
- 根據文件路徑創建File類對象 ;
- 根據字節流或字符流的子類實例化父類對象 ;
- 進行數據的讀取或寫入操作
- 關閉流(close())。
對於IO操作屬於資源處理,所有的資源處理操作(IO操作、數據庫操作、網絡)最後必須要進行關閉。
字節輸出流(OutputStream)
如果要想通過程序進行內容輸出,則可以使用java.io.OutputStream。
來觀察OutputStream類的定義結構:
public abstract class OutputStream implements Closeable, Flushable
OutputStream類實現了Closeable,Flushable兩個接口,這兩個接口中的方法:
- Closeable: public void close() throws IOException;
- Flushable: public void flush() throws IOException;
在OutputStream類中還定義有其他方法:
- 將給定的字節數組內容全部輸出:public void write(byte b[]) throws IOException
- 將部分字節數組內容輸出:public void write(byte b[], int off, int len) throws IOException
- 輸出單個字節:public abstract void write(int b) throws IOException;
由於OutputStream是一個抽象類,所以要想爲父類實例化,就必須要使用子類。由於方法名稱都由父類聲明好了,所以我們在此處只需要關係子類的構造方法。如果要進行文件的操作,可以使FileOutputStream類來處理,這個類的構造方法如下:
- 接收File類(覆蓋):public FileOutputStream(File file) throws FileNotFoundException
- 接收File類(追加):public FileOutputStream(File file, boolean append)
範例:實現文件的內容輸出
package www.bit.java.io;
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStream;
public class TestIO {
public static void main(String[] args) throws Exception{
File file = new File(File.separator + "Users" + File.separator + "yuisama" +
File.separator + "Desktop"
+ File.separator + "hello.txt");
if (!file.getParentFile().exists()) { // 必須保證父目錄存在
file.getParentFile().mkdirs() ; // 創建多級父目錄
}
// OutputStream是一個抽象類,所以需要通過子類進行實例化,此時只能操 作File類
OutputStream output = new FileOutputStream(file) ;
// 要求輸出到文件的內容
String msg = "I'm bad man" ;
// 將內容變爲字節數組
output.write(msg.getBytes());
// 關閉輸出
output.close();
}
}
在進行文件輸出的時候,所有的文件會自動幫助用戶創建,不在需要調用createFile()方法手工創建。
這個時候程序如果重複執行,並不會出現內容追加的情況而是一直在覆蓋。如果需要文件內容追加,則需要調用FileOutputStream提供的另外一種構造方法。
範例:文件內容追加
package www.bit.java.io;
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStream;
public class TestIO {
public static void main(String[] args) throws Exception{
File file = new File(File.separator + "Users" + File.separator + "yuisama" +
File.separator + "Desktop"
+ File.separator + "hello.txt");
if (!file.getParentFile().exists()) { // 必須保證父目錄存在
file.getParentFile().mkdirs() ; // 創建多級父目錄
}
// OutputStream是一個抽象類,所以需要通過子類進行實例化,此時只能操 作File類
OutputStream output = new FileOutputStream(file,true) ;//**
// 要求輸出到文件的內容
String msg = "I'm bad man\n" ;//**
// 將內容變爲字節數組
output.write(msg.getBytes());
// 關閉輸出
output.close();
}
}
範例:部分內容輸出
package www.bit.java.io;
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStream;
public class TestIO {
public static void main(String[] args) throws Exception{
File file = new File(File.separator + "Users" + File.separator + "yuisama" +
File.separator + "Desktop"
+ File.separator + "hello.txt");
if (!file.getParentFile().exists()) { // 必須保證父目錄存在
file.getParentFile().mkdirs() ; // 創建多級父目錄
}
// OutputStream是一個抽象類,所以需要通過子類進行實例化,此時只能操 作File類
OutputStream output = new FileOutputStream(file,true) ;//**
// 要求輸出到文件的內容
String msg = "I'm bad man\n" ;//**
// 將內容變爲字節數組
output.write(msg.getBytes(),0,5);//*****
// 關閉輸出
output.close();
}
}