通过按钮操作从文件中删除一行

时间:2013-03-12 13:22:52

标签: java swing jtable jbutton

是的,我通过比较和匹配来搜索方法以删除特定的行,但是我的搜索情况与我搜索的情况不同,并且发生了错误的操作。

此处的代码是按钮actionPerformed的{​​{1}}。它的作用是从表中删除选定的单元格,还意味着从文件btnRemove中删除相应的单元格(字符串)值

然而,会发生的情况是代码会删除整个文件并留空,留下1个空行,而不仅仅是我要删除的行。

Activities.dat

2 个答案:

答案 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()的值分配给它(并且之后不会更改),那也会更好。此外,您在之前设置[rowcolumn] 的值。您将搜索""(如果不是一个好主意,则搜索任何内容)。尝试做这样的事情:

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