15

バッファリングせずに、ファイルを直接読み取り/書き込みする必要があります。O_DIRECT古いCの方法では、フラグ付きの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カード(ある種のスマートカード)上のファイルにデータ(実際にはコマンド)を書き込んだ後、スマートカードがコマンドを受け取り、同じファイルに結果を準備したことです。通常、私はそのファイルからデータ(結果)を読み取ることができますが、同じようにinputDataなりoutputDataました。つまり、コマンドを取り戻しただけです。それは予想外の結果です。コードが実際のファイルではなく、バッファとの間で書き込み/読み取りを行っただけなのかどうか疑問に思っています。フラッシュが機能しませんでした。

4

2 に答える 2

3

FileOutputStream の Android ドキュメントは、それがバッファリングされていないストリームであることを明示的に示しています。いずれにせよ、flush() の後に close() を実行するとうまくいくはずです。close() の前に必要な唯一の追加ステップは、getFD().sync() です。

スマートカードについて言及しているため、このデバイスは独自の(偽の)ファイルシステムを実装し、ホストには SD カードなどとして表示されます。カードのドキュメントには、カードがファイルの変更に気付くまでの時間を指定する必要がありますか? ブロック I/O レベルでは、対応する「開く」または「閉じる」操作がないため、デバイスはバイトの書き込みを認識する必要があります。

あるいは、デバイスが「巧妙」で、ファイル メタデータの時刻の変更を使用する場合は、 File.setLastModified(System.currentTimeMillis()) を呼び出してファイルを手動で「タッチ」する必要がある場合があります。パフォーマンスを向上させるために、sd のようなデバイスが「noatime」オプションでマウントされていると仮定します。

于 2012-09-18T21:13:35.077 に答える
1

を呼び出すclose()と、ファイル記述子に関連付けられているすべてのデータが失われます。出力データと同じ入力データを取得しているため、これはJavaファイルの読み取りの問題ではない可能性があります。

Androidからではなく、Linuxからデバイス(ドライバー)をデバッグすることをお勧めします。必要に応じて、同じことを行うCプログラムを作成し、adbシェルから実行してみてください。元の問題を理解するのに役立つはずです。

于 2012-09-26T15:23:20.047 に答える