352. Java IO API - Java 文件操作:java.io.File 与 java.nio.file 功能对比 - 4

352. Java IO API - 逐步迁移到 java.nio.file API - 4

如果望充分利用 java.nio.file 包提供的强大功能,可以通过 File.toPath() 方法将旧代码逐步迁移到新的 Path 接口。但如果不想使用这种方法,或者需要对文件 I/O 代码进行重写,将不得不重构代码以完全使用新的 Path API。

Java 文件操作:java.io.File 与 java.nio.file 功能对比

在 Java 编程里,文件操作是一项常见的任务。Java 提供了两个主要的文件操作 API:java.io.File 和 java.nio.file。前者是 Java 早期就有的 API,而后者是 Java 7 引入的新 API,具备更强大的功能和更好的性能。接下来,我们会对这两个 API 的功能进行对比,同时给出示例代码辅助理解。

16. 目录内容列出
  • java.io.File :使用 File.list() 和 File.listFiles() 方法来列出目录的内容。
  • java.nio.file.Files :使用 Files.newDirectoryStream() 方法来列出目录的内容。

示例代码:

java 复制代码
import java.io.File;
import java.io.IOException;
import java.nio.file.DirectoryStream;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;

public class DirectoryListingExample {
    public static void main(String[] args) throws IOException {
        // 使用 java.io.File
        File directory = new File(".");
        String[] files = directory.list();
        for (String file : files) {
            System.out.println("java.io.File - File: " + file);
        }

        // 使用 java.nio.file.Files
        Path path = Paths.get(".");
        DirectoryStream<Path> stream = Files.newDirectoryStream(path);
        for (Path p : stream) {
            System.out.println("java.nio.file.Files - File: " + p);
        }
        stream.close();
    }
}
17. 目录创建
  • java.io.File :使用 File.mkdir() 和 File.mkdirs() 方法来创建目录。
  • java.nio.file.Files :使用 Files.createDirectory(Path,FileAttribute) 方法来创建目录。

示例代码:

java 复制代码
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.attribute.FileAttribute;
import java.nio.file.attribute.PosixFilePermissions;
import java.util.Set;

public class DirectoryCreationExample {
    public static void main(String[] args) throws IOException {
        // 使用 java.io.File
        File directory = new File("new_directory");
        boolean created = directory.mkdir();
        System.out.println("java.io.File - Directory created: " + created);

        // 使用 java.nio.file.Files
        Path path = Paths.get("new_directory_2");
        Set<java.nio.file.attribute.PosixFilePermission> perms = PosixFilePermissions.fromString("rwxr--r--");
        FileAttribute<Set<java.nio.file.attribute.PosixFilePermission>> attr = PosixFilePermissions.asFileAttribute(perms);
        Files.createDirectory(path, attr);
        System.out.println("java.nio.file.Files - Directory created");
    }
}
18. 文件系统根目录列出
  • java.io.File :使用 File.listRoots() 方法来列出文件系统的根目录。
  • java.nio.file.FileSystem :使用 FileSystem.getRootDirectories() 方法来列出文件系统的根目录。

示例代码:

java 复制代码
import java.io.File;
import java.nio.file.FileSystems;
import java.nio.file.Path;
import java.util.Iterator;

public class RootDirectoriesExample {
    public static void main(String[] args) {
        // 使用 java.io.File
        File[] roots = File.listRoots();
        for (File root : roots) {
            System.out.println("java.io.File - Root: " + root);
        }

        // 使用 java.nio.file.FileSystem
        Iterable<Path> rootDirectories = FileSystems.getDefault().getRootDirectories();
        Iterator<Path> iterator = rootDirectories.iterator();
        while (iterator.hasNext()) {
            System.out.println("java.nio.file.FileSystem - Root: " + iterator.next());
        }
    }
}
19. 文件存储属性获取
  • java.io.File :使用 File.getTotalSpace()、File.getFreeSpace() 和 File.getUsableSpace() 方法来获取文件存储的总空间、空闲空间和可用空间。
  • java.nio.file.FileStore :使用 FileStore.getTotalSpace()、FileStore.getUnallocatedSpace() 和 FileStore.getUsableSpace() 方法来获取文件存储的总空间、未分配空间和可用空间。

示例代码:

java 复制代码
import java.io.File;
import java.io.IOException;
import java.nio.file.FileStore;
import java.nio.file.FileSystems;
import java.nio.file.Path;

public class FileStoreAttributesExample {
    public static void main(String[] args) throws IOException {
        // 使用 java.io.File
        File file = new File(".");
        System.out.println("java.io.File - Total Space: " + file.getTotalSpace());
        System.out.println("java.io.File - Free Space: " + file.getFreeSpace());
        System.out.println("java.io.File - Usable Space: " + file.getUsableSpace());

        // 使用 java.nio.file.FileStore
        Path path = FileSystems.getDefault().getPath(".");
        FileStore store = java.nio.file.Files.getFileStore(path);
        System.out.println("java.nio.file.FileStore - Total Space: " + store.getTotalSpace());
        System.out.println("java.nio.file.FileStore - Unallocated Space: " + store.getUnallocatedSpace());
        System.out.println("java.nio.file.FileStore - Usable Space: " + store.getUsableSpace());
    }
}

总结

java.nio.file 包是 Java 7 引入的新文件操作 API,相较于 java.io.File 具有更强大的功能和更好的性能。在实际开发中,建议优先使用 java.nio.file 包进行文件操作。

相关推荐
迅猛龙办公室2 小时前
python实现倒序输出数字
开发语言·python
代码什么用9 小时前
Spring基础使用
java·后端·spring
Su米苏10 小时前
Spring AI 中MCP 与普通 @Tool的区别
java·人工智能·spring
码云数智-园园10 小时前
unique_ptr 还是 shared_ptr?C++ 智能指针选型与内存泄漏实战分析
java·开发语言
老板一杯拿铁10 小时前
Java 异常体系详解:从字节码原理到最佳实践
java
蜗牛互联网10 小时前
Java 17 HttpClient调用文件转写API的超时与失败回退
java·人工智能·后端
禾小西11 小时前
07丨Redis 哨兵机制:主库故障后,如何恢复服务?
java·开发语言·redis
我不是阵雨11 小时前
JDK 21虚拟线程Pinning陷阱:一文拔钉解困
java·开发语言
全栈练习生11 小时前
AI Agent 沙箱
python·ai
小卡车55511 小时前
java反射、自定义注解的应用(自定义分页)
java