这是一道阿里p6面试题,给出如下几行代码,描述下IO读出一个字符到控制台全过程。
public class FileIO {
public static void main(String[] args) throws IOException {
File file = new File("C:\\Users\\User\\Desktop\\hello.txt");
FileInputStream fileInputStream = new FileInputStream(file);
int read = fileInputStream.read();
System.out.println((char)read);
}
}
初看,这几行代码非常简单,但是能够成为阿里的p6面试题还是有一定难度的。许多程序员写一个读文件中的字符到控制台的代码很轻松,而这里要描述从文件中读出一个字符到控制台的全过程,很多人不清楚这个到底是如何实现的,到底是怎么读的具体要看源码。
从read函数里进去我们能够看到调用的是read0()方法,read0()方法被native修饰,想必很多人很懵吧。
public int read() throws IOException {
return read0();
}
private native int read0() throws IOException;
执行这些java代码,jvm调用glibc函数库,实际上是glibc函数库里的FileInputStream.c,你没看错,底层调用的是C语言编写的代码。事实上,glibc函数库只是起一个桥梁作用,通过glibc函数库调用linux内核(linux本身并不是一个操作系统,之所以说linux只是一个内核,是因为有另外一个东西调用它成为操作系统,这里并不详细叙述),linux内核有对外暴露的服务(你可以理解为类似微服务),jvm通过glibc函数库调用的就是它,然后linux内核调用磁盘,磁盘再读出文件到控制台。(参考下图)