Deleting a Record Using Random Access File
Asked Answered
B

1

2

This question is related to thread Address Book Functionality which was closed considering being too broad.

I was developing a small test application using Random Access File. I am attaching the source code with it. I want to delete a record from the file. I have searched similar threads on stackoverflow Delete Record Random Access File.These threads suggest setting a flag as deleted against a record and not display it. I want to actually delete it. I tried to search the record and tried to append a null record to that file pointer position. Nothing happens. Please suggest, whats the correct way to do it?

I am attaching the source code below.

package ben.io;

import java.io.Serializable;

/**
 * @author Ben
 * This is an object to hold phone book information
 */
public class PhoneBook implements Serializable {
  String personName ;
  String phoneNumber ;
  String location ;

  public PhoneBook() {
  }

  public PhoneBook(String personName, String phoneNumber, String location) {
    this.personName = personName;
    this.phoneNumber = phoneNumber;
    this.location = location;
  }

  public String getPersonName() {
    return personName;
  }

  public void setPersonName(String personName) {
    this.personName = personName;
  }

  public String getPhoneNumber() {
    return phoneNumber;
  }

  public void setPhoneNumber(String phoneNumber) {
    this.phoneNumber = phoneNumber;
  }

  public String getLocation() {
    return location;
  }

  public void setLocation(String location) {
    this.location = location;
  }

  public String toString(){
    return "Name: " + personName + " Phone Number: " + phoneNumber + " Address: " + location;
  }
}

The main class having all functionality.

package ben.io;

import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;

import com.sun.xml.internal.ws.util.StringUtils;

/**
 * @author Ben
 * This class is responsible for testing various operations for Random Access File
 */
public class RandomAccessFileDriverTest {
  public static void main(String[] args) throws IOException {
    //Creating an instance of Random Access File
    RandomAccessFile randomAccessFile = new RandomAccessFile("D:\\2014\\Habit Course 1 Study Targets\\Studies\\files\\ben.txt","rw");

    //Finding size of Random Access File - Size is basically 36 why showing 38?
    long size = randomAccessFile.length();
    System.out.println("Size of Random Access file is: " + size);

    //Finding position of File Pointer
    long positionOfFilePointer = randomAccessFile.getFilePointer();
    System.out.println("File Pointer Position: " + positionOfFilePointer);

    //Reading Data from a Random Access  File using readLine
   /* randomAccessFile.seek(3);
    String data = randomAccessFile.readLine();
    System.out.println("Data is: " + data);*/

    //Reading bytes from a Random Access File using read()
   /* byte[] byteData = new byte[100];
    randomAccessFile.read(byteData,3,18);
    String strData =  new String(byteData);
    System.out.println("Data using Byte is: " + strData);
*/
    //Adding record to Random Access File
    PhoneBook phoneBook = new PhoneBook("Ben","12345","UAE");
    //adding record for random access file
//    randomAccessFile  = addRecord(phoneBook,randomAccessFile);
    //view records for random access file
  //  viewAll(randomAccessFile);
    //Searching a record - Give a phone number as a key to Search
    PhoneBook recordSearched =  searchRecord("123456",randomAccessFile);
    if(recordSearched == null){
      System.out.println("Input is not valid");
    }
    else{
    System.out.println(recordSearched);
    }

    //Delete a Record From File
    deleteRecord("123456",randomAccessFile);

    //View the records
    viewAll(randomAccessFile);

  }

  public static RandomAccessFile addRecord(PhoneBook phoneBook, RandomAccessFile randomAccessFile) throws IOException {
    long length = randomAccessFile.length();

    //seeking position at end of file
    randomAccessFile.seek(length);
    StringBuffer stringBuffer = new StringBuffer();
    stringBuffer.append(phoneBook.getPersonName()).append(":").append(phoneBook.getPhoneNumber()).
        append(":").append(phoneBook.getLocation());
    if(randomAccessFile.getFilePointer() != 0){
    randomAccessFile.writeBytes(System.getProperty("line.separator"));
    }
    randomAccessFile.writeBytes(stringBuffer.toString());

    return randomAccessFile;
  }

  public static PhoneBook searchRecord(String phoneNumber , RandomAccessFile randomAccessFile) throws IOException {
    PhoneBook phoneBook = null ;
    //Setting file pointer to start of file
    randomAccessFile.seek(0);
    String data = randomAccessFile.readLine();
    while (data != null ){
      String[] recordToBeSearched = data.split(":");
      String contactNo = recordToBeSearched[1];
      if(contactNo != null && contactNo.equals(phoneNumber)){
        phoneBook = new PhoneBook(recordToBeSearched[0],recordToBeSearched[1],recordToBeSearched[2]);
        break ;
      }
      data = randomAccessFile.readLine();
    }

    return phoneBook;
  }

  public static void  deleteRecord(String phoneNumber, RandomAccessFile randomAccessFile) throws IOException {
    PhoneBook phoneBook = null ;
    //Setting file pointer to start of file
    randomAccessFile.seek(0);
    String data = randomAccessFile.readLine();
    while (data != null ){
      String[] recordToBeSearched = data.split(":");
      String contactNo = recordToBeSearched[1];
      if(contactNo != null && contactNo.equals(phoneNumber)){
        String blankData = new String();
        randomAccessFile.writeBytes(blankData);
        break ;
      }
      data = randomAccessFile.readLine();
    }
  }

  public static void viewAll(RandomAccessFile randomAccessFile) throws IOException {
    String data ;
    //This is responsible for reading complete file
    randomAccessFile.seek(0);
    data = randomAccessFile.readLine();
    while (data != null){
      System.out.println(data);
      data = randomAccessFile.readLine();
    }

  }
}

The sample data file used has the following data.

enter image description here

Binoculars answered 4/2, 2014 at 18:53 Comment(0)
V
2

There are couple of issues in this code

  1. You are writing 12345 and looking for 123456 in delete (simple one)
  2. If you look at what writeBytes method does, it creates a byte array of size equal to the length of the string you write. Which in your case is zero, so nothing gets written. So what you need to write is a string whose length is same as the number of chars you want to delete (think of xxxxx as delete string as referred in other posts)

Side note: You are setting file pointer to zero in the beginning of the loop which will change after your first read, so you need to keep track of the file pointer. Since the delete happens on char by char, you need to find the length of the record and construct the 'delete' string.

Btw, if you want to actually get rid of the deleted characters, you are better of reading the file of to a buffer, do all the read & write then dump the file back. Just writing white space chars (or empty string) wont move the characters forward.

Viol answered 4/2, 2014 at 19:43 Comment(1)
thank you so much. I am going to try as you suggested and move revert back with the results.Binoculars

© 2022 - 2024 — McMap. All rights reserved.