天天看點

[Java IO]01_File類和RandomAccessFile類File類RandomAccessFile類

File類是java.io包中唯一對檔案本身進行操作的類。它可以進行建立、删除檔案等操作。

可以使用 createNewFille() 建立一個新檔案。

注意:

Windows 中使用反斜杠表示目錄的分隔符"\"。

Linux 中使用正斜杠表示目錄的分隔符"/"。

最好的做法是使用 File.separator 靜态常量,可以根據所在作業系統選取對應的分隔符。

可以使用 delete() 删除一個檔案。

一般删除檔案前,最好先使用 exists() 判斷一下檔案是否存在。 

示範建立和删除檔案操作

<a></a>

import java.io.File;

import java.io.IOException;

public class FileDemo01 {

    public static void createFile(String filepath) {

        File f = new File(filepath);

        System.out.println("[Create File] " + f.getPath().toString());

        try {

            f.createNewFile(); // 建立檔案,根據給定的路徑建立

        } catch (IOException e) {

            e.printStackTrace(); // 輸出異常資訊

        }

    }

    public static void deleteFile(String filepath) {

        System.out.println("[Delete File] " + f.getPath().toString());

        if(f.exists()){    // 如果檔案存在則删除

            f.delete(); // 建立檔案,根據給定的路徑建立

    public static void main(String args[]) {

        // 注意三種分隔符方式

        String path1 = "d:\\test1.txt"; // Windows中使用反斜杠表示目錄的分隔符"\"

        String path2 = "d:/test2.txt"; // Linux中使用正斜杠表示目錄的分隔符"/"

        String path3 = "d:" + File.separator + "test3.txt"; // 最好的做法是使用File.separator,可以根據所在作業系統選取對應分隔符

        createFile(path1);

        createFile(path2);

        createFile(path3);

        deleteFile(path1);

};

運作結果

在D:盤符下,先建立了三個檔案,又删除了第一個檔案。最後剩下test2.txt和test3.txt兩個檔案。

可以使用 mkdir() 來建立檔案夾,但是如果要建立的目錄的父路徑不存在,則無法建立成功。

如果要解決這個問題,可以使用 mkdirs(),當父路徑不存在時,會連同上級目錄都一并建立。 

public class FileDemo02 {

        File f = new File("d:\\abc\\test"); // 執行個體化File類的對象

        f.mkdir(); // 建立檔案夾

        // f.mkdirs(); // 建立檔案夾,如果父路徑不存在,會一并建立

上面的例子中,如果用mkdir(),會發現建立目錄失敗;而用mkdirs()則成功。 

File中給出了兩種列出檔案夾内容的方法:

list(): 列出全部名稱,傳回一個字元串數組。

listFiles(): 列出完整的路徑,傳回一個File對象數組。

public class FileDemo03 {

    public static void testListFiles1(String path) {

        File f = new File(path); // 執行個體化File類的對象

        String str[] = f.list(); // 列出給定目錄中的内容

        System.out.println("[list]");

        for (int i = 0; i &lt; str.length; i++) {

            System.out.println(str[i]);

    public static void testListFiles2(String path) {

        File files[] = f.listFiles(); // 列出全部内容

        System.out.println("[listFiles]");

        for (int i = 0; i &lt; files.length; i++) {

            System.out.println(files[i]);

        String path = "d:" + File.separator;

        testListFiles1(path);

        testListFiles2(path);

可以使用 delete() 來删除目錄。

需要注意的是,如果這個目錄不為空,直接用 delete() 删除會失敗。 

以下示範了一個删除指定目錄,包括其所有子檔案和子目錄的範例

public class DeleteDirectory {

    /**

     * 删除空目錄,如果目錄不為空,無法删除

     * @param dir

     */

    private static void deleteEmptyDir(String dir) {

        File f = new File(dir);

        boolean success = f.delete();

        if (success) {

            System.out.println("Success to deleted " + dir);

        } else {

            System.out.println("Failed to delete " + dir);

     * 如果傳入的是一個目錄對象,周遊删除其所有子檔案和子目錄

     * @return

    private static boolean deleteDir(File dir) {

        if (dir.isDirectory()) {

            File[] children = dir.listFiles();// 遞歸删除目錄中的子目錄下

            for (int i = 0; i &lt; children.length; i++) {

                boolean success = deleteDir(children[i]);

                if (!success) {

                    return false;

                }

            }

        // 目錄此時為空,可以删除

        return dir.delete();

    public static void main(String[] args) {

        String emptyDir = "d:\\empty";

        String dir2 = "d:\\test";

        deleteEmptyDir(emptyDir);

        boolean success = deleteDir(new File(dir2));

            System.out.println("Success to deleted " + dir2);

            System.out.println("Failed to delete  " + dir2);

}

RandomAccessFile類是随機讀取類,它是一個完全獨立的類。

它适用于由大小已知的記錄組成的檔案,是以我們可以使用seek()将記錄從一處轉移到另一處,然後讀取或者修改記錄。

檔案中記錄的大小不一定都相同,隻要能夠确定哪些記錄有多大以及它們在檔案中的位置即可。

RandomAccessFile類可以實作對檔案内容的讀寫操作,但是比較複雜。是以一般操作檔案内容往往會使用位元組流或字元流方式。

當用 rw 方式聲明RandomAccessFile對象時,如果要寫入的檔案不存在,系統将自行建立。 

r 為隻讀;w 為隻寫;rw 為讀寫。 

為了保證可以進行随機讀取,所有寫入的名字都是8個位元組,寫入的數字都是固定的4個位元組。

import java.io.RandomAccessFile;

public class RandomAccessFileDemo01 {

      // 所有的異常直接抛出,程式中不再進行處理

      public static void main(String args[]) throws Exception {

           File f = new File("d:" + File.separator + "test.txt"); // 指定要操作的檔案

           RandomAccessFile rdf = null; // 聲明RandomAccessFile類的對象

           rdf = new RandomAccessFile(f, "rw");// 讀寫模式,如果檔案不存在,會自動建立

           String name = null;

           int age = 0;

           name = "zhangsan"; // 字元串長度為8

           age = 30; // 數字的長度為4

           rdf.writeBytes(name); // 将姓名寫入檔案之中

           rdf.writeInt(age); // 将年齡寫入檔案之中

           name = "lisi    "; // 字元串長度為8

           age = 31; // 數字的長度為4

           name = "wangwu  "; // 字元串長度為8

           age = 32; // 數字的長度為4

           rdf.close(); // 關閉

      }

讀取是直接使用 r 的模式即可,以隻讀的方式打開檔案。

讀取時所有的字元串隻能按照byte數組方式讀取出來,而且長度必須和寫入時的固定大小相比對。 

public class RandomAccessFileDemo02{

    // 所有的異常直接抛出,程式中不再進行處理

    public static void main(String args[]) throws Exception{

        File f = new File("d:" + File.separator + "test.txt") ;    // 指定要操作的檔案

        RandomAccessFile rdf = null ;        // 聲明RandomAccessFile類的對象

        rdf = new RandomAccessFile(f,"r") ;// 以隻讀的方式打開檔案

        String name = null ;

        int age = 0 ;

        byte b[] = new byte[8] ;    // 開辟byte數組

        // 讀取第二個人的資訊,意味着要空出第一個人的資訊

        rdf.skipBytes(12) ;        // 跳過第一個人的資訊

        for(int i=0;i&lt;b.length;i++){

            b[i] = rdf.readByte() ;    // 讀取一個位元組

        name = new String(b) ;    // 将讀取出來的byte數組變為字元串

        age = rdf.readInt() ;    // 讀取數字

        System.out.println("第二個人的資訊 --&gt; 姓名:" + name + ";年齡:" + age) ;

        // 讀取第一個人的資訊

        rdf.seek(0) ;    // 指針回到檔案的開頭

        System.out.println("第一個人的資訊 --&gt; 姓名:" + name + ";年齡:" + age) ;

        rdf.skipBytes(12) ;    // 空出第二個人的資訊

        System.out.println("第三個人的資訊 --&gt; 姓名:" + name + ";年齡:" + age) ;

        rdf.close() ;                // 關閉

第二個人的資訊 --&gt; 姓名:lisi    ;年齡:31

第一個人的資訊 --&gt; 姓名:zhangsan;年齡:30

第三個人的資訊 --&gt; 姓名:wangwu  ;年齡:32

 本文轉自靜默虛空部落格園部落格,原文連結:http://www.cnblogs.com/jingmoxukong/p/4513059.html,如需轉載請自行聯系原作者