在Java SE中内置了两个文件系统:java.iojava.niojava.nio的实现是sun.nio,文件系统底层的API实现,如下图: Java FileSystem - 图1

Java io 文件系统

Java抽象出来一个叫文件系统的对象:java.io.FileSystem,不同的操作系统有不一样的文件系统, 例如WindowsUnix就是两种不一样的文件系统: java.io.UnixFileSystemjava.io.WinNTFileSystem
Java FileSystem - 图2
java.io.fileSystem是一个抽象类,它抽象了对文件的操作,不同的操作系统版本的JDK会实现其抽象的方法从而也就实现了跨平台的文件的访问操作。
Java FileSystem - 图3
示例中的java.io.UnixFileSystem 最终会通过JNI调用native方法来实现对文件的操作:
Java FileSystem - 图4
由此可以得出Java只不过是实现了对文件操作的封装而已,最终读写文件的实现都是通过调用native方法实现的。
注意:

  1. 并不是所有文件操作都在java.io.FileSystem中定义,文件的读取最终调用的是java.io.FileInputStram#read0、readBytesjava.io.RandomAccessFile#read0、readBytes,而写文件调用的是java.io.FileOutputstream#writeBytesjava.io.RandomAccesFile#write0
  2. Java有两类文件系统API!,一个是基于阻塞模式的IO的文件系统,另一个是JDK7+基于NIO.2的文件系统。

    Java NIO.2 文件系统

    Java 7提出了一个基于NIO的文件系统,这个NIO文件系统和阻塞IO文件系统两者是完全独立的。java.nio.file.spi.FileSystemprovider对文件的封装和java.io.FileSystem同理。
    Java FileSystem - 图5
    NIO的文件操作在不同的系统的最终实现类也是不一样的,比如Mac的实现类时:sun.nio.fs.UnixNativeDispatcher,而Windows的实现类是sun.nio.sf.WindowsNativeDispatcher

合理的利用NIO文件系统这一特性我们可以绕过某些值防御了java.io.FileSystemWAF/RASP