編程基礎:Java 中的輸入和輸出
學習 Java 如何外理數(shù)據(jù)的讀與寫。
當你寫一個程序時,你的應用程序可能需要讀取和寫入存儲在用戶計算機上的文件。這在你想加載或存儲配置選項,你需要創(chuàng)建日志文件,或你的用戶想要保存工作以待后用的情況下是很常見的。每種語言處理這項任務的方式都有所不同。本文演示了如何用 Java 處理數(shù)據(jù)文件。
安裝 Java
不管你的計算機是什么平臺,你都可以從 AdoptOpenJDK 安裝 Java。這個網(wǎng)站提供安全和開源的 Java 構(gòu)建。在 Linux 上,你的軟件庫中也可能找到 AdoptOpenJDK 的構(gòu)建。
我建議你使用最新的長期支持(LTS)版本。最新的非 LTS 版本對希望嘗試最新 Java 功能的開發(fā)者來說是最好的,但它很可能超過大多數(shù)用戶所安裝的版本 —— 要么是系統(tǒng)上默認安裝的,要么是以前為其他 Java 應用安裝的。使用 LTS 版本可以確保你與大多數(shù)用戶所安裝的版本保持一致。
一旦你安裝好了 Java,就可以打開你最喜歡的文本編輯器并準備開始寫代碼了。你可能還想要研究一下 Java 集成開發(fā)環(huán)境。BlueJ 是新程序員的理想選擇,而 Eclipse 和 Netbeans 對中級和有經(jīng)驗的編碼者更友好。
利用 Java 讀取文件
Java 使用 File 類來加載文件。
這個例子創(chuàng)建了一個叫 Ingest 的類來讀取文件中數(shù)據(jù)。當你要在 Java 中打開一個文件時,你創(chuàng)建了一個 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 的文件的情況下創(chuàng)建了變量 myfile。如果該文件不存在,Java 就會“拋出一個異常”(如它所說的,這意味著它在你試圖做的事情中發(fā)現(xiàn)了一個錯誤),這個異常是被非常特定的 FileNotFoundException 類所“捕獲”。事實上,有一個專門的類來處理這個明確的錯誤,這說明這個錯誤是多么常見。
接下來,它創(chuàng)建了一個 Scanner 并將文件加載到其中。我把它叫做 myScanner,以區(qū)別于它的通用類模板。接著,一個 while 循環(huán)將 myScanner 逐行送入文件中,只要 存在 下一行。這就是 hasNextLine 方法的作用:它檢測“光標”之后是否還有數(shù)據(jù)。你可以通過在文本編輯器中打開一個文件來模擬這個過程:你的光標從文件的第一行開始,你可以用鍵盤控制光標來向下掃描文件,直到你走完了所有的行。
while 循環(huán)創(chuàng)建了一個變量 line,并將文件當前行的數(shù)據(jù)分配給它。然后將 line 的內(nèi)容打印出來以提供反饋。一個更有用的程序可能會解析每一行的內(nèi)容,從而提取它所包含的任何重要數(shù)據(jù)。
在這個過程結(jié)束時,關閉 myScanner 對象。
運行代碼
將你的代碼保存到 Ingest.java 文件(這是一個 Java 慣例,將類名的首字母大寫,并以類名來命名相應的文件)。如果你試圖運行這個簡單的應用程序,你可能會接收到一個錯誤信息,這是因為還沒有 example.txt 文件供應用程序加載:
- $ java ./Ingest.java
- java.io.FileNotFoundException:
- example.txt (No such file or directory)
正好可以編寫一個將數(shù)據(jù)寫入文件的 Java 應用程序,多么完美的時機!
利用 Java 將數(shù)據(jù)寫入文件
無論你是存儲用戶使用你的應用程序創(chuàng)建的數(shù)據(jù),還是僅僅存儲關于用戶在應用程序中做了什么的元數(shù)據(jù)(例如,游戲保存或最近播放的歌曲),有很多很好的理由來存儲數(shù)據(jù)供以后使用。在 Java 中,這是通過 FileWriter 類實現(xiàn)的,這次先打開一個文件,向其中寫入數(shù)據(jù),然后關閉該文件。
- 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 world\n");
- myFileWriter.close();
- } catch (IOException ex) {
- System.out.println(ex);
- } // try
- } // main
- }
這個類的邏輯和流程與讀取文件類似。但它不是一個 Scanner,而是以一個文件的名字為參數(shù)創(chuàng)建的一個 FileWriter 對象。FileWriter 語句末尾的 true 標志告訴 FileWriter 將文本 追加 到文件的末尾。要覆蓋一個文件的內(nèi)容,請移除 true 標志。
- `FileWriter myFileWriter = new FileWriter("example.txt", true);`
因為我在向文件中寫入純文本,所以我在寫入文件的數(shù)據(jù)(Hello world)的結(jié)尾處手動添加了換行符(\n)。
試試代碼
將這段代碼保存到 Exgest.java 文件,遵循 Java 的慣例,使文件名為與類名相匹配。
既然你已經(jīng)掌握了用 Java 創(chuàng)建和讀取數(shù)據(jù)的方法,你可以按相反的順序嘗試運行你的新應用程序。
- $ java ./Exgest.java
- $ java ./Ingest.java
- Hello world
- $
因為程序是把數(shù)據(jù)追加到文件末尾,所以你可以重復執(zhí)行你的應用程序以多次寫入數(shù)據(jù),只要你想把更多的數(shù)據(jù)添加到你的文件中。
- $ java ./Exgest.java
- $ java ./Exgest.java
- $ java ./Exgest.java
- $ java ./Ingest.java
- Hello world
- Hello world
- Hello world
- $
Java 和數(shù)據(jù)
你不會經(jīng)常向文件中寫入原始文本;事實上,你可能會使用一個其它的類庫以寫入特定的格式。例如,你可能使用 XML 類庫來寫復雜的數(shù)據(jù),使用 INI 或 YAML 類庫來寫配置文件,或者使用各種專門類庫來寫二進制格式,如圖像或音頻。