【问题标题】:Android - read file from SDCARD not from cacheAndroid - 从 SDCARD 读取文件而不是从缓存中读取
【发布时间】:2011-12-20 08:46:18
【问题描述】:

我想知道是否可以在 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)

它从缓存中获取文件数据

【问题讨论】:

  • 我选择了有问题的代码行并按下了 CTRL+K,它改变了它们的外观。易于阅读:D
  • 谢谢 :) 现在我知道该怎么做了 )))
  • 不,这个问题不同 - 我需要访问不在缓存中的文件。还是谢谢

标签: android android-ndk android-file


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2012-03-04
      • 2011-04-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-16
      • 1970-01-01
      相关资源
      最近更新 更多