3

我在 Windows 上遇到了 Java 的这个讨厌的问题。(Linux 上的 Java 没有这个问题。)

在 Linux 上,作为 root 用户,我可以new RandomAccessFile(new File("/dev/sdb"), "rw");读取和写入我的第二个驱动器的原始扇区。

在 Windows 上,作为管理员,我可以使用RandomAccessFile(new File("//./PhysicalDrive1"), "r");读取相同第二个驱动器的原始扇区。但是,如果我"rw"改为指定模式,我会得到一个java.io.FileNotFoundException.

我可以在 Windows 上使用 JNI+C 作为解决方法,但我想要一个仅基于 Java 的非基于 DLL 的跨平台解决方案。

有没有人有关于如何解决这个问题的任何提示?

编辑:

我得到的确切例外是一些“参数”是“不正确的”:

Exception in thread "main" java.io.FileNotFoundException: \\.\PhysicalDrive1 (The parameter is incorrect)
    at java.io.RandomAccessFile.open(Native Method)
    at java.io.RandomAccessFile.<init>(RandomAccessFile.java:241)
    at java.io.RandomAccessFile.<init>(RandomAccessFile.java:122)
    at MyTest.main(MyTest.java:100)
4

1 回答 1

0

正如@daniel-alder这里提到的,您可以尝试运行以下代码:

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();
于 2017-03-14T18:58:33.683 回答