如何在二进制文件中读取整数和日期

时间:2012-07-19 06:42:35

标签: java binary

我有一个记录的二进制文件。每条记录的格式如下: 每条记录包括两个整数,车辆数量和涉及的人数;浮点数,严重性代码;以及包含事故日期的字符串。此日期采用以下形式:三个月的缩写后跟一个空格,然后是一个月中的一天后跟一个逗号,最后一个年份可以用两位数或四位数字表示。

以下是代码。但我没有得到正确答案..

我的代码:

import java.io.*;

public class BoydBAssignment5_Ver1 {

    public static void main(String s[]) {
        DataInputStream input1;                     //you need these two variable for a file
        File            infile1;
        input1 = null;

        BoydBAssignment5_Ver1 tfr;                  //this is your program object
        tfr = new BoydBAssignment5_Ver1();
        try{    //try for open
            infile1 = new File("assign5.data");
            input1 = new DataInputStream(new FileInputStream(infile1));
        } catch (IOException i){
            i.printStackTrace();}

        tfr.read_records(input1);
        try {   //try for close
            input1.close();
        } catch (IOException i) {
            System.out.println("error in close");
        }
    }

    private void read_records(DataInputStream is2) {
        int totalVehicles=0,totalPersons=0;
        int numVehicles;
        int numPeople;
        char ch;

        try {   //try for read
            while(true) {
                numVehicles=is2.readInt();
                if(numVehicles==0)
                break;

                totalVehicles+=numVehicles;
                System.out.print("\n"+numVehicles+"\t");
                numPeople=is2.readInt();
                if(numPeople==0)
                break;

                totalPersons+=numPeople;
                System.out.print(numPeople+"\t");
                System.out.print(is2.readDouble()+"\t");
                /*System.out.print(is2.readLine()+"\n");
                    for(int k=0;k<4;k++)
                    {
                        is2.readByte();
                    }*/
                while((ch=(char)is2.readByte()) != 0x00) {
                    System.out.print(ch+"");
                }
            }

            System.out.println("\nTotal no of vehicles:"+totalVehicles);
            System.out.println("Total no of Persons:"+totalPersons);
            write_in_file(totalVehicles,totalPersons);
        } catch (IOException i) {
            System.out.println("error in write");
        }

    }

    private void write_in_file(int totalVehicles, int totalPersons) {
        try {
            FileWriter fstream = new FileWriter("finalOutput.data");
            BufferedWriter out = new BufferedWriter(fstream);
            out.write("Number of vehicles involved"+"\t"+totalVehicles);
            out.write("\nNumber of persons involved"+"\t"+totalPersons);
            out.close();
        } catch(Exception e) {
            e.printStackTrace();
        }
    }

}

输出::

  

148308 1 4.774904982E-314
  189429102 540161068 1.4275957977117199E-71
  512 576 6.903600071305329E-93 8,98   37966848 512 1.7668797952966E-311
  2006年3月4日   37966848 256 2.8513257442947E-311
  2011年4月8日   38683904 512 2.3101107177838E-311 Jun 14,06   38683904 256 6.792508527386E-312 Apr 22,2005   38683904 256 1.2216329768334E-311 10月1,04   38683904 768 2.3099515681247E-311 7月9,83   38813952 256 6.802588006634E-312 Aug 4. 1998   38813952 512 6.802588006634E-312 2011年6月14日   38813952 512 1.7667206456376E-311 Sep 8,99   39344128个
  车辆总数:576033218   总人数:540165485

请帮助我......谢谢!!

1 个答案:

答案 0 :(得分:2)

猜测是你的数据存储为little-endian。 DataInputStream是大端的。 (如果您不确定哪个字节序是http://en.wikipedia.org/wiki/Endianness

最简单的方法是将文件读入单个直接ByteBuffer,允许您设置字节顺序。