標籤:tput 文本 read 檔案系統 [] and ade 方法 子類
Files
使用 FileInputStream 或 FileReader 可以用於讀入檔案,前者基於二進位,後者基於文本。使用它們不需要讀取整個檔案,但是只能按照它們儲存的順序,依次讀取位元組,或字元。
使用 FileOutputStream 或 FileWriter 可以把資料寫出到檔案,按照資料被寫入的順序,依次儲存資料。
RandomAccessFile 可以在檔案中跳轉,讀入資料,或者寫出資料到檔案。Random Access 並不意味著你真的從隨意的位置讀入資料,或者把資料寫入到隨意位置。而是意味著你可以在檔案中跳躍,然後在停留的位置讀入資料,並且寫出資料。寫出資料時,是覆蓋原來的資料,不會是資料。
File 類用於擷取檔案大小,屬性,不能用於擷取檔案內容。
File 類
Java IO API 中的 File 類可以訪問底層檔案系統,擷取檔案的資訊元,即擷取用於描述檔案的資訊,例如檔案大小,屬性等。如果需要訪問檔案內容,需要使用 FileInputStream, FileOutpuStream, RandamAccessFile。在 Java NIO 中,則使用 java.nio.FileChannel 讀入檔案內容。
建立檔案對象的執行個體
File file = new File("/tmp/tony/a.txt");
檢查檔案是否存在
在建立 File 對象時,即使檔案不存在,構造器也不會報錯。
File file = new File("/tmp/tony/a.txt"); boolean isFileExist = file.exists();
建立目錄
mkdirs() 方法可以建立 File 路徑上面沒有的全部檔案夾。 下面例子中,如果 resources 以及之前的目錄已存在,而 aaa 和 bbb 兩層目錄不存在,mkdirs() 會建立 aaa/ 以及其子目錄 bbb/。
File folder = new File("/tmp/tony/aaa/bbb/"); boolean isSuccess = folder.mkdirs();
mkdir() 方法只會最裡面的那個目錄。上面例子如果使用 mkdir() ,bbb 不會被建立,因為沒有 aaa 目錄,返回 false.
檔案大小
File file = new File("/tmp/tony/a.txt"); long size = file.length();
移動檔案、改名
修改檔案名稱字,移動檔案位置,都是用 renameTo() 方法,和 Linux 中的 mv 命令相似。
File file = new File("/tmp/tony/a.txt"); boolean isSuccess = file.renameTo(new File("/tmp/tony/aaa/xx.txt"));
刪除檔案
File file = new File("/tmp/tony/a.txt"); file.delete();
列舉目錄下的檔案
list() 方法獲得目錄下的全部檔案名稱, listFiles() 方法獲得目錄下的全部檔案,以 File 對象的形式存在。
File file = new File("/tmp/tony/a.txt"); String[] subfileNames = file.list(); File[] subFiles = file.listFiles();
FileInputStream 和 FileOutputStreamFileInputStream
FileInputStream 按照 stream 的方式,基於位元組,讀取檔案的內容。FileInputStream 是 InputSteam 的子類。
InputStream is = new FileInputStream("/tmp/tony/a.txt"); int data = is.read(); while(data != -1){ System.out.print((char)data); data = is.read(); } is.close();
FileInputStream 的構造器有:
a. 接收一個 String 類型
String filePath = "/tmp/tony/a.txt"; InputStream is = new FileInputStream(filePath);
b. 接收一個 File 對象為參數
File file = new File("/tmp/tony/a.txt"); InputStream is = new FileInputStream(file);
read() 方法,一次讀取一個位元組,並返回該位元組對應的 int 值
read(byte[]) 一次讀取一個位元組數組
close() 關閉 stream
FileOutputStream
寫出資料到檔案
OutputStream os = new FileOutputStream("/tmp/tony/b.txt"); os.write("abcd\n".getBytes());
FileOutputStream 構造器
a. 接收一個參數, String 類型
OutputStream os = new FileOutputStream("/tmp/tony/a.txt");
b. 接收一個參數,File 類型
File file = new File("/tmp/tony/b.txt"); OutputStream os1 = new FileOutputStream(file);
c. 接收兩個參數。第一個參數用於定位檔案,String 或 File 類型;第二個參數表示,在寫出資料到檔案時,追加還是覆蓋 File 檔案原有的內容。
OutputStream os1 = new FileOutputStream("/tmp/tony/a.txt", true); // append content OutputStream os2 = new FileOutputStream("/tmp/tony/a.txt", false); // overwrite content
wirte() 一次寫出一個位元組
write(byte[]) 一次寫出一個位元組數組
flush() 清刷寫到 FileOutputStream 的緩衝區的資料到硬碟上。
RandomAccessFile
RandomAccessFile 可以跳到檔案中的某個位置,開始讀入和寫出資料。寫出資料時,會覆蓋掉檔案在該位置原有的內容,這是 FileInputStream 和 FileOutputStream 無法實現的。
FileReader 和 FileWriterFileReader
FileReader 按照 stream 的方式,基於字元,讀取檔案的內容,和 FileInputStream 相似。區別在於 FileInputStream 基於 byte , 而 FileReader 基於字元。
Reader reader = new FileReader("/tmp/tony/a.txt"); int data = reader.read(); while(data != -1){ System.out.print((char)data); data = reader.read(); } reader.close
字元集編碼
FileReader 使用應用所在環境的編碼集,對讀入的資料進行解碼。如果寫出檔案的編碼集和讀入檔案時的編碼集不一樣,就會導致亂碼。這時需要制定字元集,不是用 FileReader ,而是用基於 FileInputStream 的 InputStreamReader 。
InputStream is = new FileInputStream("/tmp/tony/b.txt"); Reader reader = new InputStreamReader(is, "UTF-8"); int data = reader.read(); while(data != -1){ System.out.print((char)data); data = reader.read(); } reader.close();
FileWriter
FileWriter 按照 stream 的方式,基於字元,把資料寫出到檔案中,和 FileOutputStream 相似。區別在於 FileOutputSteam 基於 byte, 而 FileWriter 基於字元。
Writer writer = new FileWriter("/tmp/tony/c.txt"); writer.write("aaabbb\n"); writer.close();
兩個參數的構造器,第一個參數用於定位檔案,第二參數表示在寫出資料到檔案時,是追加還是覆蓋檔案中原有的內容。
Writer writer1 = new FileWriter("/tmp/tony/a.txt", true); //appends to fileWriter writer2 = new FileWriter("/tmp/tony/a.txt", false); //overwrites file
FileWriter 在寫出資料時,無法指定特定的字元編碼集。如果需要指定編碼集,則不用用 FileWriter ,而是用基於 FileOutputStream 的 OutputSteamWriter。
os = new FileOutputStream("/tmp/tony/d.txt"); Writer wt = new OutputStreamWriter(os, "UTF-8"); wt.write("aaa\n你好"); wt.close();
參考資料
Java IO Tutorial, jenkov
[Java] Java IO Files