如何以Java方式直接从设备读取/写入文件(如O_DIRECT标志的效果)?

fif*_*fth 15 java file-io android

我必须直接读/写文件,没有任何缓冲.在旧的C方式中,我通过使用带O_DIRECT标志的open方法来做到这一点.

这有可能用Java方式吗?

这是O_DIRECT描述

尝试最小化I/O与此文件之间的缓存效果.通常,这会降低性能,但在特殊情况下很有用,例如应用程序执行自己的缓存时.文件I/O直接进出用户空间缓冲区.

更新:

这是我的代码示例,

// write
fos = new FileOutputStream(fileName);
fos.write(inputData);
fos.flush();
fos.close();

// read
fis = new FileInputStream(fileName);
int len = fis.read(outputData, offset, length);
fis.close();
Run Code Online (Sandbox Code Playgroud)

背景是我将数据(实际上是命令)写入SD卡(某种智能卡)上的文件,然后智能卡接收命令并将结果准备到同一文件.通常情况下,我可以从文件中读取数据(结果),但我得到了同样的inputDataoutputData,即,我只是得到我的命令了.这是意想不到的结果.我怀疑代码是否只是写入/读取缓冲区,而不是真实文件.Flush无法正常工作.

cas*_*key 3

FileOutputStream 的 android 文档明确指出它是一个无缓冲的流。无论如何,flush() 和 close() 应该可以解决问题。在 close() 之前您可能需要执行的唯一附加步骤是 getFD().sync()。

您提到了智能卡,因此该设备实现了自己的(假)文件系统,对主机来说显示为 SD 卡等。该卡的文档是否说明您应该给该卡多长时间才能注意到文件的更改?在块 I/O 级别,没有相应的“打开”或“关闭”操作,因此设备应该注意到字节的写入。

或者,如果设备“聪明”并使用文件元数据上的时间更改,则您可能需要调用 File.setLastModified(System.currentTimeMillis()) 来手动“触摸”文件。假设类似 sd 的设备安装了“noatime”选项以提高性能。