Java 文件操作

Java IO教程 - Java文件操作

文件创建

我们可以使用File类的createNewFile()方法创建一个新文件:

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

该createNewFile()方法创建一个新的空文件,如果有指定名称的文件不存在。

如果文件已成功创建,则返回true;否则,返回false。如果发生I/O错误,该方法将抛出IOException。

我们还可以在默认的临时文件目录或目录中创建一个临时文件。要在默认临时目录中创建临时文件,请使用File类的createTempFile()静态方法,该方法接受前缀和后缀以生成临时文件名。

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

文件夹创建

我们可以使用mkdir()或mkdirs()方法创建一个新目录。

仅当路径名中指定的父目录已存在时,mkdir()方法才创建目录。

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

只有当C:\users目录已经存在时,newDir.mkdir()方法才会创建主目录。

newDir.mkdirs()方法将创建users目录(如果它不存在于C:驱动器中),它将在C:\users目录下创建主目录。

文件删除

我们需要使用File类的delete()方法来删除文件/目录。

目录必须为空,我们才能删除它。

如果文件/目录被删除,该方法返回true; 否则,返回false。

我们还可以延迟删除文件,直到JVM通过使用deleteOnExit()方法终止。

如果我们在程序中创建临时文件,当程序退出时要删除,这将非常有用。

立即删除dummy.txt文件

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

在JVM终止时删除dummy.txt文件

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

文件重命名

要重命名文件,我们可以使用renameTo()方法,它使用一个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。

我们需要检查返回值,以确保重命名成功。

上面的代码生成以下结果。

例子

File对象是不可变的。创建后,它始终表示相同的路径名。当我们重命名文件时,旧的File对象仍然代表原始的路径名。

File对象表示路径名,而不是文件系统中的实际文件。

以下代码显示了如何进行文件创建,删除和重命名。

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());
  }
}

上面的代码生成以下结果。


文件属性

File类包含让我们获取/设置文件和目录的属性的方法。

我们可以设置分别使用setReadOnly(),setReadable(),setWritable()和setExecutable()方法将文件设置为只读,可读,可写和可执行。

我们可以使用lastModified()和setLastModified()方法来获取和设置文件的最后修改日期和时间。

我们可以使用isHidden()方法检查文件是否被隐藏。

文件大小

我们可以使用File类的length()方法获取文件的大小(以字节为单位)。

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

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

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

列出文件和目录

我们可以使用File类的listRoots()静态方法获取文件系统中可用根目录的列表。 它返回一个File对象数组。

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()方法返回一个String数组,而listFiles()方法返回一个File数组。

我们还可以使用这些方法的文件过滤器从返回的结果中排除一些文件和目录。

以下代码显示如何列出目录中的所有文件和目录。

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)");
      }
    }
  }
}

上面的代码生成以下结果。


文件过滤器

要从列表中排除扩展名为.SYS的所有文件,我们可以使用由功能接口FileFilter的实例表示的文件过滤器来实现。

它包含一个accept()方法,它将File作为参数列出,如果应该列出文件,则返回true。返回false不会列出文件。

以下代码创建一个文件过滤器,将过滤扩展名为.SYS的文件。

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

以下代码创建两个文件过滤器 - 一个仅过滤文件,另一个仅过滤目录:

// 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)");
      }
    }
  }
}

上面的代码生成以下结果。