在java中读取二进制文件并显示它

时间:2014-12-02 20:08:46

标签: java binaryfiles

我试图读取我为至少有5枚金牌的国家创建的二进制文件。当我试图读取文件然后显示它。表明: ?????††††††††††††††???†††††††††††††††† 27 27 38 92。它显示部分信息。这是我目前的代码:

import java.io.*;
import java.util.*;
class Pays
    implements Comparable<Pays>
{

    private String nom;
    private int gold;
    private int silver;
    private int bronze;
    private int sum;

    public Pays(String nom,int gold,int silver, int bronze,int sum)
    {

        this.nom = nom;
        this.gold=gold;
        this.silver=silver;
        this.bronze=bronze;
        this.sum=sum;


    }

    public int compareTo(Pays autre) {

      return nom.toUpperCase().trim().compareTo( autre.nom.toUpperCase().trim() );
    }

    public String getNom(){ return nom; }
    public int getGold(){ return gold; }
    public int getSilver(){ return silver; }
    public int getBronze(){ return bronze; }
    public int getSum(){return sum;}

    public boolean equals(Object obj)
    {
        if (this == obj)
             return true;
        else
            if ( ! (obj instanceof Pays))
                  return false;
            else
            {
                Pays autre = (Pays) obj;
                return nom.trim().equalsIgnoreCase(autre.nom.trim());
            }
    }

    public void ecrire(DataOutputStream aCreer)
       throws IOException
       {    
            aCreer.writeBytes(nom);
            aCreer.writeInt(gold);
            aCreer.writeInt(silver);
            aCreer.writeInt(bronze);
            aCreer.writeInt(sum);
       }

}

class numba3{
    static LinkedList<Pays> lireCreer(String nomFichier)
        throws IOException
    { LinkedList<Pays> liste = new LinkedList<Pays>(); 
      boolean existeFichier = true ; 

       FileReader fr = null; 


       try {
             fr = new FileReader (nomFichier) ;
       }

       catch ( java.io.FileNotFoundException erreur) {
            System.out.println("Probleme d'ouvrir le fichier " +
                 nomFichier);
            existeFichier = false ; 
       }

       if (existeFichier) {


          BufferedReader entree = new BufferedReader(fr);
          boolean finFichier = false ;


          while ( !finFichier ) {

           String uneLigne = entree.readLine();


           if (uneLigne == null)
                finFichier = true ;
           else {

                String nom = uneLigne.substring(0, 38);
                int   gold   = Integer.parseInt(uneLigne.substring(38,43).trim());
                int silver = Integer.parseInt(uneLigne.substring(43,48).trim());
                int bronze  = Integer.parseInt(uneLigne.substring(48).trim());
                int sum=gold+silver+bronze;


                liste.add(new Pays(nom,gold,silver,bronze,sum));
           }
          }
         entree.close();
        }

      return liste;
    }
static void afficher(LinkedList<Pays> liste,int numero){
    for(int i=0;i<numero;i++){

        System.out.printf("%30s %10d %10d %10d %10d\n",liste.get(i).getNom(),liste.get(i).getGold(),liste.get(i).getSilver(),liste.get(i).getBronze(),liste.get(i).getSum());
    }
}
public static void quickSort(LinkedList<Pays> liste, int low, int high) {

        if (liste.isEmpty() == true || liste.size()== 0)
            return;

        if (low >= high)
            return;

        int middle = low + (high - low) / 2;
        int pivot = liste.get(middle).getSum();


        int i = low, j = high;
        while (i <= j) {
            while (liste.get(i).getSum() > pivot) {
                i++;
            }

            while (liste.get(j).getSum() < pivot) {
                j--;
            }

            if (i <= j) {
                Pays temp=liste.get(i);
                liste.set(i,liste.get(j));
                liste.set(j,temp);
                i++;
                j--;
            }
        }


        if (low < j)
            quickSort(liste, low, j);

        if (high > i)
            quickSort(liste, i, high);
    }
static void afficherPays(LinkedList<Pays>liste,String nom){
        for(int i=0;i<liste.size();i++){
            if(liste.get(i).equals(new Pays(nom, 0, 0, 0,0))){
                    System.out.printf("%30s %10d %10d %10d %10d\n",liste.get(i).getNom(),liste.get(i).getGold(),liste.get(i).getSilver(),liste.get(i).getBronze(),liste.get(i).getSum());

            }               
        }

    }   
static void creerBinaire(LinkedList<Pays> liste, int gold,String nomBinaire)    
        throws IOException
    {

      DataOutputStream aCreer = new DataOutputStream
                            ( new FileOutputStream(nomBinaire));

      for (int i = 0; i < liste.size(); i++)
      {
         if ( liste.get(i).getGold() >= gold)
                  liste.get(i).ecrire(aCreer);
      }

      aCreer.close();
      System.out.println("\nOn vient de creer le fichier binaire : " + nomBinaire);
    }

static LinkedList<Pays> readBinaire(String nomALire)
            throws IOException{
      System.out.println("On lit le fichier binaire du nom " + nomALire);

      LinkedList<Pays> unVect = new LinkedList<Pays> ();

      DataInputStream aLire = new DataInputStream
                            ( new FileInputStream(nomALire));

      boolean finFichier = false ;

      String nom = "";
      int rang = 0;

      while ( ! finFichier  ) {
        try {
            for (int i = 0; i < 19; i++)
             nom += aLire.readChar();

        } catch ( EOFException e ) {
            finFichier = true;
          }

        if (!finFichier) {
        int  gold=aLire.readInt(),
             silver=aLire.readInt(),
             bronze=aLire.readInt(),
             sum=aLire.readInt();

         Pays pers = new Pays(nom, gold, silver, bronze, sum);
         unVect.add(pers);

        }
      }
       aLire.close();
       return unVect;
    }


    public static void main(String[]args)throws IOException
        {
        LinkedList<Pays> liste = lireCreer("Olym_ete.txt");

        System.out.println("");
        System.out.println("1)Determine et afficher les 5 premier pays qui ont gagne plus de medailles en totale: ");
        quickSort(liste,0, liste.size()-1);
        afficher(liste,5);

        System.out.println("");
        System.out.println("2)Afficher les information des pays FRANCE, JAPON, ESPAGNE: ");
        afficherPays(liste,"FRANCE");
        afficherPays(liste,"JAPON");
        afficherPays(liste,"ESPAGNE");

        System.out.println("");
        System.out.println("3)Cree a partir de la liste un fichier binaire qui ont gagne au moins de 5 medailles en or: ");
        creerBinaire(liste, 5,"AtLeastFiveGold.bin");
        LinkedList<Pays> plusKeFive = readBinaire("AtLeastFiveGold.bin");
        System.out.println(plusKeFive.size());
        System.out.printf("%30s %10d %10d %10d %10d\n",plusKeFive.get(1).getNom(),plusKeFive.get(1).getGold(),plusKeFive.get(1).getSilver(),plusKeFive.get(1).getBronze(),plusKeFive.get(1).getSum());
    }
}

我无法弄清楚如何摆脱这些符号。我怀疑我在读取readBinaire()中的二进制文件时犯了一个错误,但我似乎无法弄清楚我哪里出错了。

1 个答案:

答案 0 :(得分:2)

Java中的char是一个16位Unicode字符。 A&#34;字节&#34;是一个8位字节。

您正在使用writeBytes将字符串写为38个字节,但readChar以19个字符的形式将其读回。 writeBytes将写入字符串的每个16位字符的低位8位。因此,如果您的字符串是"ABCD",那么它将写入的字节是

0x41 0x42 0x43 0x44

然后当你以16位字符读回来时,它会将前两个字符读作

0x4142 0x4344

0x4241 0x4443

取决于字节排序的处理方式。无论哪种方式,您将获得一些奇怪的Unicode字符,而不是"ABCD",其代码点为U + 4142或U + 4241,以及U + 4344或U + 4443。 (它们可能无法正确显示。)