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 上的外部应用程序管道数据