IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Java Discussion :

Disques et bandes SCSI - Problème de lecture et écriture


Sujet :

Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2011
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2011
    Messages : 3
    Par défaut Disques et bandes SCSI - Problème de lecture et écriture
    Bonjour,
    Je débute en Java (~3 mois) et dans le cadre d'un projet, je dois aller lire le contenu de disques et bandes SCSI, et effectuer diverses opérations avec ce contenu, comme la copie sur un autre support (fichier, disque, bande) ou simplement afficher le contenu, effectuer un checksum sur le contenu, ...

    Mon problème est qu'apparemment mon programme détecte bien les disques et bandes en place, car quand je l’exécute les leds "travail" s'allument, mais que ce soit pour le lecture d'un disque ou l'écriture d'un fichier sur un disque par exemple c'est comme si aucune données n'étaient lu ou écrite. Mon programme marche parfaitement cependant quand je ne traite que des fichiers comme support.

    Voici mon code pour l'opération copie par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
     try {
                //On instancie nos objets
        	    bis_s = new BufferedInputStream(new FileInputStream(support_source)); 
        	  	raf_c = new RandomAccessFile(support_cible,"rw");
     
                //bos = new BufferedOutputStream(new FileOutputStream(support2));
     
        	  	//On créer un tableau de byte 
                //pour dire de combien en combien on va lire les données
                byte[] buf = new byte[512]; 
     
                //On récupère le temps du systeme
                long startTime = System.currentTimeMillis();
     
        	  if(mode_source == 1){
              	 if(mode_cible == 1){
                          //On réinitialise                
                          startTime = System.currentTimeMillis();
                          raf_c.seek(sect_debut_cible * 512);
     
                          while(bis_s.available() > 0){
                        	 if(bis_s.available() < 512){
                        	  	  buf = new byte[bis_s.available()];
                        	 }
                        	 bis_s.read(buf);
                        	 System.out.print(raf_c.getFilePointer()+"\n");
                          	 raf_c.write(buf);
                          }
                  	  }
     
              	   //On ferme le flux de données
              	   bis_s.close();
                   raf_c.close();
            }else if(mode_source == 2){
                  raf_s = new RandomAccessFile(support_source,"rw");
                  int taille_adr = sect_debut_source*512;  
          	      raf_s.seek(taille_adr);
          	      raf_c.seek(sect_debut_cible * 512);
              	  for(int j=sect_debut_source;j<=sect_fin_source;j++){
              	      //System.out.print(raf_s.getFilePointer()+" "+raf_c.getFilePointer()+"\n");
                      raf_s.read(buf);
                      raf_c.write(buf);
              	  }
              	  //On ferme le flux de données
              	  raf_s.close();
            	  raf_c.close(); 
              	}
        	  	//On réaffiche
                System.out.println("Temps de lecture + écriture avec BufferedInputStream et BufferedOutputStream : " + (System.currentTimeMillis() - startTime));
     
                System.out.println("Copie terminée !");
     
          } catch (FileNotFoundException e) {
              e.printStackTrace();
          } catch (IOException e) {
              e.printStackTrace();
          }     	
      }
    pour un disque : support_source = /dev/sda (par ex)
    pour une bande : support_source = /dev/nst0 (par ex)

    J'avais lu je ne sais plus où que ce n'était pas possible de lire et écrire sur des disques SCSI en java, est-ce vrai ?
    Je suis également tenté de passer par une JNA en utilisant la fonction open() et en récupérant le int descripteur de fichier de retour , mais impossible de convertir ce int en FileDescriptor en java, donc j'ai abandonné l'idée.

    Si vous pouviez m'aider, je vous en serai gré, cela fait 1 semaine voir un peu plus que je bloque sur ce problème

    N'hésitez pas s'il vous faut plus d'informations.

  2. #2
    Modérateur
    Avatar de wax78
    Homme Profil pro
    R&D - Palefrenier programmeur
    Inscrit en
    Août 2006
    Messages
    4 096
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : R&D - Palefrenier programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 4 096
    Par défaut
    Citation Envoyé par Saenlig Voir le message
    J'avais lu je ne sais plus où que ce n'était pas possible de lire et écrire sur des disques SCSI en java, est-ce vrai ?
    Je ne vois pas le rapport avec Java entres nous ... (mais je ne vois pas toujours claire).

    Apparement tu es sous linux. Sous linux tout étant fichier, java permettant aussi de manipuler (comme tout autre langage) des fichiers en se basant sur l'os je pense que le problème ne se pose pas de savoir si java peut ou ne pas le faire.

    Apres je developpe quasi les soft sous windows donc forcement je me trompe peut etre ...

    Edit : Tu dis que ca marche avec de simple fichier mais pas si tu prends "/dev/qlqchose" ?
    (Les "ça ne marche pas", même écrits sans faute(s), vous porteront discrédit ad vitam æternam et malheur pendant 7 ans)

    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2011
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2011
    Messages : 3
    Par défaut
    Pour la question si Java peut le faire ou pas, on m'avait laissé entendre que pour le bas niveau c'était pas évident du tout à utiliser du Java, donc je demandais justement si c'était vrai ou non, j'ai ma réponse maintenant.

    Sinon oui avec des simple fichiers qu'ils soient binaires ou texte cela marche parfaitement, mais quand je test sur un disque en /dev/sda1 pour ma part, la fonction s'exécute mais c'est comme si rien ne s'enregistrait dessus...

    Edit : après discussion avec les personnes de mon service, il semblerait que j'avais oublié de prendre en compte le fait qu'un disque est composé de blocs à ne pas toucher sous faute de le rendre inutilisable. Et comme pour mes tests j'enregistrais les données du secteur à 100, cela écraserait (donc l'écriture se ferait bien) le boot bloc ou bloc de référence du disque qui est situé en début de partition. Je me penche de ce côté dès demain.

  4. #4
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    si tu fais des copie directement avec les device, faut pas perdre de vue, qu'il faudra faire des copie intégrales et qu'il faudra que le device source soit bien démonté pour ne pas avoir de données instable.

    De plus ce que tu fait, ca reviens à faire directement ceci en ligne de commande linux

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    dd if=/dev/sda of=/dev/nst0

  5. #5
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2011
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2011
    Messages : 3
    Par défaut
    Pour une copie globale d'un média oui, mais je dois également avoir la possibilité de faire des copie partielle d'une disque en ne sélectionnant que des secteurs précis du disque à copier sur un fichier ou autre média.

    Par exemple copier les secteurs 250 à 1000 sur un autre média et non pas la totalité, donc je ne peux pas utiliser dd dans ce cas là.

    Mais la copie est une des opération que mon programme peut effectuer, il y a le checksum du média, l'affichage de son contenu, rechercher de données sur le média, effacement du média et comparaison entre deux média.

    Pour les bandes magnétiques, j'utilise dump pour traiter les données dessus (si vous avez mieux à me conseiller je suis preneur) étant donné qu'on ne peut pas y accéder comme pour les disques.

    Donc c'est juste au niveau de comment réussir à exploiter les données d'un disque (lecture / écriture) sans le saborder, que je bloque.

Discussions similaires

  1. Problème de lecture\modification\écriture
    Par sword88 dans le forum Général Python
    Réponses: 4
    Dernier message: 03/05/2013, 11h55
  2. Problème de lecture\modification\écriture
    Par sword88 dans le forum Programmation multimédia/Jeux
    Réponses: 0
    Dernier message: 02/05/2013, 23h47
  3. [VB.NET]Problème de lecture et écriture sur fichier texte
    Par zouhib dans le forum Windows Forms
    Réponses: 25
    Dernier message: 23/05/2006, 15h30
  4. [fread] Problème de lecture de buffer
    Par karl3i dans le forum C
    Réponses: 2
    Dernier message: 25/09/2003, 09h21
  5. Réponses: 4
    Dernier message: 23/07/2003, 13h07

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo