系統學習 Java IO (四)----文件的讀寫和隨機訪問 FileInputStream/FileOutputStream & RandomAccessFile

目錄:系統學習 Java IO---- 目錄,概覽html

文件輸入流 FileInputStream

這是一個簡單的FileInputStream示例:java

InputStream input = new FileInputStream("D:\\input.txt");
int data = input.read();
while(data != -1) {
  //do something with data...
  doSomethingWithData(data);
  data = input.read();
}
input.close();

注意:爲了代碼清晰,這裏並無考慮處理異常的狀況,IO 異常處理有專門的介紹。數組

FileInputStream 構造器

FileInputStream 類有三個不一樣的構造函數,可用於建立 FileInputStream 實例。app

  • 構造函數將一個包含文件系統中要讀取的文件所在的路徑 String 做爲參數: FileInputStream fileInputStream = new FileInputStream( "D:\\1.txt");
    注意路徑須要雙反斜槓\\,由於反斜槓是Java字符串中的轉義字符,經過此方式得到單個反斜槓。
    在unix上,文件路徑可能以下所示:
    String path = "/home/czwbig/data/thefile.txt";
    注意使用正斜槓/做爲目錄分隔符。 這是在 unix 上編寫文件路徑的方法。 實際上,Java 也會理解在 Windows 上使用/做爲目錄分隔符,例如new FileInputStream("D:/out.txt")dom

  • 構造函數將 File 對象做爲參數。 File 對象必須指向要讀取的文件。 這是一個例子:
String path = "D:\\out.txt";
File   file = new File(path);
FileInputStream fileInputStream = new FileInputStream(file);

應該使用哪一個構造函數取決於在打開 FileInputStream 以前具備該路徑的形式。 若是您已經有一個 String 或 File ,只需按原樣使用它。 將 String 轉換爲 File 或將 File 轉換爲 String 沒有特別的好處。函數

  • public FileInputStream(FileDescriptor fdObj)
    經過使用文件描述符 fdObj 建立一個 FileInputStream,該文件描述符表示到文件系統中某個實際文件的現有鏈接。不經常使用。
read(byte[])

做爲 InputStream 的子類,FileInputStream 還有兩個 read() 方法,能夠將數據讀入字節數組。 能夠在個人有關 InputStream 的文章中閱讀,不展開了。學習

close()

建議使用 try 自動關閉,參考 IO 異常處理章節。unix


文件輸出流 FileOutputStream

這是一個簡單的 FileOutputStream 示例:指針

OutputStream output = new FileOutputStream("D:\\out.txt");
while(moreData) {
  int data = getMoreData();
  output.write(data);
}
output.close();
FileOutputStream 構造器

和 FileInputStream 的 3 個構造器差很少,參考上面便可。
另外多了兩個構造方法:code

  • FileOutputStream(File file, boolean append) ;
  • FileOutputStream(String name, boolean append) ;
    參數 append :若是不給出 append 參數,其值默認是 false 的,即默認是覆蓋模式。若是爲 true,則將字節寫入文件末尾處,而不是寫入文件開始處,這樣就能不覆蓋文件,而是追加內容。
    因此,在新建 FileOutputStream 對象的時候,要很是當心,只要沒有指定 append 爲 true ,那麼只要 FileOutputStream 對象建立成功,對應的文件會被當即清空。
    如代碼:OutputStream outputStream = new FileOutputStream("D:\\test\\1.txt"); ,執行後對應的 1.txt 文件(若是存在)會馬上被清空,而無論有沒有調用 OutputStream 的 write() 方法。
write(...) and flush()

參考 OutputStream 。

使用 RandomAccessFile 隨機訪問文件

這裏的隨機訪問是指,指定任何一個位置,都可以訪問它;而不是不肯定的隨機訪問某一個位置。
在使用 RandomAccessFile 類以前,必須實例化它。它有兩個構造器,以下:

  1. RandomAccessFile(File file, String mode)
  2. RandomAccessFile(String name, String mode)

實例:

RandomAccessFile file = new RandomAccessFile("c:\\data\\file.txt", "rw");

參數:
file、name- 該文件對象
mode - 訪問模式,以下表:

含意
"r" 以只讀方式打開。調用結果對象的任何 write 方法都將致使拋出 IOException。
"rw" 打開以便讀取和寫入。若是該文件尚不存在,則嘗試建立該文件。
"rws" "rw" + 「sync」,另外還要求對文件的內容或元數據的每一個更新都同步寫入到底層存儲設備。
"rwd" "rw" + 「data」,另外還要求對文件內容的每一個更新都同步寫入到底層存儲設備。
"rwd" 模式

可用於減小執行的 I/O 操做數量.使用 "rwd" 僅要求更新要寫入存儲的文件的內容;使用 "rws" 要求更新要寫入的文件內容及其元數據,這一般要求至少一個以上的低級別 I/O 操做。

"rws" 和 "rwd" 模式

若是該文件位於本地存儲設備上,那麼當返回此類的一個方法的調用時,能夠保證由該調用對此文件所作的全部更改均被寫入該設備。這對確保在系統崩潰時不會丟失重要信息特別有用。若是該文件不在本地設備上,則沒法提供這樣的保證。

在文件中跳轉

要在 RandomAccessFile 中的特定位置讀取或寫入,必須首先將文件指針放在要讀取或寫入的位置。 這是使用 seek() 方法完成的。 能夠經過調用 getFilePointer() 方法獲取文件指針的當前位置。
read() 方法將文件指針遞增爲指向剛剛讀取的字節後文件中的下一個字節! 這意味着能夠繼續調用 read() 而無需手動移動文件指針。
看以下例子:

public class RandomAccessFileExample {
    public static void main(String[] args) throws IOException {
        // out.txt 此時的文件內容爲 "123456789"
        RandomAccessFile file = new RandomAccessFile("D:\\out.txt", "rw");

        System.out.println("pointer: " + file.getFilePointer()); // 輸出 pointer: 0
        System.out.println("char: " + (char) file.read()); // 輸出 char: 1
        System.out.println("pointer: " + file.getFilePointer()); // 輸出 pointer: 1

        file.seek(4); // 下標從 0 開始的,讓其指向第 5 個字節

        System.out.println("pointer: " + file.getFilePointer()); // 輸出 pointer: 4
        System.out.println("char: " + (char) file.read()); // 輸出 char: 5
        System.out.println("pointer: " + file.getFilePointer()); // 輸出 pointer: 5
        file.close();
    }
}
read & write

從 RandomAccessFile 讀取是使用其衆多 read() 方法之一完成的。

方法 描述
read(byte[] b) 將最多 b.length 個數據字節今後文件讀入 byte 數組。
readByte() 今後文件讀取一個有符號的八位值。
readChar() 今後文件讀取一個字符。
readFully(byte[] b) 將 b.length 個字節今後文件讀入 byte 數組,並從當前文件指針開始。
readLine() 今後文件讀取文本的下一行。
skipBytes(int n) 嘗試跳過輸入的 n 個字節以丟棄跳過的字節。
setLength(long newLength) 設置此文件的長度。
writeChars(String s) 按字符序列將一個字符串寫入該文件。
相關文章
相關標籤/搜索