File 类是 java.io 包下代表与平台无关的文件和目录, 也就是说, 如果希望在程序中操作文件和目录, 都可以通过 File 类来完成. 值得指出的是, 不管是文件还是目录都是使用 File 来操作的, File 能新建, 删除, 重命名文件和目录, File 不能访问文件内容本身. 如果需要访问文件内容本身, 则需要使用输入 / 输出流.
1, 访问文件和目录
File 类可以使用文件路径字符串来创建 File 实例, 该文件路径字符串既可以是绝对路径, 也可以是相对路径. 在默认情况下, 系统总是依据用户的工作路径来解释相对路径, 这个路径由系统属性 "user.dir" 指定, 通常也就是运行 Java 虚拟机时所在的路径.
一旦创建了 File 对象后, 就可以调用 File 对象的方法来访问, File 类提供了很多方法来操作文件和目录, 下面列出一些比较常用的方法.
1. 访问文件名相关的方法
String getName(): 返回此 File 对象所表示的文件名或路径名(如果是路径, 则返回最后一级子路径名).
String getPath(): 返回此 File 对象所对应的路径名.
File getAbsoluteFile(): 返回此 File 对象的绝对路径.
String getAbsolutePath(): 返回此 File 对象所对应的绝对路径名.
String getParent(): 返回此 File 对象所对应目录 (最后一级子目录) 的父目录名.
boolean renameTo(File newName): 重命名此 File 对象所对应的文件或目录, 如果重命名成功, 则返回 true: 否则返回 false.
2.文件检测相关的方法
boolean exists(): 判断 File 对象所对应的文件或目录是否存在.
boolean canWrite(): 判断 File 对象所对应的文件和目录是否可写.
boolean canRead(): 判断 File 对象所对应的文件和目录是否可读.
boolean isFile(): 判断 File 对象所对应的是否是文件, 而不是目录.
boolean isDirectory(): 判断 File 对象所对应的是否是目录, 而不是文件.
boolean isAbsolute(): 判断 File 对象所对应的文件或目录是否是绝对路径. 该方法消除了不同平台的差异, 可以直接判断 File 对象是否为绝对路径. 在 UNIX/Linux/BSD 等系统上, 如果路径名开头是一条斜线(/), 则表明该 File 对象对应一个绝对路径: 在 Windows 等系统上, 如果路径开头是盘符, 则说明它是一个绝对路径.
3.获取常规文件信息
long lastModified(): 返回文件的最后修改时间.
long length(): 返回文件内容的长度.
4.文件操作相关的方法
boolean createNewFile(): 当此 File 对象所对应的文件不存在时, 该方法将新建一个该 File 对象所指定的新文件, 如果创建成功则返回 true, 否则返回 false.
boolean delete(): 删除 File 对象所对应的文件或路径.
static File createTempFile(String prefix,String suffix): 在默认的临时文件目录中创建一个临时的空文件, 使用给定前缀, 系统生成的随机数和给定后缀作为文件名. 这是一个静态方法, 可以直接通过 File 类来调用. prefix 参数必须至少是 3 字节长. 建议前缀使用一个短的, 有意义的字符串, 比如,"hjb" 或 "mail".suffix 参数可以为 null, 在这种情况下, 将使用默认的后缀 ".tmp".
static File createTempFile(String prefix,String suffix,File directory): 在 directory 所指定的目录中创建一个临时的空文件, 使用给定前缀, 系统生成的随机数和给定后缀作为文件名. 这是一个静态方法, 可以直接通过 File 类来调用.
void deleteOnExit(): 注册一个删除钩子, 指定当 Java 虚拟机退出时, 删除 File 对象所对应的文件和目录.
5. 目录操作相关的方法
boolean mkdir(): 试图创建一个 File 对象所对应的目录, 如果创建成功, 则返回 true; 否则返回 false, 调用该方法时 File 对象必须对应一个路径, 而不是一个文件.
String[] list(): 列出 File 对象的所有子文件名和路径名, 返回 String 数组.
File[] listFiles(): 列出 File 对象的所有了文件和路径, 返回 File 数组.
static File[] listRoots(): 列出系统所有的根路径. 这是一个静态方法, 可以直接通过 File 类来调用.
上面详细列出了 File 类的常用方法, 下面程序以几个简单方法来测试一下 File 类的功能.
- public class FileTest {
- public static void main(String[] args) throws IOException {
- // 以当前路径来创建一个 File 对象
- File file = new File(".");
- // 直接获取文件名, 输出一点
- System.out.println(file.getName());
- // 获取相对路径的父路径可能出错, 下面代码输出 null
- System.out.println(file.getParent());
- // 获取绝对路径
- System.out.println(file.getAbsoluteFile());
- // 获取上一级路径
- System.out.println(file.getAbsoluteFile().getParent());
- // 在当前路径下创建一个临时文件
- File tmpFile = File.createTempFile("aaa", ".txt", file);
- // 指定当 JVM 退出时删除该文件
- tmpFile.deleteOnExit();
- // 以系统当前时间作为新文件名来创建新文件
- File newFile = new File(System.currentTimeMillis() + "");
- System.out.println("newFile 对象是否存在:" + newFile.exists());
- // 以指定 newFile 对象来创建一个文件
- newFile.createNewFile();
- // 以 newFile 对象来创建一个目录, 因为 newFile 已经存在,
- // 所以下面方法返回 false, 即无法创建该目录
- newFile.mkdir();
- // 使用 list()方法来列出当前路径下的所有文件和路径
- String[] fileList = file.list();
- System.out.println("==== 当前路径下所有文件和路径如下 ====");
- for (String fileName : fileList) {
- System.out.println(fileName);
- }
- // listRoots()静态方法列出所有的磁盘根路径.
- File[] roots = File.listRoots();
- System.out.println("==== 系统所有根路径如下 ====");
- for (File root : roots) {
- System.out.println(root);
- }
- }
- }
运行上面程序, 可以看到程序列出当前路径的所有文件和路径时, 列出了程序创建的临时文件, 但程序运行结束后, aaa.txt 临时文件并不存在, 因为程序指定虚拟机退出时自动删除该文件.
上面程序还有一点需要注意, 当使用相对路径的 File 对象来获取父路径时可能引起错误, 因为该方法返回将 File 对象所对应的目录名, 文件名里最后一个子目录名, 子文件名删除后的结果, 如上面程序中的粗体字代码所示.
注意: Windows 的路径分隔符使用反斜线 (\), 而 Java 程序中的反斜线表示转义字符, 所以如果需要在 Windows 的路径下包括反斜线, 则应该使用两条反斜线, 如 F:\\abc\\test.txt, 或者直接使用(/) 也可以, Java 程序支持将斜线当成平台无关的路径分隔符.
2, 文件过滤器
在 File 类的 list() 方法中可以接收一个参数, 通过该参数可以只列出符合条件的文件.
FilenameFilter 接口里包含了一个 accept(File dir,String name)方法, 该方法将依次对指定 File 的所有子目录或者文件进行迭代, 如果该方法返回 true, 则 list() 方法会列出该子目录或者文件.
- public class FilenameFilterTest {
- public static void main(String[] args) {
- File file = new File(".");
- // 使用 Lambda 表达式 (目标类型为 FilenameFilter) 实现文件过滤器.
- // 如果文件名以. java 结尾, 或者文件对应一个路径, 返回 true
- String[] nameList = file.list((dir, name) -> name.endsWith(".java") || new File(name).isDirectory());
- for (String name : nameList) {
- System.out.println(name);
- }
- }
- }
上面程序中的粗体字代码部分实现了 accept() 方法, 实现 accept() 方法就是指定自己的规则, 指定哪些文件应该由 list() 方法列出.
运行上面程序, 将看到当前路径下所有的 *.java 文件以及文件夹被列出.
提示: FilenameFilter 接口内只有一个抽象方法, 因此该接口也是一个函数式接口, 可使用 Lambda 表达式创建实现该接口的对象.
来源: http://www.bubuko.com/infodetail-3428585.html