有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

驱动器如何从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访问驱动器中的精确字节


共 (6) 个答案

  1. # 1 楼答案

    我自己在寻找一种从物理驱动器访问原始数据的可能性。现在当我开始工作的时候,我只想告诉你怎么做。您可以直接从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上物理驱动器的命名

  2. # 2 楼答案

    在windows中,您需要以文件的形式访问原始设备标识符。如果您传入文件“\\。\c:”,您使用的是设备UNC名称\,它应该可以工作。\c:(\.指这台机器)

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

  3. # 3 楼答案

    如果您对在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 ); // careful!
    
      fc.close();
    

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

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

  4. # 4 楼答案

    Java只能访问文件。Unix的概念是将“原始设备”作为/dev目录中的文件,因此您可以在那里实现所需的功能。但在windows上不能,因为它并没有原始HD数据的这种文件表示

  5. # 5 楼答案

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

    编辑:你想做的事情非常复杂,没有通用的方法。您可以逐个扇区访问硬盘,但随后必须解释其结构,这显然取决于文件系统、FAT、NTFS、HPFS等

  6. # 6 楼答案

    在Linux下,你可以尝试打开/dev/<device>,例如/dev/hda/dev/sdb2。这将允许您访问原始磁盘(或仅限于分区),但需要您拥有适当的权限——尽管“普通”用户没有这些权限