Windows 上的 Java 无法写入 PhysicalDriveX

Posted

技术标签:

【中文标题】Windows 上的 Java 无法写入 PhysicalDriveX【英文标题】:Java on Windows cannot write to PhysicalDriveX 【发布时间】:2013-12-08 22:07:56 【问题描述】:

我在 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)

【问题讨论】:

How to WriteFile to a PhysicalDrive (Windows 7) without getting ERROR_ACCESS_DENIED?的可能重复 不,它不是重复的。原因:我可以让 C 程序在 Windows 和 Linux 上读写都很好。我可以让一个 Java 程序在 Windows 和 Linux 上都可以阅读。 但是,我无法让 Java 程序在 Windows 上同时读取 和写入* 不,这并不奇怪!我什至尝试过"\\\\.\\PhysicalDrive1" 无济于事。无论如何,正斜杠在"r" 模式下工作正常。 @StephenC 是的,我已阅读问题及其答案。显然,您没有仔细阅读我上面所说的内容,并且可能还投票结束了这个问题。请不要在没有仔细理解问题的情况下这样做。我在使用 Java 和在 Windows 上以及写访问时遇到问题......我的 C 和 Java 程序之间的所有其他内容都相同。 另外,目标问题没有满意的答案; “将其关闭并再次打开”并不能解决导致问题的任何问题。 【参考方案1】:

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

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();

【讨论】:

以上是关于Windows 上的 Java 无法写入 PhysicalDriveX的主要内容,如果未能解决你的问题,请参考以下文章

使用 Java 通过 Windows 上的外部应用程序管道数据

Java程序无法在linux中的挂载系统上写入

无法写入核心转储。默认情况下,在 Windows 的客户端版本上不启用小型转储

macbook对移动硬盘无法写入的解决方案求教

Windows 上的 PlistBuddy

SSD写入很慢是怎么回事