Listing 3: Employee.java — A fixed-length employee data record class

import java.io.*;

// Illustrates fixed-length-record I/O

public class Employee
{
    // Attributes:
    int empno;
    String last;
    String first;

    // Class constants:
    static final int LAST_MAX = 15;
    static final int FIRST_MAX = 15;
    static final int size = LAST_MAX*2 + FIRST_MAX*2 + 4;
    static final byte fillByte = (byte) 0xFF;

    public Employee(String last, String first, int empno)
    {
        this.last = last;
        this.first = first;
        this.empno = empno;
    }

    static void stringToBytes(String s, int max, byte[] dest,
                              int offset)
    {
        // Note that max must be even, so we
        //   don't get half a char.
        byte[] bytes = s.getBytes();
        for (int i = 0; i < max; ++i)
        {
            if (i < bytes.length)
                dest[i + offset] = bytes[i];
            else
                dest[i + offset] = fillByte;
        }
    }

    public byte[] stringsToBytes()
    {
        byte[] buffer = new byte[LAST_MAX*2 + FIRST_MAX*2];
        stringToBytes(last, LAST_MAX*2, buffer, 0);
        stringToBytes(first, FIRST_MAX*2, buffer, LAST_MAX*2);
        return buffer;
    }

    public void write(RandomAccessFile f) throws IOException
    {
        f.write(stringsToBytes());
        f.writeInt(empno);
    }

    public void read(RandomAccessFile f) throws IOException
    {
        byte[] buffer = new byte[LAST_MAX*2 + FIRST_MAX*2];
        f.readFully(buffer);

        last = new String(buffer, 0, 
                       findDelim(buffer, 0, LAST_MAX*2));
        first = new String(buffer, LAST_MAX*2,
                       findDelim(buffer, LAST_MAX*2, 
                          FIRST_MAX*2));
        empno = f.readInt();
    }
    
    public String toString()
    {
        return "{" + last + "," + first + "," + empno + "}";
    }

    int findDelim(byte[] buffer, int start, int max)
    {   // Find first occurrence of 'fillbyte' in
        //   a trailing substring
        // ... implementation omitted
    }
}
— End of Listing —