什麼是流
概念:內存與存儲設備之間傳輸的通道
水藉助管道傳輸,數據藉助流傳輸
流的分類
按方向:
輸入流:將存儲設備中的內容讀入到內存中
輸出流:將內存中的內容寫入到存儲設備當中
按單位:
字節流:以字節爲單位,可以讀寫所有數據
字符流:以字符爲單位,只能讀寫文本數據
按功能:
節點流:具有實際傳輸數據的讀寫功能
過濾流:在節點流的基礎之上增強功能
字節流
字節流的父類(抽象類)
public int read(){}
InputStream:字節輸入流 public int read(byte[] b){}
public int read(byte[] b,int off,int len){}
public void write(){}
OutputStream:字節輸出流 public void write(byte[] b){}
public void write(byte[] b,int off,int len){}
字節節點流
FileOutputStream:
public void write(byte[] b)//一次寫多個字節,將b數組中所有字節,寫入輸出流
FileInputStream:
public void read(byte[] b)//從流中讀取多個字節,將讀到的內容存入b數組,返回實際讀到的字節數;如果達到文件的尾部,則返回-1。
字節過濾流
緩衝流:BufferedOutputStream/BufferedInputStream
提高IO效率,減少磁盤訪問次數
數據存儲在緩衝區中,flush是將緩衝區的內容寫入文件中,也可以直接close
對象流:ObjectOutputStream/ObjectInputStream
增強了緩衝區功能
增強了讀寫8種基本數據類型和字符串功能
增強了讀寫對象的功能:readObject(Object obj)從流中讀取一個對象
writeObject(Object obj)向流中寫入一個對象
使用流傳輸對象的過程稱爲序列化,反序列化
對象序列化
對象序列化的細節:
必須實現Serializable接口
必須保證其所有屬性均可以序列化
transient修飾爲臨時屬性,不參與序列化
讀到文件尾部的標誌:java.io.EOFExecption
--------------------------------------------------------------------------------------作業分割線
- (流的分類)對於 FileInputStream 來說,從方向上來分,它是__輸入___流,從數據單位上分,它是___字節__流,從功能上分,它是___節點__流。
- (字節流)FileInputStream 有三個重載的 read 方法,其中:
I. 無參的 read 方法返回值爲___int__類型,表示__實際讀到的字節數___。
II. int read(byte[] bs)方法返回值表示__實際讀取到的字節數___,參數表示__讀取數組b長度的字節___。
III. int read(byte[] bs, int offset, int len) 方法返回值表示__實際讀取到的字節數___,參數分別表示___從數組bs的第幾個下標開始讀取__、讀取的長度_。 - (字節流)下面關於 FileInputStream 類型說法正確的是:
A. 創建 FileInputStream 對象是爲了讀取硬盤上的文件
B. 創建 FileInputStream 對象時,如果硬盤上對應的文件不存在,則拋出一個異常
C. 利用 FileInputStream 對象可以創建文件
D. FileInputStream 對象讀取文件時,只能讀取文本文件
答:AB
-
(字節流)填空:
I. 創建 FileOutputStream 對象時,如果對應的文件在硬盤上不存在,則會__創建文件___;如果對應的文件在硬盤上已經存在,則___寫入內容__;
II. 如果使用 FileOutputStream(String path, boolean append)構造方法創建 FileOutputStream 對
象,並給定第二個參數爲 true,則效果爲___添加的內容會接續,而不是覆蓋__。
創建 FileOutputStream 時___會__(會|不會)產生異常。 -
代碼改錯
class TestFileInputStream{
public static void main(String args[]){
FileInputStream fin = new FileInputStream(“test.txt”);
try{
System.out.println( fin.read() );
fin.close();
}catch(Exception e){
} } }
答:1、需要在類後面聲明一個FileNotFoundException異常
2、把fin.close();放到finally塊裏面
-
(字節流)利用 FileInputStream 和 FileOutputStream,完成下面的要求:
I. 用 FileOutputStream 在當前目錄下創建一個文件“test.txt”,並向文件輸出“Hello World”,如
果文件已存在,則在原有文件內容後面追加。
II. 用 FileInputStream 讀入 test.txt 文件,並在控制檯上打印出 test.txt 中的內容。
III. 要求用 try-catch-finally 處理異常,並且關閉流應放在 finally 塊中。
-
(對象序列化)
爲了讓某對象能夠被序列化,要求其實現___Serializable__接口;
爲了讓該對象某個屬性不參與序列化,應當使用__transient___修飾符 -
(對象序列化)
在 PrintWriter 中,有一個方法 print(Object obj)
在 ObjectOutputStream 中,有一個方法 writeObject(Object obj)
請簡述這兩個方法的區別
答: PrintWriter 中 print(Object obj)方法存到txt裏面是一串字符串, ObjectOutputStream 中 writeObject(Object obj)方法存到txt裏面是塊數據。 -
(對象序列化)有以下代碼:
import java.io.*;
class Address{
private String addressName;
private String zipCode;
//構造方法…
//get/set 方法… }
class Worker implements Serializable{
private String name;
private int age;
private Address address;
//構造方法…
//get/set 方法… }
public class TestSerializable {
public static void main(String args[]) throws Exception{
Address addr = new Address("Beijing", "100000");
Worker w = new Worker("Tom", 18, addr);
OutputStream os = new FileOutputStream("fout.dat");
ObjectOutputStream oout = new ObjectOutputStream(os);
oout.writeObject(w);
oout.close();
}
}
選擇正確答案:
A. 該程序編譯出錯
B. 編譯正常,運行時異常
C. 編譯正常,運行時也正常。
答案:B
Address沒有實現Serializable接口