前面章节提到了JDK7新增的NIO.2的java.nio.file.spi.FileSystemProvider,利用FileSystemProvider我们可以利用支持异步的通道(Channel)模式读取文件内容。
FileSystemProvider读取文件内容示例:
package com.anbai.sec.filesystem;import java.io.IOException;import java.nio.file.Files;import java.nio.file.Path;import java.nio.file.Paths;/*** Creator: yz* Date: 2019/12/4*/public class FilesDemo {public static void main(String[] args) {// 通过File对象定义读取的文件路径// File file = new File("/etc/passwd");// Path path1 = file.toPath();// 定义读取的文件路径Path path = Paths.get("/etc/passwd");try {byte[] bytes = Files.readAllBytes(path);System.out.println(new String(bytes));} catch (IOException e) {e.printStackTrace();}}}
java.nio.file.Files是JDK7开始提供的一个对文件读写取非常便捷的API,其底层实在是调用了java.nio.file.spi.FileSystemProvider来实现对文件的读写的。最为底层的实现类是sun.nio.ch.FileDispatcherImpl#read0。
基于NIO的文件读取逻辑是:打开FileChannel->读取Channel内容。
打开FileChannel的调用链为:
sun.nio.ch.FileChannelImpl.<init>(FileChannelImpl.java:89)sun.nio.ch.FileChannelImpl.open(FileChannelImpl.java:105)sun.nio.fs.UnixChannelFactory.newFileChannel(UnixChannelFactory.java:137)sun.nio.fs.UnixChannelFactory.newFileChannel(UnixChannelFactory.java:148)sun.nio.fs.UnixFileSystemProvider.newByteChannel(UnixFileSystemProvider.java:212)java.nio.file.Files.newByteChannel(Files.java:361)java.nio.file.Files.newByteChannel(Files.java:407)java.nio.file.Files.readAllBytes(Files.java:3152)com.anbai.sec.filesystem.FilesDemo.main(FilesDemo.java:23)
文件读取的调用链为:
sun.nio.ch.FileChannelImpl.read(FileChannelImpl.java:147)sun.nio.ch.ChannelInputStream.read(ChannelInputStream.java:65)sun.nio.ch.ChannelInputStream.read(ChannelInputStream.java:109)sun.nio.ch.ChannelInputStream.read(ChannelInputStream.java:103)java.nio.file.Files.read(Files.java:3105)java.nio.file.Files.readAllBytes(Files.java:3158)com.anbai.sec.filesystem.FilesDemo.main(FilesDemo.java:23)
FileSystemProvider写文件示例:
package com.anbai.sec.filesystem;import java.io.IOException;import java.nio.file.Files;import java.nio.file.Path;import java.nio.file.Paths;/*** Creator: yz* Date: 2019/12/4*/public class FilesWriteDemo {public static void main(String[] args) {// 通过File对象定义读取的文件路径// File file = new File("/etc/passwd");// Path path1 = file.toPath();// 定义读取的文件路径Path path = Paths.get("/tmp/test.txt");// 定义待写入文件内容String content = "Hello World.";try {// 写入内容二进制到文件Files.write(path, content.getBytes());} catch (IOException e) {e.printStackTrace();}}}
