Search code examples
javabinaryasn.1eofexceptioncdr

Java read .cdr-File


right now I#m trying to write a program which reads a .cdr-File. The Format of the CDR-File looks like this:

***************
                             * File header *
                             ***************
                           File length: 44142 bytes
                         Header length: 54 bytes
               High release identifier: Check the field extension below
               High version identifier: Version 6
                Low release identifier: Check the field extension below
                Low version identifier: Version 6
          File opening local timestamp: May 20 00:28 (+02:00 from UTC)
         Timestamp of last CDR on file: May 20 01:28 (+02:00 from UTC)
            Number of CDRs in the file: 130 CDRs
                  File sequence number: 386
           File closure trigger reason: File open-time limit reached
IP address of node generating the file: ff.ff.ff.ff::ffff:ac10:1438
                    Lost CDR indicator: 0 CDRs lost
         Length of CDR routeing filter: 0 bytes
          Length of private extensions: 0 bytes
             High release ID extension: Release 13
              Low release ID extension: Release 13

This is my code:

readBinary-method:

public Collection<Data> readBinary(String file) throws IOException, FileNotFoundException
    {
        ArrayList<Data> arrayList=new ArrayList<>();
        try(DataInputStream dis=new DataInputStream(new BufferedInputStream(new FileInputStream(file))))
        {
            while (dis.available()>0)
            {
                arrayList.add(new Data(dis.readUTF(), dis.readUTF(), dis.readUTF(), dis.readUTF(), dis.readUTF(), dis.readUTF(),dis.readUTF(), dis.readUTF(), dis.readUTF(), dis.readUTF(), dis.readInt(), dis.readUTF(), dis.readUTF(), dis.readUTF(), dis.readUTF(), dis.readUTF(), dis.readUTF(), dis.readUTF()));
            }
        }
        return arrayList;
    }

main:

public class Main implements Serializable
{
    public static void main(String[] args) throws IOException, ClassNotFoundException {
        Methoden m = new Methoden();
        try {
            ArrayList<Data> d1 = (ArrayList<Data>) m.readBinary("172.16.20.5601_-_386.20210520_-_0128+0200.cdr");
            System.out.println(d1);

            

        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

So my problem is, when i run the program I get an EOFException and I don't get why..

Maybe someone can help me with my problem


Solution

  • The first thing you need to read is the file length field from the file header. That's probably a single byte or maybe two bytes - check your specification. It looks like you're reading that using DataInputStream.readUTF, which is inappropriate for reading such a field.

    You need to read according to the file layout. You don't seem to be following the file layout and consequently happen to be trying to read more data than you should be, thus the exception.