1. 程式人生 > >IO流第二課InputSteam和FileInputStream的使用

IO流第二課InputSteam和FileInputStream的使用

  上節課我們講了File類的簡單使用,這節課開始我們將IO流。

  IO流裡涉及了一大堆類,首先來看下IO流的體系。

 

 

這節課講抽象基類裡的InputStream和以及訪問檔案的FileInputStream

 

首先說下位元組流和字元流的區別:

其實就是單位的區別,位元組流以位元組為單位進行輸入輸出,字元流以字元為單位進行輸入輸出。

位元組對應的類是Byte(基本資料型別是byte),字元對應的類是Character(基本資料型別是char)

 

下面來看看InputStream

 

public abstract class InputStream implements Closeable 

可以看到InputStream是一個抽象類,所以 不能直接new物件

然後,InputStream實現了一個介面Closeable,顧名思義就是可關閉的,

 

來看看Closeable

 

public interface Closeable extends AutoCloseable {

    public void close() throws IOException;

}

 

Closeable繼承自AutoCloseable介面,並且聲明瞭一個方法close()

 

public interface AutoCloseable {

    void close() throws Exception;

}

 

AutoCloseable裡也有個close方法,只不過這個方法時丟擲的Exception異常

 

Closeable的close方法和AutoCloseable的close方法都是無參,所以Closeable是重寫了AutoCloseable的close方法,因此實現Closeable介面的類在實現close方法時丟擲的是IOException異常。

 

所以InputStream需要實現close方法,但InputStream是抽象類,也可以交給子類去實現close,自己本身不需要實現

 

  以下是InputStream自己實現的close方法,可以看見什麼也沒做

 

public void close() throws IOException {}

 

 

原始碼比較複雜,來看看API文件吧,別看錯了,是java.io.InputStream

 

超類就是父類的意思,super class嘛

 

構造器:

只有一個無參構造器

 

方法:

 

常用的就close和read以及skip(這個都不怎麼用)

 

然後來看看FileInputStream

 

public

class FileInputStream extends InputStream

FileInputStream繼承自InputStream

 

可以看到FileInputStream自己又重寫了close方法,而且非常複雜,不用管,只用知道close是關閉系統資源的就可以了。

 

還是來看API文件:

 

構造器:

 

最常用的是第一個和第三個

FileInputStream沒有無參構造器,所以new的時候必須傳入引數

 

public FileInputStream(String name) throws FileNotFoundException {

    this(name != null ? new File(name) : null);

}

可以看到FileInputStream(String name)這個方法就是根據name來構造一個File物件然後呼叫自身的構造器即FileInputStream(File file)

 

方法摘要:

 

常用方法:

常用的就close和read以及skip(這個都不怎麼用)

 

來用的試試

 

Demo 1:

public static void main(String[] args) {

    InputStream is = null;

    try {

        File file = new File("F:\\code\\java\\123.txt");

        is = new FileInputStream(file);



        //獲取檔案內容長度

        long length = file.length();

        byte[] fileContent = new byte[(int)length];



        is.read(fileContent);



        String content = new String(fileContent);

        System.out.println(content);



    } catch (FileNotFoundException e) { //由於FileNotFoundException是IOException的子類,所以先捕獲FileNotFoundException

        e.printStackTrace();

    } catch (IOException e) {

        e.printStackTrace();

    } finally {

        //我們前面說過finally這部分用來存放釋放資源的程式碼

        //現在我們就用來釋放InputStream佔用的資源

        try {

            if (is != null)

            {

                is.close();

            }

        } catch (IOException e) {   //可以看到丟擲的是IOException,證明了Closeable確實重寫了AutoCloseable的close方法

            e.printStackTrace();

        }

    }

}

 

輸出:

123456

 

可以看到我們通過FileInputStream成功讀取了檔案的內容,這就是通過字元輸入流讀取檔案的辦法