15

我必须直接读/写文件,没有任何缓冲。在旧的 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();

背景是我将数据(实际上是命令)写入 sd 卡(某种智能卡)上的文件,然后智能卡接收命令并将结果准备到同一个文件中。通常,我可以从该文件中读取数据(结果),但我得到了相同的结果inputDataoutputData也就是说,我刚刚得到了我的命令。这是意想不到的结果。我怀疑代码是否只是从缓冲区写入/读取,而不是真正的文件。冲洗失败。

4

2 回答 2

3

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

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

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

于 2012-09-18T21:13:35.077 回答
1

当您调用 时close(),与文件描述符关联的所有数据都消失了。由于您获得的输入数据与输出数据相同,因此这可能不是 Java 文件读取问题。

我建议您从 Linux 而不是 Android 调试您的设备(驱动程序)。如果您愿意,可以编写一个 C 程序来做同样的事情,并尝试从 adb shell 运行它。它应该可以帮助您找出原始问题。

于 2012-09-26T15:23:20.047 回答