Java IO API 中的 Java File 类(java.io.File)可让你访问底层文件系统。使用 Java File 类,你可以
检查文件或目录是否存在。
创建不存在的目录。
读取文件的长度。
重命名或移动文件。
删除文件。
检查路径是文件还是目录。
读取目录中的文件列表。
本 Java 文件教程将告诉你更多相关信息。
注意:
(1)Java File 类仅允许你访问文件和目录元数据。如果需要读取或写入文件内容,应使用 FileInputStream、FileOutputStream 或 RandomAccessFile。
(2)如果要使用 Java NIO(Java 的非阻塞 IO API),则必须使用 java.nio.FileChannel 类。Java File 和 FileChannel 均可使用,但如果你想要纯 Java NIO 解决方案,请使用 Java NIO FileChannel 类。
在使用文件系统或 File 类做任何事情之前,必须先创建一个 Java File 实例。下面是创建 Java File 实例的示例:
File file = new File("c:\\data\\input-file.txt");
Java File 构造函数的参数是你希望 File 实例指向的文件在底层文件系统中的文件路径。请注意,文件或目录路径实际上不必引用现有的文件或目录。如果不是,你就不会从文件构造函数中获得异常。当我们要检查文件是否存在或创建新文件时,这种行为非常有用。
Java File 类还有其他一些构造函数,你可以用它们以不同的方式实例化 File 实例。
你可以使用 File exists() 方法检查 Java File 对象引用的文件是否存在。下面是一个检查文件是否存在的示例:
File file = new File("c:\\data\\input-file.txt"); boolean fileExists = file.exists();
上述代码同样适用于目录。检查目录是否存在所需的唯一改动是向 Java File 构造函数传递指向目录的文件系统路径,而不是指向文件的路径。下面是一个检查目录是否存在的示例:
File file = new File("c:\\data"); boolean fileExists = file.exists();
如果目录还不存在,你可以使用 Java File 类创建目录。为此,文件类包含 mkdir() 和 mkdirs() 方法。
mkdir() 方法会创建一个尚未存在的单一目录。下面是一个通过 Java File 类创建单个目录的示例:
File file = new File("c:\\users\\jakobjenkov\\newdir"); boolean dirCreated = file.mkdir();
如果 c:\users\jakobjenkov 目录已经存在,上述代码将为 jakobjenkov 创建一个名为 newdir 的子目录。如果目录已创建,mkdir() 返回 true;如果未创建,则返回 false。
mkdirs() 将创建文件对象所代表路径中缺少的所有目录。下面是一个通过 Java File 类创建多个目录的示例:
File file = new File("c:\\users\\jakobjenkov\\newdir"); boolean dirCreated = file.mkdirs();
如果 C 盘存在,本例将创建 c:\users\jakobjenkov\newdir 路径下的所有目录。如果所有目录都已创建,mkdirs() 方法将返回 true,否则返回 false。
通过 Java File 类,你可以读取文件的字节长度。要读取文件长度,请调用 File length() 方法。下面是一个通过 Java File length() 方法读取文件长度的示例:
File file = new File("c:\\data\\input-file.txt"); long length = file.length();
要重命名(或移动)文件,请调用文件类的 renameTo() 方法。下面是一个简单的例子:
File file = new File("c:\\data\\input-file.txt"); boolean success = file.renameTo(new File("c:\\data\\new-file.txt"));
如前文所述,renameTo() 方法还可用于将文件移动到不同的目录。传递给 renameTo() 方法的新文件名不必与文件所在目录相同。
renameTo() 方法返回布尔值(true 或 false),表示重命名是否成功。移动文件的重命名可能会因各种原因而失败,如文件已打开、文件权限错误等。
顺便说一下,Java File renameTo() 方法也适用于目录。只需向 File 构造函数传递目录路径,而不是文件路径即可。
要删除文件,请调用 Java File delete() 方法。下面是一个简单的示例:
File file = new File("c:\\data\\input-file.txt"); boolean success = file.delete();
delete() 方法返回布尔值(true 或 false),表示删除是否成功。删除文件可能会因为各种原因而失败,如文件处于打开状态、文件权限错误等。
Java 文件 delete() 方法也适用于目录,这意味着你也可以使用该方法删除目录。
Java 文件 delete() 方法只能在目录为空的情况下删除目录。要删除包含文件和子目录的目录,必须先遍历该目录并删除所有文件和子目录,然后才能删除根目录。这种遍历必须递归进行,因此还必须删除子目录及其子目录的所有内容。否则根目录的删除将失败。下面是一个可以递归删除一个目录及其所有子目录和文件的 Java 方法:
public static boolean deleteDir(File dir){ File[] files = dir.listFiles(); if(files != null){ for(File file : files){ if(file.isDirectory()){ deleteDir(file); } else { file.delete(); } } } return dir.delete(); }
正如本 Java 文件教程前面多次提到的,File 对象既可以指向文件,也可以指向目录。你可以通过调用 File 对象的 isDirectory() 方法来检查 File 对象指向的是文件还是目录。如果 File 指向目录,该方法返回 true;如果 File 指向文件,该方法返回 false。下面是一个简单的示例:
File file = new File("c:\\data"); boolean isDirectory = file.isDirectory();
你可以通过调用 Java File list() 方法或 listFiles() 方法来获取目录中所有文件的列表。list() 方法返回一个字符串数组,其中包含文件对象指向的目录的文件名和/或目录名。listFiles()方法返回一个 File 对象数组,表示 File 指向的目录中的文件和/或目录。
下面是一个通过 Java File list() 和 listFiles() 方法列出目录中所有文件的示例:
File file = new File("c:\\data"); String[] fileNames = file.list(); File[] files = file.listFiles();