Transcript 下載/瀏覽
第14章 基本輸出入與檔案處理
14-1
14-2
14-3
14-4
14-5
串流
14-6
Java的輸入/輸出串流
檔案與資料夾處理
標準輸出與輸入串流
Reader/Writer檔案串流
InputStream/OutputStream檔案
隨機存取檔案的處理
14-1 Java的輸入/輸出串流
14-1-1 串流的基礎
14-1-2 java.io套件的串流類別
14-1 Java的輸入/輸出串流
Java I/O套件的全名是Java
Input/Output(輸入/輸出),即應用程
式的資料輸入與輸出,在Java類別函式庫
(Class Library)是使用「串流」
(Stream)模型來處理資料的輸入與輸出。
14-1-1 串流的基礎
串流(Stream)觀念最早使用在Unix作業
系統,串流模型如同水管的水流,當程式
開啟一個來源的輸入串流(例如:檔案、
記憶體和緩衝區等),Java程式可以從輸
入串流依序讀取資料,如下圖所示:
14-1-2 java.io套件的串流類別-說
明
Java的java.io套件提供多種串流類別,基
本上,Java串流類別分成兩大類:
• 「字元串流」(Character Stream)
• 「位元組串流」(Byte Stream)
14-1-2 java.io套件的串流類別-字元
串流
字元串流(Character Stream)
字元串流是Java 1.1版才支援的串流類別,
這是一種適合「人類閱讀」(Humanreadable)的串流,Reader/Writer兩個
類別分別讀取和寫入16位元的字元資料,
屬於字元串流的父抽象類別。
14-1-2 java.io套件的串流類別-位元
組串流
位元組串流(Byte Stream)
位元組串流是一種「電腦格式」
(Machine-formatted)串流,可以讀取
和寫入8位元的位元組資料,也就是處理二
進位資料的執行檔、圖檔和聲音等,其父
抽象類別的輸入/輸出串流名稱為
InputStream/OutputStream類別。
14-2 檔案與資料夾處理
14-2-1
14-2-2
14-2-3
14-2-4
14-2-5
14-2-6
顯示檔案和資料夾清單
顯示檔案資訊
更改檔案名稱
刪除檔案
建立資料夾
瀏覽檔案與資料夾視窗
14-2 檔案與資料夾處理
在真正進入本章主題輸出入和檔案處理前,
筆者準備先說明java.io套件的File類別。
File類別可以處理作業系統的檔案和資料夾,
讓Java程式取得指定資料夾的檔案和子資
料夾清單、檔案資訊、建立資料夾和刪除
檔案等操作。
14-2-1 顯示檔案和資料夾清單-建立
File物件
在Java程式只需建立File物件,就可以取得
檔案或資料夾的相關資訊,如下所示:
File f = new File(String);
上述程式碼建立File物件,File()建構子參
數是檔案或資料夾路徑。
14-2-1 顯示檔案和資料夾清單-取得
檔案與資料夾清單
如果是資料夾,可以進一步使用下列方法
取得檔案和資料夾清單,如下表所示:
方法
boolean isDirectory()
String[] list()
說明
檢查 File 物件是否是資料夾,傳回值 true 為是,
false 為否
傳回 String 陣列內含此路徑的所有檔案和子資
料夾
14-2-2 顯示檔案資訊
在File類別提供方法取得檔案相關資訊,如下:
方法
boolean exists()
說明
檢查檔案或資料夾是否存在,如果存在傳回 true,不
存在傳回 false
boolean isFile()
檢查 File 物件是否是檔案,傳回值 true 為是,false
為否
String getAbsolutePath()
傳回檔案或資料夾的完整路徑
String getAbsoluteFile() 傳回檔案或資料夾的完整路徑,和 getAbsolutePath()
相同
String getName()
傳回檔案或資料夾名稱
String.getParent()
傳回上層路徑,這是 File()建構子參數路徑的上層路
徑,如果沒有,傳回 null
String getPath()
傳回檔案或資料夾路徑,這就是 File()建構子的參數
路徑
long length()
傳回檔案長度,資料夾為 0
boolean canRead()
是否可讀,true 為是,false 為否
boolean canWrite()
是否可寫,true 為是,false 為否
14-2-3 更改檔案名稱
File類別提供方法更改檔案或資料夾名稱,
其方法如下表所示:
方法
boolean renameTo(File)
說明
將檔案或資料夾名稱改為參數的 File 物件,傳
回值 true 表示成功,false 表示失敗
14-2-4 刪除檔案
File類別提供方法可以刪除檔案或資料夾,
其方法如下表所示:
方法
boolean delete()
說明
將檔案或資料夾刪除,傳回值 true 表示成功,false
表示失敗
14-2-5 建立資料夾
File類別提供方法可以建立子資料夾,其方
法如下表所示:
方法
boolean mkdir()
boolean mkdirs()
說明
建立資料夾,傳回值 true 表示成功,false 表示失
敗
14-2-6 瀏覽檔案與資料夾視窗-說明
現在我們已經能夠在Java程式使用File物件
處理檔案和資料夾,接下來的程式範例是
使用File物件和Swing套件建立瀏覽檔案與
資料夾視窗。
本節的Java程式並不是使用Swing套件的
JList元件,而是使用AWT的List類別儲存
File物件list()方法取得的檔案和資料夾清
單,如下所示:
List lstItems = new List(elementCount);
上述程式碼建立List物件lstItems,參數
elementCount是顯示的項目數。
14-2-6 瀏覽檔案與資料夾視窗-方法
方法
int getSelectedIndex()
String getItem(int)
void removeAll()
void remove(int)
void add(String)
void add(String, int)
說明
取得清單中選取項目的索引
取得參數 int 索引的清單項目,索引值從 0 開始
刪除所有項目
刪除參數 int 索引的項目
新增參數的 String 物件到 List 物件,參數 int 是插
入位置,沒有 int 參數表示新增至最後
14-2-6 瀏覽檔案與資料夾視窗-圖例
14-3 標準輸出與輸入串流
14-3-1 標準輸出
14-3-2 標準輸入
14-3 標準輸出與輸入串流-說明
Java語言的標準輸出和輸入是指System
類別的System.out和System.in子類別,
不過,System類別並不是屬於java.io套
件,而是屬於java.lang套件。
在本章之前的Java程式範例早已經大量使
用System.out的println()和print()方法
輸出資料,如下所示:
System.out.println("….");
System.out.print("….");
14-3 標準輸出與輸入串流-方法
Reader/Writer父類別提供一些方法,可以在串
流讀取和寫入字元和字元陣列,如下表所示:
方法
int read()
int read(char[])
int read(char[], int, int)
說明
讀取 1 個字元
讀取字元陣列,當到資料結尾時,傳回-1
讀取從第 2 個參數 int 索引值開始,長度為第 3
個參數 int 的字元陣列
void write(int)
寫入整數
void write(char[])
寫入 1 個字元陣列
void write(char[], int, int) 寫入從第 2 個參數 int 索引值開始,長度為第 3
個參數 int 的字元陣列
void flush()
清除串流的內容,也就是將串流的資料全部輸出
void close()
關閉串流
14-3-1 標準輸出-說明
在Java程式將字串輸出到螢幕顯示就是開
啟System.out標準輸出的
OutputStreamWriter串流,我們可以使
用緩衝器類別的BufferedWriter串流加速
資料處理,如下所示:
BufferedWriter output = new
BufferedWriter(new
OutputStreamWriter(System.out));
14-3-1 標準輸出-方法
BufferedWriter類別是繼承自Writer類別
且新增過載方法write()輸出字串內容,如
下表所示:
方法
說明
void write(String)
寫入 1 個字串
void write(String, int, int) 寫入從第 2 個參數 int 索引值開始,長度為第 3
個參數 int 的字串
14-3-2 標準輸入-說明
Java程式從鍵盤輸入資料是開啟
System.in標準輸出的
InputStreamReader串流,同樣可以使用
緩衝器類別BufferedReader串流加速資料
處理,如下所示:
BufferedReader input = new
BufferedReader(new
InputStreamReader(System.in));
14-3-2 標準輸入-方法
BufferedReader類別是繼承自Reader類
別,新增方法readLine(),如下表所示:
方法
String readLine()
說明
讀取一行文字內容的字串,這一行是使用”\r”、”\n”
或”\r\n”結尾
14-4 Reader/Writer檔案串流
14-4-1 寫入文字檔案
14-4-2 讀取文字檔案
14-4-3 檔案複製
14-4-1 寫入文字檔案
當目標串流是一個檔案,在Java程式可以
開啟檔案的FileWriter串流,然後使用緩衝
器BufferedWriter串流來加速資料處理,
如下所示:
BufferedWriter output = new
BufferedWriter(new FileWriter(file));
上述程式碼的參數file是檔案路徑字串,在
開啟後,就可以使用write()方法將字串寫
入檔案。
14-4-2 讀取文字檔案
Java程式可以開啟檔案的FileReader串流來讀取
檔案內容,同樣可以使用緩衝器
BufferedReader串流來加速資料處理,如下所
示:
BufferedReader input = new
BufferedReader(new FileReader(name));
上述程式碼的參數name是File物件,然後就可以
使用while迴圈讀取檔案內容,如下所示:
while ( (str = input.readLine()) != null )
{ …… }
14-4-3 檔案複製
Java程式只需整合第14-4-1節和第14-42節的程式範例,就可以建立檔案複製程式,
首先使用FileReader和FileWriter串流分
別開啟來源和目的檔案串流,複製部分是
一個while迴圈,如下所示:
while ( (ch = input.read()) != -1 )
output.write(ch);
上述程式碼使用read()方法讀取整數,然
後使用write()方法寫入目的檔案。
14-5 InputStream/OutputStream檔
案串流
14-5-1 InputStream/OutputStream串
流的檔案處理
14-5-2 過濾串流的檔案處理
14-5 InputStream/OutputStream檔
案串流-說明
對於是二進位檔案,Java程式是使用
InputStream/OutputStream類別的位
元組串流來處理檔案讀取和寫入,
InputStream/OutputStream類別提供
對應Reader/Writer類別的方法,可以讀
取和寫入位元組或位元組陣列。
14-5 InputStream/OutputStream檔
案串流-方法
方法
int read()
int read(byte[])
int read(byte[], int, int)
void write(int)
void write(byte[])
void write(byte[], int, int)
說明
讀取 1 個位元組
讀取位元組陣列,當到資料結尾時,傳回-1
讀取從第 2 個參數 int 索引值開始,長度為
第 3 個參數 int 的位元組陣列
寫入整數
寫入 1 個位元組陣列
寫入從第 2 個參數 int 索引值開始,長度為
第 3 個參數 int 的位元組陣列
14-5-1 InputStream/OutputStream
串流的檔案處理
對於位元組串流的檔案I/O,Java程式是開啟
FileOutputStream和FileInputStream串流,
如下所示:
FileOutputStream output = new
FileOutputStream(file);
………
FileInputStream input = new
FileInputStream(name);
………
上述2列程式碼分別建立輸出和輸入串流,其來源
和目的都是檔案,參數可以是file的檔案路徑字串,
或name的File物件。
14-5-2 過濾串流的檔案處理-說
明
Java的「過濾串流」(Filter Stream)是
在串流間加上過濾器,以便將上方串流的
資料在處理後,才送到下方的串流,如下
圖所示:
14-5-2 過濾串流的檔案處理-範例
DateInputStream/DataOutputStream過濾
串流,屬於
FilterInputStream/FilterOutputStream的子
類別,如下所示:
DataOutputStream output = new
DataOutputStream(
new
FileOutputStream(file));
………
DataInputStream input = new
DataInputStream(
new FileInputStream(name));
………
14-6 隨機存取檔案的處理-說明
在本節前的檔案串流都屬於「循序存取串
流」(Sequential Access Streams),
只能如水流般依序讀取和寫入檔案。
「隨機存取檔案」(Random Access File)
是以非循序的隨機方式存取檔案內容,如
同一個位在磁碟檔案的陣列,使用索引值
就可以存取元素,這個索引值稱為「檔案
指標」(File Pointer)。
14-6 隨機存取檔案的處理-範例
RandomAccessFile類別因為同時實作
DataInput和DataOutput介面,所以可以
讀取和寫入檔案,如下所示:
RandomAccessFile input = new
RandomAccessFile(file,"rw");
RandomAccessFile input = new
RandomAccessFile(file,"r");
14-6 隨機存取檔案的處理-方法
RandomAccessFile類別提供方法處理檔
案指標,如下表所示:
方法
int skipBytes(int)
void seek(long)
long getFilePointer()
說明
移動檔案指標,向前移動參數 int 個位元組
移動檔案指標到長整數參數 long 位置,位置是
從 0 的檔頭開始
取得目前檔案指標位置的 long 長整數