IO
Structure #
FileDescriptor #
文件描述符类的实例充当底层机器特定结构的不透明句柄,表示打开的文件、打开的套接字或另一个字节源或接收器。文件描述符的主要实际用途是创建FileInputStream或FileOutputStream来包含它。
它相当于将指定文件的信息与新建的文件指针fp相关联,在 FILE 结构内部记录了这样一些信息:文件内部的当前读写位置、读写报错的记录、文件结尾指示器、缓冲区开始位置的指针、文件标识符、一个计数器(统计拷贝进缓冲区的字节数)等等。后继的操作就可以使用这个指针(而不是文件名)来处理指定文件。 参考InputStream #
signature:
public abstract class InputStream implements Closeable {}
FileInputStream #
摘抄代码 #
jdk代码来自【openjdk 23-internal】
构造器初始化解读 #
- 调用静态方法
initIDs()
用来初始化FileDescriptor fd
属性,此处并不是赋值,而是让FileInputStream.c 中的fis_fd
保存属性位置。方便后续通过C代码能够获取当前fd属性对象。近而对当前FileInputStream中的fd对象中的属性fd赋值真正的文件描述符id,例如整型值23
. - 通过open0()方法调用原生方法获取1中需要的文件描述符id,
2.1 将fis_fd
通过fileOpen函数传入io_util_md.c中.
2.2fd = handleOpen(ps, flags, 0666);
尝试打开给定路径的文件。获取文件描述符id。 - 将2中获取的文件描述符id赋值给FileInputStream中的fd对象中的属性fd
3.1fdobj = (*env)->GetObjectField(env, this, fid);
获取当前FileInputStream对象中的FileDescriptor fd
这个对象。
3.2(*env)->SetIntField(env, fdobj, IO_fd_fdID, fd);
IO_fd_fdID 定义在FileDescriptor_md.c文件中。对3.1中的对象fdobj赋值 fd. - 后续原生读写都会通过这个FD进行。
- 调用静态方法
Reference #
- https://stackoverflow.com/questions/10006293/why-some-java-methods-in-core-libraries-end-with-numbers
- https://wangdoc.com/clang/file
- https://web.archive.org/web/20140528182031/https://blogs.oracle.com/slc/entry/javanio_vs_javaio
- https://medium.com/@nilasini/java-nio-non-blocking-io-vs-io-1731caa910a2
- https://stackoverflow.com/tags/nio/info
comments powered by Disqus