驱动器如何从java访问磁盘上的特定原始数据
我试图使用以下代码访问原始磁盘中偏移量为50字节的一个字节
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访问驱动器中的精确字节
# 1 楼答案
我自己在寻找一种从物理驱动器访问原始数据的可能性。现在当我开始工作的时候,我只想告诉你怎么做。您可以直接从java中访问原始磁盘数据。。。只需使用管理员权限运行以下代码:
因此,您将获得系统上第一个物理驱动器的第一个kB。要访问逻辑驱动器(如上所述),只需将“PhysicalDrive0”替换为驱动器号,例如“D:”
哦,是的。。。我尝试在Win 7系统上使用Java 1.7
请看一下http://support.microsoft.com/kb/100027/en-us上物理驱动器的命名
# 2 楼答案
在windows中,您需要以文件的形式访问原始设备标识符。如果您传入文件“\\。\c:”,您使用的是设备UNC名称\,它应该可以工作。\c:(\.指这台机器)
对于Vista和更高版本,我认为它不会正常工作,因为有机制防止设备驱动程序以外的任何东西对磁盘进行原始访问(不要引用我的话)
# 3 楼答案
如果您对在Windows下将写入原始卷感兴趣,请尝试这个(需要Java 7)
当然,你必须确保设备是可写的,并且不被系统访问/锁定。还要确保应用程序以必要的权限(提升的权限)运行
顺便说一句:使用
new RandomAccessFile(drive, "rw")
似乎不起作用,因为Java没有以与原始设备兼容的模式打开文件句柄(例外是java.io.FileNotFoundException (The parameter is incorrect)
)。但是阅读也适用于RandomAccessFile
# 4 楼答案
Java只能访问文件。Unix的概念是将“原始设备”作为/dev目录中的文件,因此您可以在那里实现所需的功能。但在windows上不能,因为它并没有原始HD数据的这种文件表示
# 5 楼答案
RandomAccessFile不是用来打开目录来操作条目的,您需要创建或删除文件。“Acceso denegado”可能意味着访问被拒绝。 无论如何,要做到这一点,你需要JNI
编辑:你想做的事情非常复杂,没有通用的方法。您可以逐个扇区访问硬盘,但随后必须解释其结构,这显然取决于文件系统、FAT、NTFS、HPFS等
# 6 楼答案
在Linux下,你可以尝试打开
/dev/<device>
,例如/dev/hda
或/dev/sdb2
。这将允许您访问原始磁盘(或仅限于分区),但需要您拥有适当的权限——尽管“普通”用户没有这些权限