Java 文件操作

2018-04-17 17:53 更新

Java IO教程 - Java文件操作

文件創(chuàng)建

我們可以使用File類的createNewFile()方法創(chuàng)建一個(gè)新文件:

File dummyFile = new File("test.txt");
boolean fileCreated  = dummyFile.createNewFile();

該createNewFile()方法創(chuàng)建一個(gè)新的空文件,如果有指定名稱的文件不存在。

如果文件已成功創(chuàng)建,則返回true;否則,返回false。如果發(fā)生I/O錯(cuò)誤,該方法將拋出IOException。

我們還可以在默認(rèn)的臨時(shí)文件目錄或目錄中創(chuàng)建一個(gè)臨時(shí)文件。要在默認(rèn)臨時(shí)目錄中創(chuàng)建臨時(shí)文件,請使用File類的createTempFile()靜態(tài)方法,該方法接受前綴和后綴以生成臨時(shí)文件名。

File  tempFile = File.createTempFile("abc", ".txt");

文件夾創(chuàng)建

我們可以使用mkdir()或mkdirs()方法創(chuàng)建一個(gè)新目錄。

僅當(dāng)路徑名中指定的父目錄已存在時(shí),mkdir()方法才創(chuàng)建目錄。

File newDir  = new File("C:\\users\\home");

只有當(dāng)C:\users目錄已經(jīng)存在時(shí),newDir.mkdir()方法才會(huì)創(chuàng)建主目錄。

newDir.mkdirs()方法將創(chuàng)建users目錄(如果它不存在于C:驅(qū)動(dòng)器中),它將在C:\users目錄下創(chuàng)建主目錄。

文件刪除

我們需要使用File類的delete()方法來刪除文件/目錄。

目錄必須為空,我們才能刪除它。

如果文件/目錄被刪除,該方法返回true; 否則,返回false。

我們還可以延遲刪除文件,直到JVM通過使用deleteOnExit()方法終止。

如果我們在程序中創(chuàng)建臨時(shí)文件,當(dāng)程序退出時(shí)要?jiǎng)h除,這將非常有用。

立即刪除dummy.txt文件

File dummyFile = new File("dummy.txt"); 
dummyFile.delete();

在JVM終止時(shí)刪除dummy.txt文件

File dummyFile = new File("dummy.txt"); 
dummyFile.deleteOnExit();

文件重命名

要重命名文件,我們可以使用renameTo()方法,它使用一個(gè)File對象來表示新文件:

boolean fileRenamed = oldFile.renameTo(newFile);

完整的源代碼

import java.io.File;

public class Main {
  public static void main(String[] argv) {
    // Rename old-dummy.txt to new_dummy.txt
    File oldFile = new File("old_dummy.txt");
    File newFile = new File("new_dummy.txt");

    boolean fileRenamed = oldFile.renameTo(newFile);
    if (fileRenamed) {
      System.out.println(oldFile + "  renamed  to " + newFile);
    } else {
      System.out.println("Renaming " + oldFile + "  to " + newFile
          + "  failed.");
    }

  }
}

如果文件的重命名成功,renameTo()方法返回true;否則,返回false。

我們需要檢查返回值,以確保重命名成功。

上面的代碼生成以下結(jié)果。

例子

File對象是不可變的。創(chuàng)建后,它始終表示相同的路徑名。當(dāng)我們重命名文件時(shí),舊的File對象仍然代表原始的路徑名。

File對象表示路徑名,而不是文件系統(tǒng)中的實(shí)際文件。

以下代碼顯示了如何進(jìn)行文件創(chuàng)建,刪除和重命名。

import java.io.File;

public class Main {
  public static void main(String[] args) throws Exception {
    File newFile = new File("my_new_file.txt");
    printFileDetails(newFile);

    // Create a new file
    boolean fileCreated = newFile.createNewFile();
    if (!fileCreated) {
      System.out.println(newFile + "  could   not  be  created.");
    }
    printFileDetails(newFile);

    // Delete the new file
    newFile.delete();

    System.out.println("After deleting the new file:");
    printFileDetails(newFile);

    // recreate the file
    newFile.createNewFile();

    printFileDetails(newFile);

    // Let"s tell the JVM to delete this file on exit
    newFile.deleteOnExit();

    System.out.println("After  using deleteOnExit() method:");
    printFileDetails(newFile);

    // Create a new file and rename it
    File firstFile = new File("my_first_file.txt");
    File secondFile = new File("my_second_file.txt");

    fileCreated = firstFile.createNewFile();
    if (fileCreated || firstFile.exists()) {
      printFileDetails(firstFile);
      printFileDetails(secondFile);

      boolean renamedFlag = firstFile.renameTo(secondFile);
      if (!renamedFlag) {
        System.out.println("Could not  rename  " + firstFile);
      }
      printFileDetails(firstFile);
      printFileDetails(secondFile);
    }
  }
  public static void printFileDetails(File f) {
    System.out.println("Absolute Path: " + f.getAbsoluteFile());
    System.out.println("File exists:  " + f.exists());
  }
}

上面的代碼生成以下結(jié)果。


文件屬性

File類包含讓我們獲取/設(shè)置文件和目錄的屬性的方法。

我們可以設(shè)置分別使用setReadOnly(),setReadable(),setWritable()和setExecutable()方法將文件設(shè)置為只讀,可讀,可寫和可執(zhí)行。

我們可以使用lastModified()和setLastModified()方法來獲取和設(shè)置文件的最后修改日期和時(shí)間。

我們可以使用isHidden()方法檢查文件是否被隱藏。

文件大小

我們可以使用File類的length()方法獲取文件的大小(以字節(jié)為單位)。

File myFile  = new File("myfile.txt");
long  fileLength = myFile.length();

如果File對象表示不存在的文件,則length()方法返回零。

length()方法的返回類型是long,而不是int。

列出文件和目錄

我們可以使用File類的listRoots()靜態(tài)方法獲取文件系統(tǒng)中可用根目錄的列表。 它返回一個(gè)File對象數(shù)組。

File[] roots = File.listRoots();

以下代碼顯示如何列出所有可用的根目錄。

import java.io.File;

public class Main {
  public static void main(String[] args) {
    File[] roots = File.listRoots();
    System.out.println("List  of  root directories:");
    for (File f : roots) {
      System.out.println(f.getPath());
    }
  }
}

我們可以使用File類的list()或listFiles()方法列出目錄中的所有文件和目錄。

list()方法返回一個(gè)String數(shù)組,而listFiles()方法返回一個(gè)File數(shù)組。

我們還可以使用這些方法的文件過濾器從返回的結(jié)果中排除一些文件和目錄。

以下代碼顯示如何列出目錄中的所有文件和目錄。

import java.io.File;

public class Main {
  public static void main(String[] args) {
    // Change the dirPath value to list files from your directory
    String dirPath = "C:\\";

    File dir = new File(dirPath);
    File[] list = dir.listFiles();

    for (File f : list) {
      if (f.isFile()) {
        System.out.println(f.getPath() + "  (File)");
      } else if (f.isDirectory()) {
        System.out.println(f.getPath() + "  (Directory)");
      }
    }
  }
}

上面的代碼生成以下結(jié)果。


文件過濾器

要從列表中排除擴(kuò)展名為.SYS的所有文件,我們可以使用由功能接口FileFilter的實(shí)例表示的文件過濾器來實(shí)現(xiàn)。

它包含一個(gè)accept()方法,它將File作為參數(shù)列出,如果應(yīng)該列出文件,則返回true。返回false不會(huì)列出文件。

以下代碼創(chuàng)建一個(gè)文件過濾器,將過濾擴(kuò)展名為.SYS的文件。

FileFilter filter = file ->  {
    if (file.isFile()) {
        String fileName   = file.getName().toLowerCase();
        if (fileName.endsWith(".sys"))  {
            return false;
        }
    }
    return true;
};

以下代碼創(chuàng)建兩個(gè)文件過濾器 - 一個(gè)僅過濾文件,另一個(gè)僅過濾目錄:

// Filters only  files
FileFilter fileOnlyFilter = File::isFile;

// Filters only  directories
FileFilter  dirOnlyFilter = File::isDirectory;

以下代碼顯示如何使用FileFilter過濾文件。

import java.io.File;
import java.io.FileFilter;

public class Main {
  public static void main(String[] args) {
    String dirPath = "C:\\";
    File dir = new File(dirPath);

    // Create a file filter to exclude any .SYS file
    FileFilter filter = file -> {
      if (file.isFile()) {
        String fileName = file.getName().toLowerCase();
        if (fileName.endsWith(".sys")) {
          return false;
        }
      }
      return true;
    };

    File[] list = dir.listFiles(filter);

    for (File f : list) {
      if (f.isFile()) {
        System.out.println(f.getPath() + "  (File)");
      } else if (f.isDirectory()) {
        System.out.println(f.getPath() + "  (Directory)");
      }
    }
  }
}

上面的代碼生成以下結(jié)果。

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)