我該如何作?
最簡單程式碼是這樣的@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串流 |
在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上。
沒有留言 :
張貼留言