Comment accéder aux données brutes spécifiques sur le disque à partir de Java
Je suis en train d'utiliser le code suivant pour accéder à un octet avec un décalage de 50 octets dans un disque brut.
randomAccessFile = new RandomAccessFile("C:", "r");
randomAccessFile.seek(50);
byte[] buffer = new byte[1];
randomAccessFile.read(buffer);
Mais tout ce que je reçois à est le message d'erreur suivant:
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)
Est-il un moyen d'accéder à une précision d'octets dans un lecteur de java?
source d'informationauteur user178973
Vous devez vous connecter pour publier un commentaire.
RandomAccessFile n'est pas destiné à ouvrir les répertoires de manipuler les entrées, vous avez besoin de créer ou de supprimer des fichiers. "Acceso denegado" signifie probablement accès refusé.
Pour ce faire, de toute façon vous avez besoin de JNI.
EDIT: Ce que vous essayez de faire, c'est vraiment compliqué, il n'y a aucun moyen de le faire. Vous pouvez accéder au disque dur, secteur par secteur, mais alors que vous auriez à interpréter la structure, ce qui dépend évidemment du système de fichiers FAT,NTFS,HPFS, etc.
J'étais à la recherche par moi-même pour une possibilité d'accès à des données brutes forme d'un disque physique. Et maintenant que je l'ai eu à travailler, je veux juste vous dire comment. Vous pouvez accéder à raw disque de données directement à partir de java ... il suffit d'exécuter le code suivant avec des privilèges d'administrateur:
De sorte que vous obtiendrez le premier ko de votre premier disque sur le système. Pour accéder aux disques logiques - comme mentionné ci - dessus il suffit de remplacer 'PhysicalDrive0' avec la lettre de lecteur par exemple 'D:'
oh oui ... j'ai essayé avec Java 1.7 sur un Win 7 ...
Juste un coup d'oeil à la désignation des disques physiques à http://support.microsoft.com/kb/100027/en-us
Si vous êtes intéressé par écrit à raw d'un volume sous Windows, essayez ceci (besoins de Java 7).
Bien sûr, vous devez vous assurer que l'appareil est accessible en écriture et non pas un accès verrouillé par le système. Assurez-vous également que votre application s'exécute avec les privilèges nécessaires (élévation de privilèges).
Btw: à l'Aide de
new RandomAccessFile(drive, "rw")
ne semble pas fonctionner, car Java ne permet pas d'ouvrir le descripteur de fichier dans un mode qui est compatible avec les périphériques (à l'exception dejava.io.FileNotFoundException (The parameter is incorrect)
). Mais la lecture fonctionne très bien aussi avecRandomAccessFile
.Sous Linux, vous pouvez essayer d'ouvrir
/dev/<device>
par exemple/dev/hda
ou/dev/sdb2
. Cela vous donnera accès à un disque brut (ou une partition uniquement), mais exige que vous avez les droits d'un utilisateur “normal” ne les a pas, cependant.Java ne peut accéder aux fichiers. Unix est le concept de "raw devices" en tant que fichiers dans le répertoire /dev, donc ce que vous voulez, c'est possible. Mais pas sur windows, car il n'a pas de tel fichier représentation de la crue de données HD.
Dans windows, vous avez besoin d'accéder à un périphérique brut identificateur de fichier. Cela devrait fonctionner si vous passez dans le fichier "\\.\c:", vous utilisez l'appareil nom UNC \.\c: (\. les moyens de cette machine).
Pour Vista et plus tard, je ne pense pas que cela fonctionnera correctement qu'il existe des mécanismes en place pour empêcher l'accès brut sur le disque pour autre chose que des pilotes de périphérique (ne pas me citer)
@hunsricker : notez que l'accès à raw des appareils nécessitent certains privilèges (dépend de la voiture : amovible ou non /ça dépend du système de fichier pour WinXP : iso9660 est autorisé, la GRAISSE n'est pas).
Note également que la taille de lire n'importe (selon le système d'exploitation) :
Sur un système de fichiers iso9660, lire(1024 octets) fonctionne sur XP, mais échoue sur Sept.
Sur Sept ressembler le lit doit être alignée : lire(2048 octets).
Dans unix, vous pouvez lire/écrire à partir de
/dev
fichiers. (Je ne suis pas sûr)Dans Windows, je pense que vous avez besoin pour lire/écrire des secteurs de disque via JNI(Java Native Interface). Les appels de certains de la bibliothèque C de parler à l'OS.
mise à jour: Dans la bibliothèque C, vous pouvez avoir besoin d'utiliser Win32API pour obtenir le descripteur de fichier par exemple
CreateFile(..)
fonction.https://metacpan.org/pod/Win32API::File
http://jan.newmarch.name/ssw/files/win32.html