前面章节提到了JDK7新增的NIO.2的java.nio.file.spi.FileSystemProvider,利用FileSystemProvider我们可以利用支持异步的通道(Channel)模式读取文件内容。
    FileSystemProvider读取文件内容示例:

    1. package com.anbai.sec.filesystem;
    2. import java.io.IOException;
    3. import java.nio.file.Files;
    4. import java.nio.file.Path;
    5. import java.nio.file.Paths;
    6. /**
    7. * Creator: yz
    8. * Date: 2019/12/4
    9. */
    10. public class FilesDemo {
    11. public static void main(String[] args) {
    12. // 通过File对象定义读取的文件路径
    13. // File file = new File("/etc/passwd");
    14. // Path path1 = file.toPath();
    15. // 定义读取的文件路径
    16. Path path = Paths.get("/etc/passwd");
    17. try {
    18. byte[] bytes = Files.readAllBytes(path);
    19. System.out.println(new String(bytes));
    20. } catch (IOException e) {
    21. e.printStackTrace();
    22. }
    23. }
    24. }

    java.nio.file.Files是JDK7开始提供的一个对文件读写取非常便捷的API,其底层实在是调用了java.nio.file.spi.FileSystemProvider来实现对文件的读写的。最为底层的实现类是sun.nio.ch.FileDispatcherImpl#read0

    基于NIO的文件读取逻辑是:打开FileChannel->读取Channel内容。

    打开FileChannel的调用链为:

    1. sun.nio.ch.FileChannelImpl.<init>(FileChannelImpl.java:89)
    2. sun.nio.ch.FileChannelImpl.open(FileChannelImpl.java:105)
    3. sun.nio.fs.UnixChannelFactory.newFileChannel(UnixChannelFactory.java:137)
    4. sun.nio.fs.UnixChannelFactory.newFileChannel(UnixChannelFactory.java:148)
    5. sun.nio.fs.UnixFileSystemProvider.newByteChannel(UnixFileSystemProvider.java:212)
    6. java.nio.file.Files.newByteChannel(Files.java:361)
    7. java.nio.file.Files.newByteChannel(Files.java:407)
    8. java.nio.file.Files.readAllBytes(Files.java:3152)
    9. com.anbai.sec.filesystem.FilesDemo.main(FilesDemo.java:23)

    文件读取的调用链为:

    1. sun.nio.ch.FileChannelImpl.read(FileChannelImpl.java:147)
    2. sun.nio.ch.ChannelInputStream.read(ChannelInputStream.java:65)
    3. sun.nio.ch.ChannelInputStream.read(ChannelInputStream.java:109)
    4. sun.nio.ch.ChannelInputStream.read(ChannelInputStream.java:103)
    5. java.nio.file.Files.read(Files.java:3105)
    6. java.nio.file.Files.readAllBytes(Files.java:3158)
    7. com.anbai.sec.filesystem.FilesDemo.main(FilesDemo.java:23)

    FileSystemProvider写文件示例:

    1. package com.anbai.sec.filesystem;
    2. import java.io.IOException;
    3. import java.nio.file.Files;
    4. import java.nio.file.Path;
    5. import java.nio.file.Paths;
    6. /**
    7. * Creator: yz
    8. * Date: 2019/12/4
    9. */
    10. public class FilesWriteDemo {
    11. public static void main(String[] args) {
    12. // 通过File对象定义读取的文件路径
    13. // File file = new File("/etc/passwd");
    14. // Path path1 = file.toPath();
    15. // 定义读取的文件路径
    16. Path path = Paths.get("/tmp/test.txt");
    17. // 定义待写入文件内容
    18. String content = "Hello World.";
    19. try {
    20. // 写入内容二进制到文件
    21. Files.write(path, content.getBytes());
    22. } catch (IOException e) {
    23. e.printStackTrace();
    24. }
    25. }
    26. }