使用随机访问文件删除记录

时间:2014-02-04 18:53:57

标签: java java-io

这个问题与线程Address Book Functionality有关,因为过于宽泛而被关闭。

我正在使用随机访问文件开发一个小型测试应用程序。我正在附上源代码。我想从文件中删除一条记录。我在stackoverflow Delete Record Random Access File上搜索了类似的线程。这些线程建议将一个标志设置为对记录删除而不显示它。我想删除它。我试图搜索记录并尝试将空记录附加到该文件指针位置。什么都没发生。请建议,最新的方法是什么?

我附上下面的源代码。

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;
  }
}

具有所有功能的主类。

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();
    }

  }
}

使用的样本数据文件包含以下数据。

enter image description here

1 个答案:

答案 0 :(得分:2)

此代码中存在几个问题

  1. 您正在编写12345并在删除(简单的一个)
  2. 中寻找123456
  3. 如果查看writeBytes方法的作用,它会创建一个大小等于您编写的字符串长度的字节数组。在你的情况下,这是零,所以没有写入。所以你需要写的是一个字符串,其长度与你要删除的字符数相同(将xxxxx视为删除字符串,如其他帖子所述)
  4. 附注:您在循环开始时将文件指针设置为零,这将在您第一次读取后更改,因此您需要跟踪文件指针。由于删除发生在char by char上,您需要找到记录的长度并构造'delete'字符串。

    顺便说一句,如果你想真正摆脱被删除的字符,你最好把文件读到一个缓冲区,做所有的读取和放大。写然后转储文件。只写白色空格字符(或空字符串)不会向前移动字符。