CIS 35A: Introduction to Java Programming

Home | Green Sheet | Lectures | Assignments | FAQ | Grades

Files

Text and Binary Files
Random-access files
Class with a random-access file

A class that works with a random-access file

import java.io.*;
import java.util.*;

public class ProductRandomFile implements ProductDAO
{
    private RandomAccessFile productsFile = null;
    private ArrayList productCodes = null;

    private final int PRICE_SIZE = 8;  // doubles are 8 bytes
    private final int RECORD_SIZE =
        CODE_SIZE * 2 +          // from ProductConstants interface
        DESCRIPTION_SIZE * 2 +   // from ProductConstants interface
        PRICE_SIZE;
    private final String DELETION_CODE = "    ";

    public ProductRandomFile()
    {
        try
        {
            productsFile =
                new RandomAccessFile("products.ran", "rw");
            productCodes = this.getCodes();
        }

        catch(FileNotFoundException fnfe)
        {
            fnfe.printStackTrace();
        }
    }

    public void finalize()
    {
        try
        {
            if (productsFile != null)
                productsFile.close();
        }
        catch(IOException ioe)
        {
            ioe.printStackTrace();
        }
    }

    //*************************************************
    // Private methods for reading products
    //*************************************************

    private int getRecordCount() throws IOException
    {
        int recordCount = (int) productsFile.length() / RECORD_SIZE;
        return recordCount;
    }
    private int getRecordNumber(String productCode)
    {
        for (int i = 0; i < productCodes.size(); i++)
        {
            String code = productCodes.get(i);
            if (productCode.equals(code))
                return i;
        }
        return -1;  // no record matches the product code
    }

    private Product getRecord(int recordNumber) throws IOException
    {
        if (recordNumber >=
            0 && recordNumber < this.getRecordCount())
        {
            productsFile.seek(recordNumber * RECORD_SIZE);

            String code = IOStringUtils.getFixedString(
                productsFile, CODE_SIZE);
            String description = IOStringUtils.getFixedString(
                productsFile, DESCRIPTION_SIZE);
            double price = productsFile.readDouble();

            Product product = new Product(code, description, price);
            return product;
        }
        else
            return null;
    }

    private ArrayList getCodes()
    {
        try
        {
            ArrayList codes = new ArrayList();
            for (int i = 0; i < this.getRecordCount(); i++)
            {
                productsFile.seek(i * RECORD_SIZE);
                codes.add(IOStringUtils.getFixedString(
                    productsFile, CODE_SIZE));
            }
            return codes;
        }
        catch(IOException ioe)
        {
            ioe.printStackTrace();
            return null;
        }
    }

    //*********************************************************
    // Public methods for reading products
    //*********************************************************

    public ArrayList<Product> getProducts()
    {
        ArrayList<Product> products = new ArrayList<Product>();
        try
        {
            for (int i = 0; i < productCodes.size(); i++)
            {
                // if record has been marked for deletion, don't add to products array list
                if (!productCodes.get(i).equals(DELETION_CODE))
                {
                    Product product = this.getRecord(i);
                    products.add(product);
                }
            }
        }

        catch(IOException ioe)
        {
            ioe.printStackTrace();
            return null;
        }
        return products;
    }

    public Product getProduct(String productCode)
    {
        try
        {
            int recordNumber = this.getRecordNumber(productCode);
            Product product = this.getRecord(recordNumber);
            return product;
        }
        catch(IOException ioe)
        {
            ioe.printStackTrace();
            return null;
        }
    }

    //*************************************************
    //* Private methods for writing products
    //*************************************************

    private boolean writeProduct(Product product, int recordNumber)
    {
        try
        {
            productsFile.seek(recordNumber * RECORD_SIZE);
            IOStringUtils.writeFixedString(productsFile,
                CODE_SIZE, product.getCode());
            IOStringUtils.writeFixedString(productsFile,
                DESCRIPTION_SIZE, product.getDescription());
            productsFile.writeDouble(product.getPrice());
            return true;
        }
        catch(IOException ioe)
        {
            ioe.printStackTrace();
            return false;
        }
    }

    //*************************************************
    //* Public methods for writing products
    //*************************************************

    public boolean addProduct(Product product)
    {
        productCodes.add(product.getCode());
        int recordNumber = this.getRecordNumber(product.getCode());
        return this.writeProduct(product, recordNumber);
    }

    public boolean updateProduct(Product product)
    {
        int recordNumber = this.getRecordNumber(product.getCode());
        if (recordNumber != -1)
            return this.writeProduct(product, recordNumber);
        else
            return false;
    }

    public boolean deleteProduct(Product product)
    {
        int recordNumber = this.getRecordNumber(product.getCode());
        if (recordNumber != -1)
        {
            productCodes.set(recordNumber, DELETION_CODE);
            Product p = new Product(DELETION_CODE, "", 0);
            return this.writeProduct(product, recordNumber);
        }
        else
            return false;
    }
}
Previous | Introduction | Connect | Read and write | Fixed-length strings | Test random access | Class with a random-access file | Address book