2011-12-20 83 views
0

我想知道是否可以在Android中使用JAVA API从SDCARD中读取文件的内容。
我可以Android - 从SDCARD中读取文件不是从缓存中读取

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

pBuffer对齐缓冲区使用NDK的C代码做到这一点,但是当我使用直接使用从Java读取

bytesRead = fin.read(originalBuffer) 

它汇集了来自缓存文件数据

+0

我选择了有问题的代码行并按下CTRL + K,它改变了它们的外观。容易阅读:D – 2011-12-20 08:50:20

+0

谢谢:)现在我知道该怎么做))) – 2011-12-20 08:56:09

+0

只是谷歌! http://stackoverflow.com/questions/3779944/reading-a-specific-file-from-sdcard-in-android – woodshy 2011-12-20 10:15:47

回答

0

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

0

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

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

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