2017-08-12 6 views
0

Dans ce programmeur j'ai trouvé les nombres premiers dans 100 premiers nombres. Les nombres sont dans le format INT et le nombre total d'eux est dans le double format. Je veux lire ce fichier et je l'ai fait uniquement pour les numéros INT mais je ne sais pas chaud pour le faire pour DOUBLE nombre. Voici le code:Est-ce que quelqu'un sait comment lire les différents nombres binaires forment un fichier? (Comment séparer ces deux types)

package int1; 

import java.io.File; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.nio.ByteBuffer; 
import java.nio.DoubleBuffer; 
import java.nio.IntBuffer; 
import java.nio.LongBuffer; 
import java.nio.channels.FileChannel; 

public class int_upis { 
public static void main(String[] args) { 
    File a = new File("C:\\Users\\Jovan\\Desktop\\Pisem.txt"); 
    FileOutputStream fos = null; 
    try { 
     fos = new FileOutputStream(a); 
    } catch (Exception e) { 

    } 
    FileChannel ch = fos.getChannel(); 
    ByteBuffer bff = ByteBuffer.allocate(100); 
    IntBuffer ibf = bff.asIntBuffer(); // Int type 
    DoubleBuffer db = bff.asDoubleBuffer(); // Double type 
    double p = 0; 
    for (int i = 1; i <= 100; i++) { 
     int t = 0; 
     for (int j = 1; j <= i; j++) { 
      if (i % j == 0) { 
       t = t + 1; 
      } 

     } 
     if (t < 3) { 
      p = p + 1; // number of Prime numbers 
      System.out.println(i); 
      ibf.put(i); 
      bff.position(4 * ibf.position()); 
      bff.flip(); 
      try { 
       ch.write(bff); 
       bff.clear(); 
       ibf.clear(); 
      } catch (IOException e) { 

      } 
     } 

    } 

    try { 
     db.put(p); //At the end of the txt-file i put double format of number (Number of Prime numbers) 
     bff.position(8*db.position()); 
     bff.flip(); 
     ch.write(bff); 

     System.out.println("File is writen with: " + ch.size()); 
     ch.close(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

} 

} 

Maintenant j'ai essayé de lire ce fichier:

public class int_ispis { 
public static void main(String[] args) throws IOException { 
    File a = new File("C:\\Users\\Jovan\\Desktop\\Pisem.txt"); 
    FileInputStream fis = null; 
    try { 
     fis = new FileInputStream(a); 
    } catch (Exception e) { 

    } 
    FileChannel ch = fis.getChannel(); 
    ByteBuffer bff = ByteBuffer.allocate(6 * 4); 

Ceci est une ligne du premier numéro mis dans un tableau 6 rangs (cette ligne ci-dessous):

int[] niz = new int[6]; 
    System.out.println("Pre flipa: " + bff.position() + " " + bff.limit()); 
    System.out.println("++++++++++++++++++++++++++++++++++++"); 
    while (ch.read(bff) != -1) { 

     bff.flip(); 
     System.out.println(); 
     System.out.println("Posle flipa: " + bff.position() + " " + bff.limit()); 
     IntBuffer ib = bff.asIntBuffer(); 
     System.out.println("IB: " + ib.position() + " " + ib.limit()); 

     int read = ib.remaining(); 
     System.out.println(read); 

Quand il vient à la fin du fichier, il met nombre Double en entier et écrit un mauvais numéro (Comment séparer la forme Entier numéro double?)

 ib.get(niz, 0, ib.remaining()); 
     for (int i = 0; i < read; i++) { 
      System.out.print(niz[i] + " "); 

     } 
     System.out.println(); 
     System.out.println("================================="); 
     ib.clear(); 
     bff.clear(); 

    } 
} 
} 

Répondre

0

Un fichier binaire n'a pas de "séparateurs".

Vous devez connaître la structure du contenu du fichier et utiliser cette connaissance.

Dans ce programmeur j'ai trouvé les nombres premiers dans le premier 100. Les nombres sont au format INT et le nombre total d'entre eux est au format DOUBLE.

Cela signifie qu'il n'y a qu'une seule valeur long dans le fichier et c'est dans la dernière 8 octets. Il vous suffit donc de vérifier si la position actuelle est fileLenght - 8 puis de lire ces 8 derniers octets en tant que valeur long.