Android中的文件打开读写调用过程

1、简述

一般的Android 在Java层对文件的读写调用主要有以下两个类:

(1)FileInputStream/FileOutputStream(FileReader/FileWriter)
(2)RandomFileAccess

FileInputSteam和FileOutputStream继承于InputStream和OutputStream,FileReader、FileWriter继承于Reader和Writer,它们的底层实现原理实现是一样的,区别在于前者用于字节型数据流读写,后者用于unicode文本流读写。

RandomFileAccess是一个独立的文件读写类,它与InputStream、OutputStream不同之处在于它更倾向与随机文件读写,类似C语言fopen、fread、fseek、fwrite、fflush、fclose的封装。

下面简要的分析三个操作的整个调用过程。

2、文件打开

一般在Java层调用如下:

File myFile = new File(“/data/local/tmp/test.java”);

FileOutputStream fos = new FileOutputStream(myFile);

首先我们找到File.java

可以看到这里的构造函数并没有进行打开或者创建文件的操作。

接着我们找到FileOutputStream.java

可以看到这里调用了IoBridge的open函数。

我们跟进去IoBridge.java

这里我们可以看到是调用了Libcore.os.open函数。所以我们跟进Libcore.java

这里仅仅只是直接调用new Posix(),初始化一个新类,我们找到这个类的实现 Posix.java

这里是看到是native层实现的方法,这里我们继续跟踪到libcore_io_Posix.cpp

最终调用了libc的底层实现方法open函数,这里我们继续跟踪open函数,找到open.c

可以看到open函数的实现是__open(),好吧,只能继续往下找__open的实现,最终我们定位到__open.S

接着就进入内核层了。

内核层的主要调用过程是sys_open –> openat –>sys_openat –>do_sys_open

可参考 :

android-linux系统调用原理之整体系统框架实现原理之OPEN实现

3、4 读写

关于读写,已经有前辈写得很详细了,这里请移步阅读

 关于Android中的文件读写

所以这里就不过多详述了。

5、参考

JNIHelp.c 遗漏的部分

关于Android中的文件读写

 

本文属原创,转载请注明来自www.tasfa.cn

文中引用已经有注明,如果有其他问题请联系 root#tasfa.cn

发表评论

电子邮件地址不会被公开。

You must enable javascript to see captcha here!