キャッシュなしでダイレクトにファイルを開くには? – プログラミング – Home

キャッシュなしでダイレクトにファイルを...
 
通知
すべてクリア

[解決済] キャッシュなしでダイレクトにファイルを開くには?


たいちう
 たいちう
(@たいちう)
ゲスト
結合: 23年前
投稿: 662
 

JAVA板には初カキコの、たいちうです。よろしくお願いします。
数日前から悩んでいる問題があり、質問させていただきます。

USB接続の記憶媒体があり、仮想的なFAT12が構築されています。
Windowsのマイコンピュータから見ると、テキストファイルと
バイナリファイルがある、フロッピーディスクのように見えます。

1.テキストファイルにコマンドを書く。
2.ファイルを閉じる。
3.同じテキストファイルを読み、コマンドが処理されたこと確認。
4.データ本体のバイナリファイルを読む。

このような読み出しの手順が必要なのですが、3でファイルを開くときに
Win32APIのCreateFileで、FILE_FLAG_NO_BUFFERING を指定することが
トリガーとなってコマンドが処理されているようです。

JAVAでバッファリングなしということで、ByteBuffer.allocateDirect
を試してみましたが、読込時テキストファイルは変化せず、コマンドは
処理されないようでした。

JAVAでは不可能なのでしょうか?
また、現在はWindowsXP + JAVA2(1.4)で試みていますが、
最終的にはLinux(turbolinux10)を使おうと思っています。

VCで成功しているソースと、こちらは役に立たないかもしれませんが、
ByteBufferで失敗しているソースを載せます。
何か情報をお持ちの方、よろしくお願いします。

//-----------------------------------------------------------------------------
// VCで、コマンド処理が成功したことを示せる最少のコード

#include <windows.h>
#include <iostream>

int main()
{
// write
FILE *fp = fopen(A:\\command.txt, w);
char buf[262]; // (buf[0] != 'S')
strcpy(buf, a command);
fwrite(buf, 1, 262, fp);
fclose(fp);

// read
HANDLE hTxt = CreateFile(A:\\command.txt, GENERIC_READ, 0, 0,
OPEN_ALWAYS, FILE_FLAG_NO_BUFFERING, 0);
DWORD read;
char data[512];
ReadFile(hTxt, data, 512, &read, NULL);
CloseHandle(hTxt);

// check
std::cout << ((data[0] == 'S') ? success : fail) << std::endl;

return 0;
}

//-----------------------------------------------------------------------------
// JAVA の失敗例の断片(readのみ)

try {
FileInputStream fis = new FileInputStream(A:\\command.txt);
FileChannel channel = fis.getChannel();
long fileSize = channel.size();
int bufferSize = (int)fileSize;
ByteBuffer buffer = ByteBuffer.allocateDirect(bufferSize);
channel.read(buffer);

// ここでbufferを見ても変化していなかった

channel.close();
fis.close();
} catch (Exception e) {
e.printStackTrace();
}


引用未解決
トピックタグ

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました