2010-12-02 4 views
0

comment lire les numéros d'un fichier ??? Quand j'utilise la méthode readInt, j'obtiens un grand nombre, et il n'est pas égal au nombre d'un fichier.RandomAccessFile readInt

comment y remédier ??

Scanner est pas une bonne idée, becouse fichier contient plus de 1000 numéros de millions ... il prend très longtemps ...

oui, fichier texte.

Le fichier contient des symboles spatiaux divisés. par exemple (test.txt)

1 2 4 -4004 15458 8876


    public static void readByMemoryMappedFile(int buffer[], String filename) throws IOException 
    { 
     int count = 0; 

     RandomAccessFile raf = new RandomAccessFile(filename, "r"); 
     try { 
      MappedByteBuffer mapFile = raf.getChannel().map(MapMode.READ_ONLY, 0, raf.length()); 

      StringBuilder b = new StringBuilder(); 
      try { 
        while (mapFile.hasRemaining()) { 
         byte read = mapFile.get(); 
         if (read == ' ' && b.length() > 0) { 
           buffer[count++] = mapFile.getInt();//Integer.parseInt(b.toString()); 
           b.delete(0, b.length()); 
         } else { 
           b.append((char) read); 
         } 
        } 
      } catch (BufferUnderflowException e) { 
        // Всё, файл закончился 
      } 
      if (b.length() > 0) { 
        buffer[count++] = Integer.parseInt(b.toString()); 
      } 
     } finally { 
      raf.close(); 
     } 
    } 

ainsi, i attaché rapport:


// operation: time 
reading: 39719 // t0 
reading: 28297 // t1 
reading: 56719 // t2 
reading: 125735 // t3 
reading: 199000 // t4 

t0 < t1 t2 < < t3 t4 <

Comment changer le comportement de mon programme qui obtient ceci: t0 ~ t1 ~ t2 ~ t3 ~ t4 ???

+2

comment ils sont stockés? –

+2

la question clé, est les données dans un format binaire ou texte? Ce n'est pas clair dans votre question. –

Répondre

1

Si vous souhaitez accéder de manière aléatoire à des données, vous devez être en mesure de déterminer où commencer et où terminer. Avec un format de texte cela peut être difficile et vous devrez peut-être lire toutes les lignes/textes précédents pour trouver celui que vous voulez. Avec les formats binaires, vous pouvez calculer exactement où vous voulez lire, mais vous devez savoir comment le numéro a été codé. par exemple. était-ce un gros boutiste ou un petit boutiste?

Le scanner n'est peut-être pas optimal pour le texte et inutile pour les données binaires, mais il peut être plus rapide que nécessaire. La plupart du temps nécessaire pour numériser un fichier volumineux est le temps qu'il faut pour lire le disque (en supposant qu'il ne rentre pas dans la mémoire), vous pouvez accélérer de manière significative si le fichier se compresse bien, par exemple. texte plein de chiffres fait. Au lieu de prendre 20 secondes pour le lire, cela peut prendre seulement 2 secondes s'il est compressé. (Et il pourrait tenir dans le cache du fichier OS)

2

Une raison possible du grand nombre peut être due à l'ordre des octets. Java utilise Big Endian par défaut lors de la lecture d'un canal. Si le fichier que vous lisez est Little Endian, alors les petits nombres deviendront importants, car l'octet le moins significatif devient l'octet le plus significatif.

Vous pouvez modifier l'ordre des octets de ByteBuffer en utilisant la méthode de commande.

+1

Vous pouvez également utiliser ByteBuffer lors du mappage de la mémoire de vos données. –

1

Tout dépend de la façon dont les nombres sont stockés. Je suppose que la réponse courte est: D'une manière ou d'une autre, vous devez savoir où le nombre commence et où il se termine, et s'il est stocké en tant que texte ou en binaire, et si c'est en binaire quel est l'ordre des octets c'est-à-dire petit-boutiste ou big-endian.

S'il est stocké en tant que texte, créez une chaîne à partir des chiffres, puis appelez Integer.parseInt sur cette chaîne. (Ou s'il s'agit d'un nombre à virgule flottante, Double.parseDouble, etc. pour d'autres types de données.)

S'il est stocké sous la forme d'un entier binaire, lisez les octets dans un tableau, ou lisez-les un par un, puis multipliez par les pouvoirs de 256 et ajouter ensemble.Par exemple, supposons que vous ayez un nombre à quatre octets dans l'ordre little-endian. Vous l'avez lu dans un tableau d'octets de taille 4. Puis:

byte[] incoming=new byte[4]; 
file.read(incoming); 
int n=0; 
for (int p=0;p<4;++p) 
    n=n*256+incoming[p]; 
return n; 
+0

ça ne fonctionne pas ... –

+0

Vachovsky: Comprenez-vous que la façon dont vous lisez dépend de la façon dont le fichier a été écrit? Vous ne pouvez pas simplement décider de lire un fichier en tant que binaire s'il a été écrit en tant que texte ou vice-versa. – Jay

0

Si vos numéros sont stockés sous forme de texte readInt() ne fonctionnera pas. Vous devez analyser le fichier, c'est le seul moyen.

Questions connexes