Android - 从SDCARD读取文件而不是从缓存中读取

时间:2011-12-20 08:46:19

标签: android android-ndk android-file

我想知道是否可以使用Android中的 JAVA API 从SDCARD中读取文件内容。
我可以使用NDK C代码

来完成
int fd = open(str, O_RDWR | O_NONBLOCK | O_DIRECT);  
readCount = read(fd, pBuffer, size); 

pBuffer对齐缓冲区时,但是当我使用

直接从Java中读取它时
bytesRead = fin.read(originalBuffer)

它从缓存中提取文件数据

2 个答案:

答案 0 :(得分:0)

经过长时间的调查和测试,我明白没有办法直接从Java打开文件 唯一的方法是使用NDK并使用O_DIRECT参数打开文件,如问题正文中所述。
请注意,为了编译代码,应使用-D_GNU_SOURCE指令。

答案 1 :(得分:0)

我认为主要的问题是在Java中获取页面对齐的内存缓冲区,以便读取文件,因为通过JNI传递文件描述符仍然可以通过JNI(http://www.kfu.com/~nsayer/Java/jni-filedesc.html - 我确实使用了这个能够在Oracle Java VM for ARM上打开以UTF-8名称命名的文件的技术,这种方法无法做到这一点。

但是为了满足您的需求,我们仍然必须向系统提供一个目标缓冲区,用于读取页面对齐的操作,因为没有它,底层的Linux系统在第一次尝试读取数据后会给你一个EINVAL错误。

我不知道任何可以提供页面对齐读取缓冲区的Java代码。