2012-07-06 37 views
14

我不得不直接讀/寫文件,沒有任何緩衝。在舊的C方式中,我用O_DIRECT標誌使用了開放方式做了這個。如何以Java方式直接從/向設備讀寫文件(如O_DIRECT標誌的效果)?

這是可能的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,即我剛收到我的命令。這是意想不到的結果。我懷疑代碼是否寫入/讀取緩衝區,而不是真正的文件。沖洗失敗。

+1

如果您不介意緩慢,那麼您可以使用純粹的'FileOutputStream',它幾乎是最低級別,沒有緩衝。當然,你將不得不將所有東西都轉換成byte []或byte,但是它看起來就是你想要做的。 – nhahtdh 2012-07-06 03:12:59

+0

它可能你可以用ndk做到這一點,但爲什麼? – 2012-07-06 07:13:03

+0

@Chris Stratton,當然我知道它可以通過NDK和jni完成,但是我更喜歡用Java來做,因爲它很方便調試,我想知道它是否可能 – fifth 2012-07-06 08:13:03

回答

2

FileOutputStream的android文檔明確指出它是一個無緩衝的流。無論如何,flush()後跟close()應該能夠做到這一點。在close()之前您可能想要採取的唯一附加步驟是getFD()。sync()。

您提到了一個智能卡,因此該設備實現了自己的(假的)文件系統,作爲SD卡或類似物出現在主機上。該卡的文檔是否說明您應該讓卡注意文件更改的時間?在塊I/O級別沒有相應的「開放」或「關閉」操作,因此設備應該注意寫入字節。或者,如果設備是「聰明的」,並使用文件元數據上的時間更改,則可能需要調用File.setLastModified(System.currentTimeMillis())手動「觸摸」文件。假設sd-like設備安裝了'noatime'選項以提高性能。

1

當您撥打close()時,與文件描述符關聯的所有數據都消失了。由於您獲取的輸入數據與輸出數據相同,因此這可能不是Java文件讀取問題。

我建議你從Linux而不是從Android調試你的設備(驅動程序)。如果您願意,可以編寫一個C程序來做同樣的事情,並嘗試從adb shell運行它。它應該可以幫助你找出原來的問題。

相關問題