Google Prettify

2014-09-16

什麼是串流?

撰寫程式一個很常遇到的應用就是檔案的複製。本文以複製檔案來介紹一下相關的應用與串流(Stream)的概念。

我該如何作?

最簡單程式碼是這樣的
@SuppressWarnings("resource")
public void copyTest() {
    try {
        File f1 = new File("d:\\source");
        File f2 = new File("d:\\target");
        FileInputStream fis = new FileInputStream(f1);
        FileOutputStream fos = new FileOutputStream(f2);
        int data = -1;
        while ((data = fis.read()) != -1) {
            fos.write(data);
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}

發生什麼事?

File 是一個代表檔案的class,裡面有許多method可以對檔案進行相關的操作。File f1 = new File("d:\\source"); 表示我有1個檔案,在D槽下,名稱叫source(沒有副檔案)。

什麼是串流?

共鳴其實是一種串流

這就是串流:
KEROKEROKEROKEROKEROKERO

這也是串流:
0101010010010101110001

我們都知道,電腦不過是01的東西。檔案也是如此。串流簡單來說就是一連串的數據。電腦裡面就是用一連串的數據來組成檔案。
所有的電腦資訊,其實都是一連串的01串流
所有的電腦資訊,其實都是一連串的01串流

在Java裡面,串流(Stream)分InputStream與OutputStream,儘管如此,Java裡並沒有Stream這樣的一個class。參考API,你可以看到更多不同的Stream。

while ((data = fis.read()) != -1) 是一種蠻不人性化的寫法。它將assign運算(=)與boolean運算放在同一行裡。read()方法在讀取一個位元之後同時cursor也會往下移一位元。其實類似cursor這種機制,class ResultSet也是這樣。不過ResultSet除了有next()這個method外,還有getXXX(),取得資料與cursor移動並沒有放在同一個method裡。而Stream並沒有另外拆出一個方法出來,所以大部份的範例程式也必需要這麼寫。

read()在取得資料位元後,就將資料餵給OutputStream,用write()寫入OutputStream中。

原則上,所有屬於resource的操作,都應該要做close的動作,這些代表resource的class,通常也都會有一個close()的method。InputStream與OutputStream也是屬於resource的class。不過範例程式中並沒有將InputStream與OutputStream做close的動作(呼叫close() method),因為InputStream與OutputStream已經實作 AutoCloseable interface。Java 1.7以後的版本會自動close實作AutoCloseable 的物件。如果你使用的是1.7以前的版本,記得需要在finally中手動close。但是我還是希望你可以養成手動close的習慣,因為你不知道你的程式將會是跑在1.7或是1.6上。

沒有留言 :

您或許對這些有興趣

Related Posts with Thumbnails

最後

謝謝您的閱讀,希望您可以有豐富的收獲。