是的,我通过比较和匹配来搜索方法以删除特定的行,但是我的搜索情况与我搜索的情况不同,并且发生了错误的操作。
此处的代码是按钮actionPerformed
的{{1}}。它的作用是从表中删除选定的单元格,还意味着从文件btnRemove
中删除相应的单元格(字符串)值
然而,会发生的情况是代码会删除整个文件并留空,留下1个空行,而不仅仅是我要删除的行。
Activities.dat
答案 0 :(得分:1)
看看RandomAccessFile。保留文件,直到要删除的行,然后将文件的其余部分从已删除部分的末尾复制到文件末尾,从开始删除的位置开始。
伪代码:
String line = "line I want to remove";
RandomAccessFile raf = openRandomAccessFile();
while(!line.equals(raf.readLine())) {
//just going to the point we want
}
long beginOfTheRemovingPointer = raf.getFilePointer()-size of removed line;
raf.seek(beginOfTheRemovingPointer);
raf.write(from beginOfTheRemovingPointer+size of removed line until the end);
raf.setLength(new length);
存在RandomAccessFile
方法。只需看看API就可以了解它们的确切作用。
答案 1 :(得分:1)
您在lineToRemove
循环中复制了while
。如果您将line
的类型更改为String
并将table.getValueAt(row, column).toString()
的值分配给它(并且之后不会更改),那也会更好。此外,您在之前设置[row
,column
] 的值。您将搜索""
(如果不是一个好主意,则搜索任何内容)。尝试做这样的事情:
btnRemove.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// Execute when button is pressed
int row = table.getSelectedRow();
int column = table.getSelectedColumn();
if (row >= 0) {
if (column >= 0) {
File file1 = new File("Activities.dat");
File temp = new File(file1.getAbsolutePath() + ".tmp"); // temp file
PrintWriter writer = null;
BufferedReader reader = null;
try {
writer = new PrintWriter(new BufferedWriter(new FileWriter(temp)), false);
reader = new BufferedReader(new FileReader(file1));
String lineToRemove = table.getValueAt(row, column).toString();
System.out.print(lineToRemove);
String currentLine;
while ((currentLine = reader.readLine()) != null) {
// trim newline when comparing with lineToRemove
String trimmedLine = currentLine.trim();
if (trimmedLine.equals(lineToRemove))
continue;
writer.println(currentLine);
}
} catch (IOException ex) {
Logger.getLogger(ActivityScreen.class.getName()).log(Level.SEVERE, null, ex);
} finally {
try {
if (reader != null)
reader.close();
if (writer != null) {
writer.flush();
writer.close();
file1.delete(); // delete the old one
temp.renameTo(file1); // make temp same as original
}
} catch (IOException e1) {
e1.printStackTrace();
}
}
table.setValueAt("", row, column);
}
}
}
});