FileSystem
Java SE中内置了两类文件系统:java.io
和java.nio
,java.nio
的实现是sun.nio
IO
Java抽象出了一个叫做文件系统的对象:java.io.FileSystem
,不同的操作系统有不一样的文件系统,例如Windows
和Unix
就是两种不一样的文件系统: java.io.UnixFileSystem
、java.io.WinNTFileSystem
java.io.FileSystem
是一个抽象类,它抽象了对文件的操作,不同操作系统版本的JDK会实现其抽象的方法从而也就实现了跨平台的文件的访问操作。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wY5wZH3X-1638371465939)(images/9.png)]
Java是实现了对文件操作的封装而已,最终读写文件的实现都是通过调用native方法(java调用非java代码的接口如C)实现的。
注意:
- 并不是所有的文件操作都在
java.io.FileSystem
中定义,文件的读取最终调用的是java.io.FileInputStream#read0、readBytes
、java.io.RandomAccessFile#read0、readBytes
,而写文件调用的是java.io.FileOutputStream#writeBytes
、java.io.RandomAccessFile#write0
。 - Java有两类文件系统API!一个是基于阻塞模式的IO的文件系统,另一是JDK7+基于
NIO.2
的文件系统。
Java三种IO方式(看点轻松的)
NIO
Java 7提出了一个基于NIO的文件系统,这个NIO文件系统和阻塞IO文件系统两者是完全独立的。NIO的文件操作在不同的系统的最终实现类也是不一样的,比如Mac的实现类是: sun.nio.fs.UnixNativeDispatcher
,而Windows的实现类是sun.nio.fs.WindowsNativeDispatcher
。
java文件读写
我们通常读写文件都是使用的阻塞模式,与之对应的也就是java.io.FileSystem
。java.io.FileInputStream
类提供了对文件的读取功能
FileInputStream
FileOutputStream
RandomAccessFile
java.io.RandomAccessFile
这个类名字面意思是任意文件内容访问,特别之处是这个类不仅可以像java.io.FileInputStream
一样读取文件,而且还可以写文件
RandomAccessFile简介与使用(要点:可读可写,可指定位置读写)
FileSystemProvider
java.nio.file.spi.FileSystemProvider
,利用FileSystemProvider
我们可以利用支持异步的通道(Channel
)模式读取文件内容。
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
public class FilesDemo {
public static void main(String[] args) {
// 定义读取的文件路径
Path path = Paths.get("/etc/passwd");
try {
byte[] bytes = Files.readAllBytes(path);
System.out.println(new String(bytes));
} catch (IOException e) {
e.printStackTrace();
}
// 定义写入的文件路径
Path path = Paths.get("/tmp/test.txt");
// 定义待写入文件内容
String content = "Hello World.";
try {
// 写入内容二进制到文件
Files.write(path, content.getBytes());
} catch (IOException e) {
e.printStackTrace();
}
}
}
java.nio.file.Files
其底层实在是调用了java.nio.file.spi.FileSystemProvider
来实现对文件的读写的