这个问题与线程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();
}
}
}
使用的样本数据文件包含以下数据。
答案 0 :(得分:2)
此代码中存在几个问题
附注:您在循环开始时将文件指针设置为零,这将在您第一次读取后更改,因此您需要跟踪文件指针。由于删除发生在char by char上,您需要找到记录的长度并构造'delete'字符串。
顺便说一句,如果你想真正摆脱被删除的字符,你最好把文件读到一个缓冲区,做所有的读取和放大。写然后转储文件。只写白色空格字符(或空字符串)不会向前移动字符。