
Java 教程
- Java - 首頁
- Java - 概述
- Java - 歷史
- Java - 特性
- Java 與 C++
- JVM - Java 虛擬機器
- Java - JDK 與 JRE 與 JVM
- Java - Hello World 程式
- Java - 環境設定
- Java - 基本語法
- Java - 變數型別
- Java - 資料型別
- Java - 型別轉換
- Java - Unicode 系統
- Java - 基本運算子
- Java - 註釋
- Java - 使用者輸入
- Java - 日期和時間
Java 控制語句
- Java - 迴圈控制
- Java - 決策制定
- Java - if-else
- Java - switch
- Java - for 迴圈
- Java - for-each 迴圈
- Java - while 迴圈
- Java - do-while 迴圈
- Java - break
- Java - continue
面向物件程式設計
- Java - OOPs 概念
- Java - 物件和類
- Java - 類屬性
- Java - 類方法
- Java - 方法
- Java - 變數作用域
- Java - 建構函式
- Java - 訪問修飾符
- Java - 繼承
- Java - 聚合
- Java - 多型
- Java - 重寫
- Java - 方法過載
- Java - 動態繫結
- Java - 靜態繫結
- Java - 例項初始化塊
- Java - 抽象
- Java - 封裝
- Java - 介面
- Java - 包
- Java - 內部類
- Java - 靜態類
- Java - 匿名類
- Java - 單例類
- Java - 包裝類
- Java - 列舉
- Java - 列舉建構函式
- Java - 列舉字串
Java 內建類
Java 檔案處理
Java 錯誤和異常
- Java - 異常
- Java - try-catch 塊
- Java - try-with-resources
- Java - 多重catch塊
- Java - 巢狀 try 塊
- Java - finally 塊
- Java - throw 異常
- Java - 異常傳播
- Java - 內建異常
- Java - 自定義異常
Java 多執行緒
- Java - 多執行緒
- Java - 執行緒生命週期
- Java - 建立執行緒
- Java - 啟動執行緒
- Java - 加入執行緒
- Java - 執行緒命名
- Java - 執行緒排程器
- Java - 執行緒池
- Java - 主執行緒
- Java - 執行緒優先順序
- Java - 守護執行緒
- Java - 執行緒組
- Java - 關閉鉤子
Java 同步
Java 網路程式設計
- Java - 網路程式設計
- Java - 套接字程式設計
- Java - URL 處理
- Java - URL 類
- Java - URLConnection 類
- Java - HttpURLConnection 類
- Java - Socket 類
- Java -泛型
Java 集合
Java 介面
Java 資料結構
Java 集合演算法
高階 Java
- Java - 命令列引數
- Java - Lambda 表示式
- Java - 傳送郵件
- Java - Applet 基礎
- Java - Javadoc 註釋
- Java - 自動裝箱和拆箱
- Java - 檔案不匹配方法
- Java - REPL (JShell)
- Java - 多版本 Jar 檔案
- Java - 私有介面方法
- Java - 內部類菱形運算子
- Java - 多解析度影像 API
- Java - 集合工廠方法
- Java - 模組系統
- Java - Nashorn JavaScript
- Java - Optional 類
- Java - 方法引用
- Java - 函式式介面
- Java - 預設方法
- Java - Base64 編碼解碼
- Java - switch 表示式
- Java - Teeing 收集器
- Java - 微基準測試
- Java - 文字塊
- Java - 動態 CDS 歸檔
- Java - Z 垃圾收集器 (ZGC)
- Java - 空指標異常
- Java - 打包工具
- Java - 密封類
- Java - 記錄類
- Java - 隱藏類
- Java - 模式匹配
- Java - 簡潔的數字格式化
- Java - 垃圾回收
- Java - JIT 編譯器
Java 其他
- Java - 遞迴
- Java - 正則表示式
- Java - 序列化
- Java - 字串
- Java - Process API改進
- Java - Stream API改進
- Java - 增強的 @Deprecated 註解
- Java - CompletableFuture API改進
- Java - 流
- Java - 日期時間API
- Java 8 - 新特性
- Java 9 - 新特性
- Java 10 - 新特性
- Java 11 - 新特性
- Java 12 - 新特性
- Java 13 - 新特性
- Java 14 - 新特性
- Java 15 - 新特性
- Java 16 - 新特性
Java APIs 和框架
Java 類引用
- Java - Scanner
- Java - 陣列
- Java - 字串
- Java - Date
- Java - ArrayList
- Java - Vector
- Java - Stack
- Java - PriorityQueue
- Java - LinkedList
- Java - ArrayDeque
- Java - HashMap
- Java - LinkedHashMap
- Java - WeakHashMap
- Java - EnumMap
- Java - TreeMap
- Java - IdentityHashMap
- Java - HashSet
- Java - EnumSet
- Java - LinkedHashSet
- Java - TreeSet
- Java - BitSet
- Java - Dictionary
- Java - Hashtable
- Java - Properties
- Java - Collection
- Java - Array
Java 有用資源
Java - 檔案和I/O
java.io 包包含幾乎所有你可能需要在 Java 中執行輸入和輸出 (I/O) 的類。所有這些流都表示輸入源和輸出目標。java.io 包中的流支援多種資料,例如基本型別、物件、本地化字元等。
流
流可以定義為一系列資料。流有兩種:
InputStream - InputStream 用於從源讀取資料。
OutputStream - OutputStream 用於將資料寫入目標。

Java 提供了強大而靈活的與檔案和網路相關的 I/O 支援,但本教程涵蓋了與流和 I/O 相關的非常基本的功能。我們將逐一檢視最常用的示例:
位元組流
Java 位元組流用於執行 8 位位元組的輸入和輸出。雖然有很多與位元組流相關的類,但最常用的類是FileInputStream 和 FileOutputStream。以下是一個使用這兩個類將輸入檔案複製到輸出檔案的示例:
示例
import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; public class CopyFile { public static void main(String args[]) throws IOException { FileInputStream in = null; FileOutputStream out = null; try { in = new FileInputStream("input.txt"); out = new FileOutputStream("output.txt"); int c; while ((c = in.read()) != -1) { out.write(c); } }finally { if (in != null) { in.close(); } if (out != null) { out.close(); } } } }
現在讓我們有一個名為input.txt 的檔案,其內容如下:
This is test for copy file.
下一步,編譯上述程式並執行它,這將導致建立一個 output.txt 檔案,其內容與 input.txt 中的內容相同。因此,讓我們將上述程式碼放入 CopyFile.java 檔案中,並執行以下操作:
$javac CopyFile.java $java CopyFile
字元流
Java 位元組流用於執行 8 位位元組的輸入和輸出,而 Java 字元流用於執行 16 位 Unicode 的輸入和輸出。雖然有很多與字元流相關的類,但最常用的類是FileReader 和 FileWriter。雖然內部 FileReader 使用 FileInputStream,FileWriter 使用 FileOutputStream,但這裡的主要區別是 FileReader 一次讀取兩個位元組,FileWriter 一次寫入兩個位元組。
我們可以重寫上面的示例,它使用這兩個類來複制一個輸入檔案(包含 Unicode 字元)到一個輸出檔案:
示例
import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; public class CopyFile { public static void main(String args[]) throws IOException { FileReader in = null; FileWriter out = null; try { in = new FileReader("input.txt"); out = new FileWriter("output.txt"); int c; while ((c = in.read()) != -1) { out.write(c); } }finally { if (in != null) { in.close(); } if (out != null) { out.close(); } } } }
現在讓我們有一個名為input.txt 的檔案,其內容如下:
This is test for copy file.
下一步,編譯上述程式並執行它,這將導致建立一個 output.txt 檔案,其內容與 input.txt 中的內容相同。因此,讓我們將上述程式碼放入 CopyFile.java 檔案中,並執行以下操作:
$javac CopyFile.java $java CopyFile
標準流
所有程式語言都支援標準 I/O,使用者程式可以從鍵盤獲取輸入,然後在計算機螢幕上產生輸出。如果您瞭解 C 或 C++ 程式語言,那麼您一定了解三個標準裝置 STDIN、STDOUT 和 STDERR。類似地,Java 提供以下三個標準流:
標準輸入 - 這用於向用戶程式提供資料,通常使用鍵盤作為標準輸入流,表示為System.in。
標準輸出 − 用於輸出使用者程式產生的資料,通常使用計算機螢幕作為標準輸出流,表示為System.out。
標準錯誤 − 用於輸出使用者程式產生的錯誤資料,通常使用計算機螢幕作為標準錯誤流,表示為System.err。
下面是一個簡單的程式,它建立了一個InputStreamReader來讀取標準輸入流,直到使用者輸入“q”為止:
示例
import java.io.InputStreamReader; public class ReadConsole { public static void main(String args[]) throws IOException { InputStreamReader cin = null; try { cin = new InputStreamReader(System.in); System.out.println("Enter characters, 'q' to quit."); char c; do { c = (char) cin.read(); System.out.print(c); } while(c != 'q'); }finally { if (cin != null) { cin.close(); } } } }
讓我們將以上程式碼儲存在ReadConsole.java檔案中,並嘗試編譯和執行它,如下面的程式所示。這個程式會持續讀取並輸出相同的字元,直到我們按下'q':
$javac ReadConsole.java $java ReadConsole Enter characters, 'q' to quit. 1 1 e e q q
檔案讀取和寫入
如前所述,流可以定義為一系列資料。InputStream用於從源讀取資料,OutputStream用於將資料寫入目標。
以下是處理輸入和輸出流的類層次結構。

兩個重要的流是FileInputStream和FileOutputStream,本教程將對此進行討論。
FileInputStream
此流用於從檔案讀取資料。可以使用關鍵字new建立物件,並且有多種型別的建構函式可用。
下面的建構函式採用檔名(字串)來建立一個輸入流物件以讀取檔案:
InputStream f = new FileInputStream("C:/java/hello");
下面的建構函式採用檔案物件來建立一個輸入流物件以讀取檔案。首先,我們使用File()方法建立檔案物件,如下所示:
File f = new File("C:/java/hello"); InputStream f = new FileInputStream(f);
一旦你擁有了InputStream物件,就可以使用一系列輔助方法來讀取流或對流執行其他操作。
序號 | 方法及描述 |
---|---|
1 | public void close() throws IOException{} 此方法關閉檔案輸出流。釋放與檔案關聯的任何系統資源。丟擲IOException異常。 |
2 | protected void finalize()throws IOException {} 此方法清理與檔案的連線。確保當沒有更多對該流的引用時,呼叫此檔案輸出流的close方法。丟擲IOException異常。 |
3 | public int read(int r)throws IOException{} 此方法從InputStream讀取指定位元組的資料。返回一個int值。返回下一個資料位元組,如果到了檔案末尾則返回-1。 |
4 | public int read(byte[] r) throws IOException{} 此方法從輸入流讀取r.length個位元組到陣列中。返回讀取的總位元組數。如果到了檔案末尾,則返回-1。 |
5 | public int available() throws IOException{} 給出可以從此FileInputStrem讀取的位元組數。返回一個int值。 |
還有其他重要的輸入流可用,更多詳情請參考以下連結:
FileOutputStream
FileOutputStream用於建立檔案並將資料寫入其中。如果檔案不存在,此流將在開啟它進行輸出之前建立它。
以下是可以用來建立FileOutputStream物件的兩個建構函式。
下面的建構函式採用檔名(字串)來建立一個輸入流物件以寫入檔案:
OutputStream f = new FileOutputStream("C:/java/hello")
下面的建構函式採用檔案物件來建立一個輸出流物件以寫入檔案。首先,我們使用File()方法建立檔案物件,如下所示:
File f = new File("C:/java/hello"); OutputStream f = new FileOutputStream(f);
一旦你擁有了OutputStream物件,就可以使用一系列輔助方法來寫入流或對流執行其他操作。
序號 | 方法及描述 |
---|---|
1 | public void close() throws IOException{} 此方法關閉檔案輸出流。釋放與檔案關聯的任何系統資源。丟擲IOException異常。 |
2 | protected void finalize()throws IOException {} 此方法清理與檔案的連線。確保當沒有更多對該流的引用時,呼叫此檔案輸出流的close方法。丟擲IOException異常。 |
3 | public void write(int w)throws IOException{} 此方法將指定的位元組寫入輸出流。 |
4 | public void write(byte[] w) 將w.length個位元組從提到的位元組陣列寫入OutputStream。 |
還有其他重要的輸出流可用,更多詳情請參考以下連結:
示例
以下示例演示了InputStream和OutputStream:
import java.io.OutputStream; public class fileStreamTest { public static void main(String args[]) { try { byte bWrite [] = {11,21,3,40,5}; OutputStream os = new FileOutputStream("test.txt"); for(int x = 0; x < bWrite.length ; x++) { os.write( bWrite[x] ); // writes the bytes } os.close(); InputStream is = new FileInputStream("test.txt"); int size = is.available(); for(int i = 0; i < size; i++) { System.out.print((char)is.read() + " "); } is.close(); } catch (IOException e) { System.out.print("Exception"); } } }
以上程式碼將建立檔案test.txt並將給定的數字以二進位制格式寫入其中。標準輸出螢幕上的輸出也將相同。
檔案導航和I/O
我們將學習其他一些類,以瞭解檔案導航和I/O的基礎知識。
Java中的目錄
目錄是一個File,它可以包含其他檔案和目錄的列表。您可以使用File物件建立目錄,列出目錄中可用的檔案。有關完整詳細資訊,請檢視可以在File物件上呼叫的所有方法以及與目錄相關的那些方法的列表。
建立目錄
有兩個有用的File實用程式方法可用於建立目錄:
mkdir( )方法建立一個目錄,成功時返回true,失敗時返回false。失敗表示File物件中指定的路徑已存在,或者由於整個路徑尚不存在而無法建立目錄。
mkdirs()方法建立目錄及其所有父目錄。
以下示例建立"/tmp/user/java/bin"目錄:
示例
import java.io.File; public class CreateDir { public static void main(String args[]) { String dirname = "/tmp/user/java/bin"; File d = new File(dirname); // Create directory now. d.mkdirs(); } }
編譯並執行以上程式碼以建立"/tmp/user/java/bin"。
注意 − Java會根據約定自動處理UNIX和Windows上的路徑分隔符。如果您在Windows版本的Java上使用正斜槓(/),路徑仍然可以正確解析。
列出目錄
您可以使用File物件提供的list( )方法列出目錄中所有可用的檔案和目錄,如下所示:
示例
import java.io.File; public class ReadDir { public static void main(String[] args) { File file = null; String[] paths; try { // create new file object file = new File("/tmp"); // array of files and directory paths = file.list(); // for each name in the path array for(String path:paths) { // prints filename and directory name System.out.println(path); } } catch (Exception e) { // if any error occurs e.printStackTrace(); } } }
這將根據/tmp目錄中可用的目錄和檔案產生以下結果:
輸出
test1.txt test2.txt ReadDir.java ReadDir.class