如何从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.(RandomAccessFile.java:212) at java.io.RandomAccessFile.(RandomAccessFile.java:98) at pru.lseek.main(lseek.java:26) 

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

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

编辑:你想做什么,真的很复杂,没有共同的方法来做到这一点。 你可以按扇区访问harddisc扇区,但是你必须解释它的结构,这显然取决于文件系统,FAT,NTFS,HPFS等。

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

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

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

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

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

如果您有兴趣在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(); 

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

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

在Linux下,您可以尝试打开/dev/ ,例如/dev/hda/dev/sdb2 。 这将使您可以访问原始磁盘(或仅限分区),但要求您具有适当的权限 – “普通”用户不具备这些权限。

Java只能访问文件。 Unix将“原始设备”的概念作为/ dev目录中的文件,因此您可以在那里获得所需的内容。 但不是在Windows上,因为它没有原始高清数据的这种文件表示。

在Windows中,您需要将原始设备标识符作为文件访问。 如果您传入文件“\\。\ c:”,它正在使用设备UNC名称\。\ c 🙁 \。表示此计算机)。

对于Vista及更高版本,我认为它不会正常工作,因为有一些机制可以阻止对设备驱动程序以外的任何内容进行磁盘的原始访问(不要引用我的话)

@hunsricker:请注意,访问原始设备需要一些权限(取决于驱动器:可移动或不可用/取决于WinXP的文件系统:允许使用iso9660,FAT不可用)。

另请注意,读取的大小确实很重要(取决于操作系统):在iso9660文件系统上,读取(1024字节)在XP上工作但在Seven上失败。 在Seven上,看起来必须是块对齐的读取:read(2048字节)有效。

在unix中,您可以从/dev文件读取/写入。 (我不确定)

在Windows中,我认为您需要通过JNI(Java Native Interface)读/写磁盘扇区。 调用一些C库与操作系统通信。

更新:在C库中,您可能需要使用Win32API来获取文件句柄,例如CreateFile(..)函数。

https://metacpan.org/pod/Win32API::File

http://jan.newmarch.name/ssw/files/win32.html