1

はい、比較と照合によって特定の行を削除する方法を検索しましたが、検索した状況とは異なり、間違ったアクションが発生します。

ここのコードactionPerformedはボタン用btnRemoveです。これは、選択したセルをテーブルから削除し、対応するセル(文字列)の値をファイルから削除することも目的としています。Activities.dat

ただし、コードによってファイル全体が削除されて空白になり、削除したい行だけでなく1行が空になります。

btnRemove.addActionListener(new ActionListener() {

               public void actionPerformed(ActionEvent e)
               {

                    //Execute when button is pressed
                    int row = table.getSelectedRow(); 
                    int column = table.getSelectedColumn();

                    if (row >= 0) {
                        if (column >=0) {

                        for(int i=0; i<5; i++)
                         {
                            table.setValueAt("", row, column);     
                         }
                        }
                    }

                File file1 = new File("Activities.dat");
                try
                {
                    BufferedWriter writer = new BufferedWriter(new FileWriter(file1));
                    BufferedReader reader = new BufferedReader(new FileReader(file1));

                    Object lineToRemove = table.getValueAt(row, column);
                    lineToRemove.toString(); 
                    System.out.print(lineToRemove);

                    String currentLine;

                    while((currentLine = reader.readLine()) != null)
                    {
                    // trim newline when comparing with lineToRemove
                    String trimmedLine = currentLine.trim();

                    Object lineToRemove = table.getValueAt(row, column);
                    lineToRemove.toString();                                        

                    if(trimmedLine.equals(lineToRemove)) continue;
                        writer.write(currentLine);
                    }                                                               
                     writer.close();

                }
                catch (IOException ex)
                {
                    Logger.getLogger(ActivityScreen.class.getName()).log(Level.SEVERE, null, ex);
                }
               }
           }); 
4

2 に答える 2

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を見て、APIが正確に何をするかを確認してください。

于 2013-03-12T13:29:32.353 に答える
1

ループ内で複製lineToRemoveを作成しています。また、 toのタイプを変更し、それに値を割り当てたwhile方がよいでしょう(後で変更しないでください)。また、取得するに[ 、]の値を設定しています。あなたは検索するでしょう(あまり良い考えではないにしても何も検索しません)。次のようなことを試してください。lineStringtable.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);
                }
            }
        }
    });
于 2013-03-12T13:58:42.557 に答える