0

I have a question about handling binary files. I am trying to create a method called read in a user defined class called Record that will handle the data from the file.

Each record has 84bytes and the first 20bytes is a String, and the rest, 64bytes is for 16 int values. My code so far looks like this:

import java.io.*;

class Record
{
    private String country;
    private int[] popData = new int[16];
    
    public void read(DataInputStream is) throws IOException
    {
        byte[] temp = new byte[21];
        for (int i = 0; i < 20; i++)
        {
            temp[i]= is.readByte();
            if (temp[i] == '\0')
                temp[i] = ' ';
        }
        
        String convert = new String(temp);
        country = convert;
        
        for (int i = 0; i < 16; i++)
            popData[i] = is.readInt();
    }
    
    public String getName()
    {
        return country;
    }
    
    public int getPopulation(int y)
    {
        int dat = 0;
        if (y < 1986 || y > 2001)
            dat = 0;
        else
        {
            if (y == 1986)
                dat = 0;
            else if (y == 1987)
                dat = 1;
            else if (y == 1988)
                dat = 2;
            else if (y == 1989)
                dat = 3;
            else if (y == 1990)
                dat = 4;
            else if (y == 1991)
                dat = 5;
            else if (y == 1992)
                dat = 6;
            else if (y == 1993)
                dat = 7;
            else if (y == 1994)
                dat = 8;
            else if (y == 1995)
                dat = 9;
            else if (y == 1996)
                dat = 10;
            else if (y == 1997)
                dat = 11;
            else if (y == 1998)
                dat = 12;
            else if (y == 1999)
                dat = 13;
            else if (y == 2000)
                dat = 14;
            else if (y == 2001)
                dat = 15;
        }
        return popData[dat];
    }
}

public class Asst02
{
    public static void main(String[] args) throws IOException
    {
        long numRec;
        
        numRec = (new File("popdata.bin")).length() / 84;
        Record[] rec = new Record[(int)numRec];
        DataInputStream in = new DataInputStream(new FileInputStream("popdata.bin"));
        
        for (int i = 1; i < numRec; i++)
        {
            rec[i].read(in);
        }
        
        System.out.println(rec[1]);
    }
}

When I run the program it gives me a NullPointerException in main at the for loop. What am I doing wrong?

3
Contributors
5
Replies
6
Views
7 Years
Discussion Span
Last Post by ~s.o.s~
0

This is exactly the sort of thing that RandomAccessFile is meant for.

Um, no. I don't know if you see it but I am using DataInputStream to read the binary file sequentially and store all the data into an object array.

0

In any case, you're getting an NPE, because each element of the array is null until you actually define something there. I.E.

Object[] i = new Object[3];

is the same as doing

Object[] i = { null, null, null };

add a

rec[i] = new Record()

before the call to read.

RandomAccessFile is still the way to go here. Especially if you're using it as a "DB".

Edited by masijade: n/a

0

The entire else block code can be replaced with dat = y - 1986; .

BTW, how are you persisting the data? DataOutputStream or plain old FileOutputStream?

Edited by ~s.o.s~: n/a

This article has been dead for over six months. Start a new discussion instead.
Have something to contribute to this discussion? Please be thoughtful, detailed and courteous, and be sure to adhere to our posting rules.