18

次のコードを使用して、rawディスクのオフセットが50バイトの1バイトにアクセスしようとしています。

randomAccessFile = new RandomAccessFile("C:", "r");
randomAccessFile.seek(50);
byte[] buffer = new byte[1];
randomAccessFile.read(buffer);

しかし、私が得るのは次のエラーだけです。

java.io.FileNotFoundException: C: (Acceso denegado)
at java.io.RandomAccessFile.open(Native Method)
at java.io.RandomAccessFile.<init>(RandomAccessFile.java:212)
at java.io.RandomAccessFile.<init>(RandomAccessFile.java:98)
at pru.lseek.main(lseek.java:26)

Javaからドライブの正確なバイトにアクセスする方法はありますか?

4

8 に答える 8

18

物理ドライブから生データにアクセスする可能性を自分で探していました。そして今、私はそれが機能するようになったので、私はあなたにその方法を伝えたいだけです。Java内から直接rawディスクデータにアクセスできます...管理者権限で次のコードを実行するだけです。

    File diskRoot = new File ("\\\\.\\PhysicalDrive0");
    RandomAccessFile diskAccess = new RandomAccessFile (diskRoot, "r");
    byte[] content = new byte[1024];
    diskAccess.readFully (content);

したがって、システム上の最初の物理ドライブの最初のkBを取得します。上記のように、論理ドライブにアクセスするには、「PhysicalDrive0」を「D:」などのドライブ文字に置き換えます。

そうそう...私はWin7システムでJava1.7を試してみました...

http://support.microsoft.com/kb/100027/en-usで物理ドライブの名前を確認してください。

于 2011-12-22T22:14:59.540 に答える
13

Windowsでrawボリュームに書き込むことに興味がある場合は、これを試してください(Java 7が必要です)。

  String pathname;
  // Full drive:
  // pathname = "\\\\.\\PhysicalDrive0";
  // A partition (also works if windows doesn't recognize it):
  pathname = "\\\\.\\GLOBALROOT\\ArcName\\multi(0)disk(0)rdisk(0)partition(5)";

  Path diskRoot = ( new File( pathname ) ).toPath();

  FileChannel fc = FileChannel.open( diskRoot, StandardOpenOption.READ,
        StandardOpenOption.WRITE );

  ByteBuffer bb = ByteBuffer.allocate( 4096 );

  fc.position( 4096 );
  fc.read( bb );
  fc.position( 4096 );
  //fc.write( bb ); // careful!

  fc.close();

もちろん、デバイスが書き込み可能であり、システムによってアクセス/ロックされていないことを確認する必要があります。また、アプリケーションが必要な特権(昇格された特権)で実行されていることを確認してください。

ところで:new RandomAccessFile(drive, "rw")Javaはrawデバイスと互換性のあるモードでファイルハンドルを開かないため、使用は機能しないようです(例外はjava.io.FileNotFoundException (The parameter is incorrect))。しかし、読書は。でも問題なく機能しRandomAccessFileます。

于 2013-11-01T09:25:19.203 に答える
4

RandomAccessFileは、エントリを操作するためにディレクトリを開くためのものではありません。ファイルを作成または削除する必要があります。「Accesodenegado」は、おそらくアクセスが拒否されたことを意味します。とにかくこれを行うには、JNIが必要です。

編集:あなたがやろうとしていることは本当に複雑です、それをする一般的な方法はありません。ハードディスクセクターにはセクターごとにアクセスできますが、その構造を解釈する必要があります。これは明らかにファイルシステム、FAT、NTFS、HPFSなどに依存します。

于 2010-01-21T10:20:02.297 に答える
3

/dev/<device>Linuxでは、、/dev/hdaなどを開くことができます/dev/sdb2。これにより、rawディスク(またはパーティションのみ)にアクセスできますが、適切な権限が必要です。ただし、「通常の」ユーザーには権限がありません。

于 2010-01-21T10:18:56.563 に答える
1

Javaはファイルにのみアクセスできます。Unixには、/ devディレクトリ内のファイルとしての「rawデバイス」の概念があるため、そこで必要なことが可能です。ただし、Windowsにはありません。これは、生のHDデータのそのようなファイル表現がないためです。

于 2010-01-21T10:23:23.163 に答える
1

Windowsでは、rawデバイス識別子にファイルとしてアクセスする必要があります。ファイル"\\。\c:"を渡すと、デバイスのUNC名\。\ c:(\。はこのマシンを意味します)を使用している場合に機能するはずです。

Vista以降の場合、デバイスドライバ以外のディスクへのrawアクセスを防ぐメカニズムが用意されているため、正しく機能しないと思います(引用しないでください)。

于 2010-01-21T11:52:12.053 に答える
1

@hunsricker:rawデバイスへのアクセスにはいくつかの特権が必要であることに注意してください(ドライブに依存:リムーバブルかどうか/ WinXPのファイルシステムに依存:iso9660は許可されますが、FATは許可されません)。

読み取りのサイズが重要であることに注意してください(OSによって異なります):iso9660ファイルシステムでは、read(1024バイト)はXPでは機能しますが、Sevenでは失敗します。セブンでは、読み取りはブロックアラインされている必要があるように見えます:読み取り(2048バイト)は機能します。

于 2012-02-22T08:18:09.107 に答える
0

UNIXでは、/devファイルから読み取り/書き込みを行うことができます。(わからない)

Windowsでは、JNI(Java Native Interface)を介してディスクセクターを読み書きする必要があると思います。OSと通信するためにいくつかのCライブラリを呼び出します。

更新:Cライブラリでは、関数などのファイルハンドルを取得するためにWin32APIを使用する必要がある場合がありますCreateFile(..)

https://metacpan.org/pod/Win32API::File

http://jan.newmarch.name/ssw/files/win32.html

于 2010-01-21T10:19:26.720 に答える