Java 文件读写可以分为 阻塞模式IO 和 非阻塞模式 NIO
java.io.FileSystem 属于 阻塞模式
文件读取代码示范:
import java.io.*;
public class Java_io_demo {
public static void main(String[] args) throws IOException {
File file = new File("C:\\Users\\XXX\\Desktop\\demo.txt");
// 打开文件对象、创建文件输入流
FileInputStream fis = new FileInputStream(file);
// 每次输入流读取到的字节数对象
int n = 0;
byte[] bytes = new byte[512];
// 创建二进制输出流对象
ByteArrayOutputStream out = new ByteArrayOutputStream();
// 循环读取内容
while ((n = fis.read(bytes)) != -1) {
out.write(bytes, 0, n);
}
System.out.println(out.toString());
}
}
其中FileInputStream的read方法调用了 readBytes方法。readBytes属于Java Native方法。
private native int readBytes(byte b[], int off, int len) throws IOException;
调用链:
main() ---> read() ---> readBytes()
Native方法本质上是 一种在Java源码中声明,但实现使用C\C++的一类方法。 用于操作系统交互、访问底层硬件等…
例如readBytes方法的具体实现在 /native/libjava/FileInputStream.c
中。
https://github.com/unofficial-openjdk/openjdk/blob/jdk/jdk/src/java.base/share/native/libjava/FileInputStream.c
任意文件读取类
java.io.RandomAccessFile
可以获取文件指针、文件偏移量等。可理解为对内容的精细操作。
FileSystemProvider
利用支持异步的通道(Channel)模式读取文件内容
从JDK7开始提供,快捷文件读写操作。
示范代码:
public static void main(String[] args) {
Path path = Paths.get("C:\\Users\\xxx\\Desktop\\demo.txt");
try {
byte[] bytes = Files.readAllBytes(path);
System.out.println(new String(bytes));
} catch (IOException e) {
e.printStackTrace();
}
}
安全问题1:
Java文件名空字节截断漏洞。
来源:Java语言使用C实现的功能时导致的漏洞,Java SE 7 update 40之前。
用途:文件上传、正则匹配、文件路径获取等场景…