Как получить доступ к определенным исходным данным на диске из 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
RandomAccessFile не предназначен для открытия каталогов для управления записями, вам необходимо создать или удалить файлы. "Acceso denegado", вероятно, означает отказ в доступе.
Для этого вам все равно нужен JNI.
EDIT: То, что вы пытаетесь сделать, действительно сложно, нет общего способа сделать это. Вы можете получить доступ к сектору harddisc по секторам, но тогда вам придется интерпретировать его структуру, которая, очевидно, зависит от файловой системы, FAT, NTFS, HPFS и т.д.
Ответ 2
Я смотрел сам по себе, чтобы получить доступ к необработанным данным из физического диска. И теперь, когда я получил его на работу, я просто хочу рассказать вам, как это сделать. Вы можете получить доступ к необработанным данным диска непосредственно из java... просто запустите следующий код с правами администратора:
File diskRoot = new File ("\\\\.\\PhysicalDrive0");
RandomAccessFile diskAccess = new RandomAccessFile (diskRoot, "r");
byte[] content = new byte[1024];
diskAccess.readFully (content);
Итак, вы получите первый kB вашего первого физического диска в системе. Для доступа к логическим дискам - как упоминалось выше - просто замените "PhysicalDrive0" буквой диска, например. 'D:
о да... Я пробовал с Java 1.7 в системе Win 7...
Просто взгляните на имена физических дисков на http://support.microsoft.com/kb/100027/en-us
Ответ 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 );
fc.close();
Конечно, вы должны убедиться, что устройство доступно для записи и не доступно/заблокировано системой. Также убедитесь, что ваше приложение работает с необходимыми привилегиями (повышенными привилегиями).
Btw: Использование new RandomAccessFile(drive, "rw")
не работает, потому что Java не открывает дескриптор файла в режиме, совместимом с необработанными устройствами (исключение - java.io.FileNotFoundException (The parameter is incorrect)
). Но чтение отлично работает и с RandomAccessFile
.
Ответ 4
В Linux вы можете попробовать открыть /dev/<device>
, например. /dev/hda
или /dev/sdb2
. Это даст вам доступ к необработанному диску (или только к разделу), но требует, чтобы у вас были соответствующие права - "обычный" пользователь их не имеет.
Ответ 5
В unix вы можете читать/записывать файлы /dev
. (Я не уверен)
В Windows, я думаю, вам нужно читать/записывать сектора диска через JNI (Java Native Interface). Вызывает некоторую библиотеку C, чтобы поговорить с ОС.
update: в библиотеке C вам может понадобиться использовать Win32API для получения дескриптора файла, например, функции CreateFile(..)
.
https://metacpan.org/pod/Win32API::File
http://jan.newmarch.name/ssw/files/win32.html
Ответ 6
Java может обращаться только к файлам. У Unix есть понятие "сырые устройства" как файлы в каталоге /dev, так что вы можете туда попасть. Но не на окнах, потому что у него нет такого файла представления необработанных данных HD.
Ответ 7
В окнах вам нужно получить доступ к необработанному идентификатору устройства в виде файла. Он должен работать, если вы передадите файл "\\.\C:", вы используете устройство UNC name \.\C: (\. Означает этот аппарат).
Для Vista и более поздних версий я не думаю, что она будет работать корректно, поскольку существуют механизмы для предотвращения необработанного доступа к диску для чего-либо, кроме драйверов устройств (не цитируйте меня на этом)
Ответ 8
@hunsricker: обратите внимание, что для доступа к необработанным устройствам требуются некоторые привилегии (зависит от диска: съемный или нет/зависит от файловой системы для WinXP: iso9660 разрешен, FAT - нет).
Обратите внимание, что размер чтения имеет значение (в зависимости от ОС):
В файловой системе iso9660 чтение (1024 байта) работает на XP, но с ошибкой на Seven.
В седьмом случае это выглядит так, что чтение должно быть выровнено по блоку: работает чтение (2048 байт).