編程基礎:Java 中的輸入和輸出
當你寫一個程序時,你的應用程序可能需要讀取和寫入存儲在用戶計算機上的文件。這在你想載入或存儲配置選項,你需要創建日誌文件,或你的用戶想要保存工作以待後用的情況下是很常見的。每種語言處理這項任務的方式都有所不同。本文演示了如何用 Java 處理數據文件。
安裝 Java
不管你的計算機是什麼平台,你都可以從 AdoptOpenJDK 安裝 Java。這個網站提供安全和開源的 Java 構建。在 Linux 上,你的軟體庫中也可能找到 AdoptOpenJDK 的構建。
我建議你使用最新的長期支持(LTS)版本。最新的非 LTS 版本對希望嘗試最新 Java 功能的開發者來說是最好的,但它很可能超過大多數用戶所安裝的版本 —— 要麼是系統上默認安裝的,要麼是以前為其他 Java 應用安裝的。使用 LTS 版本可以確保你與大多數用戶所安裝的版本保持一致。
一旦你安裝好了 Java,就可以打開你最喜歡的文本編輯器並準備開始寫代碼了。你可能還想要研究一下 Java 集成開發環境。BlueJ 是新程序員的理想選擇,而 Eclipse 和 Netbeans 對中級和有經驗的編碼者更友好。
利用 Java 讀取文件
Java 使用 File
類來載入文件。
這個例子創建了一個叫 Ingest
的類來讀取文件中數據。當你要在 Java 中打開一個文件時,你創建了一個 Scanner
對象,它可以逐行掃描你提供的文件。事實上,Scanner
與文本編輯器中的游標是相同的概念,這樣你可以用 Scanner
的一些方法(如 nextLine
)來控制這個「游標」以進行讀寫。
import java.io.File;
import java.util.Scanner;
import java.io.FileNotFoundException;
public class Ingest {
public static void main(String[] args) {
try {
File myFile = new File("example.txt");
Scanner myScanner = new Scanner(myFile);
while (myScanner.hasNextLine()) {
String line = myScanner.nextLine();
System.out.println(line);
}
myScanner.close();
} catch (FileNotFoundException ex) {
ex.printStackTrace();
} //try
} //main
} //class
這段代碼首先在假設存在一個名為 example.txt
的文件的情況下創建了變數 myfile
。如果該文件不存在,Java 就會「拋出一個異常」(如它所說的,這意味著它在你試圖做的事情中發現了一個錯誤),這個異常是被非常特定的 FileNotFoundException
類所「捕獲」。事實上,有一個專門的類來處理這個明確的錯誤,這說明這個錯誤是多麼常見。
接下來,它創建了一個 Scanner
並將文件載入到其中。我把它叫做 myScanner
,以區別於它的通用類模板。接著,一個 while
循環將 myScanner
逐行送入文件中,只要 存在 下一行。這就是 hasNextLine
方法的作用:它檢測「游標」之後是否還有數據。你可以通過在文本編輯器中打開一個文件來模擬這個過程:你的游標從文件的第一行開始,你可以用鍵盤控制游標來向下掃描文件,直到你走完了所有的行。
while
循環創建了一個變數 line
,並將文件當前行的數據分配給它。然後將 line
的內容列印出來以提供反饋。一個更有用的程序可能會解析每一行的內容,從而提取它所包含的任何重要數據。
在這個過程結束時,關閉 myScanner
對象。
運行代碼
將你的代碼保存到 Ingest.java
文件(這是一個 Java 慣例,將類名的首字母大寫,並以類名來命名相應的文件)。如果你試圖運行這個簡單的應用程序,你可能會接收到一個錯誤信息,這是因為還沒有 example.txt
文件供應用程序載入:
$ java ./Ingest.java
java.io.FileNotFoundException:
example.txt (No such file or directory)
正好可以編寫一個將數據寫入文件的 Java 應用程序,多麼完美的時機!
利用 Java 將數據寫入文件
無論你是存儲用戶使用你的應用程序創建的數據,還是僅僅存儲關於用戶在應用程序中做了什麼的元數據(例如,遊戲保存或最近播放的歌曲),有很多很好的理由來存儲數據供以後使用。在 Java 中,這是通過 FileWriter
類實現的,這次先打開一個文件,向其中寫入數據,然後關閉該文件。
import java.io.FileWriter;
import java.io.IOException;
public class Exgest {
public static void main(String[] args) {
try {
FileWriter myFileWriter = new FileWriter("example.txt", true);
myFileWriter.write("Hello worldn");
myFileWriter.close();
} catch (IOException ex) {
System.out.println(ex);
} // try
} // main
}
這個類的邏輯和流程與讀取文件類似。但它不是一個 Scanner
,而是以一個文件的名字為參數創建的一個 FileWriter
對象。FileWriter
語句末尾的 true
標誌告訴 FileWriter
將文本 追加 到文件的末尾。要覆蓋一個文件的內容,請移除 true
標誌。
`FileWriter myFileWriter = new FileWriter("example.txt", true);`
因為我在向文件中寫入純文本,所以我在寫入文件的數據(Hello world
)的結尾處手動添加了換行符(n
)。
試試代碼
將這段代碼保存到 Exgest.java
文件,遵循 Java 的慣例,使文件名為與類名相匹配。
既然你已經掌握了用 Java 創建和讀取數據的方法,你可以按相反的順序嘗試運行你的新應用程序。
$ java ./Exgest.java
$ java ./Ingest.java
Hello world
$
因為程序是把數據追加到文件末尾,所以你可以重複執行你的應用程序以多次寫入數據,只要你想把更多的數據添加到你的文件中。
$ java ./Exgest.java
$ java ./Exgest.java
$ java ./Exgest.java
$ java ./Ingest.java
Hello world
Hello world
Hello world
$
Java 和數據
你不會經常向文件中寫入原始文本;事實上,你可能會使用一個其它的類庫以寫入特定的格式。例如,你可能使用 XML 類庫來寫複雜的數據,使用 INI 或 YAML 類庫來寫配置文件,或者使用各種專門類庫來寫二進位格式,如圖像或音頻。
更完整的信息,請參閱 OpenJDK 文檔。
via: https://opensource.com/article/21/3/io-java
作者:Seth Kenlon 選題:lujun9972 譯者:piaoshi 校對:wxy
本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive