#在千鋒“逆戰”學習第31天#IO框架、Question13

什麼是流
概念:內存與存儲設備之間傳輸的通道
水藉助管道傳輸,數據藉助流傳輸

流的分類
按方向:
輸入流:將存儲設備中的內容讀入到內存
輸出流:將內存中的內容寫入到存儲設備當中

按單位:
字節流:以字節爲單位,可以讀寫所有數據
字符流:以字符爲單位,只能讀寫文本數據

按功能:
節點流:具有實際傳輸數據的讀寫功能
過濾流:在節點流的基礎之上增強功能

字節流
字節流的父類(抽象類)

												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

--------------------------------------------------------------------------------------作業分割線

  1. (流的分類)對於 FileInputStream 來說,從方向上來分,它是__輸入___流,從數據單位上分,它是___字節__流,從功能上分,它是___節點__流。
  2. (字節流)FileInputStream 有三個重載的 read 方法,其中:
    I. 無參的 read 方法返回值爲___int__類型,表示__實際讀到的字節數___。
    II. int read(byte[] bs)方法返回值表示__實際讀取到的字節數___,參數表示__讀取數組b長度的字節___。
    III. int read(byte[] bs, int offset, int len) 方法返回值表示__實際讀取到的字節數___,參數分別表示___從數組bs的第幾個下標開始讀取__、讀取的長度_。
  3. (字節流)下面關於 FileInputStream 類型說法正確的是:
    A. 創建 FileInputStream 對象是爲了讀取硬盤上的文件
    B. 創建 FileInputStream 對象時,如果硬盤上對應的文件不存在,則拋出一個異常
    C. 利用 FileInputStream 對象可以創建文件
    D. FileInputStream 對象讀取文件時,只能讀取文本文件

答:AB

  1. (字節流)填空:
    I. 創建 FileOutputStream 對象時,如果對應的文件在硬盤上不存在,則會__創建文件___;如果對應的文件在硬盤上已經存在,則___寫入內容__;
    II. 如果使用 FileOutputStream(String path, boolean append)構造方法創建 FileOutputStream 對
    象,並給定第二個參數爲 true,則效果爲___添加的內容會接續,而不是覆蓋__。
    創建 FileOutputStream 時___會__(會|不會)產生異常。

  2. 代碼改錯

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塊裏面

  1. (字節流)利用 FileInputStream 和 FileOutputStream,完成下面的要求:
    I. 用 FileOutputStream 在當前目錄下創建一個文件“test.txt”,並向文件輸出“Hello World”,如
    果文件已存在,則在原有文件內容後面追加。
    II. 用 FileInputStream 讀入 test.txt 文件,並在控制檯上打印出 test.txt 中的內容。
    III. 要求用 try-catch-finally 處理異常,並且關閉流應放在 finally 塊中。
    在這裏插入圖片描述

  2. (對象序列化)
    爲了讓某對象能夠被序列化,要求其實現___Serializable__接口;
    爲了讓該對象某個屬性不參與序列化,應當使用__transient___修飾符

  3. (對象序列化)
    在 PrintWriter 中,有一個方法 print(Object obj)
    在 ObjectOutputStream 中,有一個方法 writeObject(Object obj)
    請簡述這兩個方法的區別
    在這裏插入圖片描述
    在這裏插入圖片描述
    答: PrintWriter 中 print(Object obj)方法存到txt裏面是一串字符串, ObjectOutputStream 中 writeObject(Object obj)方法存到txt裏面是塊數據。

  4. (對象序列化)有以下代碼:

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接口

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