Java IO/NIO.2文件系統
Java FileSystem
Java IO 文件系統
Java抽象出了一個叫做文件系統的對象:java.io.FileSystem,不同的操作系統有不一樣的文件系統,例如Windows和Unix就是兩種不一樣的文件系統: java.io.UnixFileSystem、java.io.WinNTFileSystem。

java.io.FileSystem是一個抽象類,它抽象了對文件的操作,不同操作系統版本的JDK會實現其抽象的方法從而也就實現了跨平臺的文件的訪問操作。

示例中的java.io.UnixFileSystem最終會通過JNI調用native方法來實現對文件的操作:

由此我們可以得出Java只不過是實現了對文件操作的封裝而已,最終讀寫文件的實現都是通過調用native方法實現的。
不過需要特別注意一下幾點:
- 并不是所有的文件操作都在
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 NIO.2 文件系統
Java 7提出了一個基于NIO的文件系統,這個NIO文件系統和阻塞IO文件系統兩者是完全獨立的。java.nio.file.spi.FileSystemProvider對文件的封裝和java.io.FileSystem同理。

NIO的文件操作在不同的系統的最終實現類也是不一樣的,比如Mac的實現類是: sun.nio.fs.UnixNativeDispatcher,而Windows的實現類是sun.nio.fs.WindowsNativeDispatcher。
合理的利用NIO文件系統這一特性我們可以繞過某些只是防御了java.io.FileSystem的WAF/RASP。
Java Web安全
推薦文章: