2014-02-04 2 views
1

Этот вопрос относится к теме 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

ответ

2

Есть несколько вопросов в этом коде

  1. Вы пишете 12345 и ищете 123456 в удалении (простом)
  2. Если вы посмотрите на то, что writeBytes метод делает, это создает массив байтов размера, равный длине строки, которую вы пишете. Что в вашем случае равно нулю, поэтому ничего не записывается. Так что вам нужно написать строку, длина которой равна числу символов, которые вы хотите удалить (подумайте о xxxxx как о строке удаления, как указано в других сообщениях)

Примечание: вы устанавливаете указатель на файл ноль в начале цикла, который изменится после первого чтения, поэтому вам нужно отслеживать указатель файла. Поскольку удаление происходит на char по char, вам нужно найти длину записи и построить строку «удалить».

Btw, если вы хотите действительно избавиться от удаленных символов, вам лучше прочитать файл в буфер, сделать все чтение &, а затем выгрузить файл обратно. Просто написание символов пробела (или пустой строки) не перемещает символы вперед.

+0

большое спасибо. Я собираюсь попробовать, как вы предложили, и вернуться назад с результатами. – benz