如何从java访问磁盘上的特定原始数据

use*_*973 17 java drive

我正在尝试使用以下代码访问原始磁盘中偏移量为50字节的一个字节.

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

但我得到的是以下错误:

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)
Run Code Online (Sandbox Code Playgroud)

有没有办法从java访问驱动器中的精确字节?

小智 16

我一直在寻找从物理驱动器访问原始数据的可能性.现在,当我开始工作时,我只想告诉你如何.您可以直接从java中访问原始磁盘数据...只需使用管理员权限运行以下代码:

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

因此,您将获得系统上第一个物理驱动器的第一个kB.要访问逻辑驱动器 - 如上所述 - 只需将'PhysicalDrive0'替换为驱动器号,例如'D:'

哦是的...我在Win 7系统上尝试使用Java 1.7 ...

请访问http://support.microsoft.com/kb/100027/en-us,查看物理驱动器的命名


Dan*_*der 10

如果您有兴趣在Windows下写入原始卷,请尝试此操作(需要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 );

  fc.close();
Run Code Online (Sandbox Code Playgroud)

当然,您必须确保设备是可写的,而不是系统访问/锁定.还要确保您的应用程序以必要的权限(提升的权限)运行.

顺便说一下:使用new RandomAccessFile(drive, "rw")似乎不起作用,因为Java没有以与原始设备兼容的模式打开文件句柄(例外java.io.FileNotFoundException (The parameter is incorrect)).但阅读效果也很好RandomAccessFile.


sta*_*ker 4

RandomAccessFile 并不意味着打开目录来操作条目,您需要创建或删除文件。“Acceso denegado”可能意味着访问被拒绝。无论如何,要执行此操作,您需要 JNI。

编辑:您想要做的事情确实很复杂,没有通用的方法可以做到这一点。您可以逐扇区访问硬盘,但是您必须解释它的结构,这显然取决于文件系统,FAT、NTFS、HPFS 等。