69

ファイル内の行を見つけてその行 (コンテンツではなく行) を削除する小さなコード スニペットを探していますが、見つかりませんでした。たとえば、次のファイルがあります。

myFile.txt :

aaa
bbb
ccc
ddd

次のような関数が必要です:public void removeLine(String lineContent)を渡す removeLine("bbb")と、次のようなファイルが得られます:

myFile.txt:

aaa
ccc
ddd
4

17 に答える 17

94

この解決策は最適またはきれいではないかもしれませんが、うまくいきます。入力ファイルを 1 行ずつ読み込み、各行を一時出力ファイルに書き出します。探しているものに一致する行に遭遇するたびに、その行の書き込みをスキップします。次に、出力ファイルの名前を変更します。エラー処理やリーダー/ライターのクローズなどは例から省略しています。また、探している行に先頭または末尾の空白がないことも想定しています。必要に応じて、trim() の周りのコードを変更して、一致するものを見つけられるようにします。

File inputFile = new File("myFile.txt");
File tempFile = new File("myTempFile.txt");

BufferedReader reader = new BufferedReader(new FileReader(inputFile));
BufferedWriter writer = new BufferedWriter(new FileWriter(tempFile));

String lineToRemove = "bbb";
String currentLine;

while((currentLine = reader.readLine()) != null) {
    // trim newline when comparing with lineToRemove
    String trimmedLine = currentLine.trim();
    if(trimmedLine.equals(lineToRemove)) continue;
    writer.write(currentLine + System.getProperty("line.separator"));
}
writer.close(); 
reader.close(); 
boolean successful = tempFile.renameTo(inputFile);
于 2009-09-04T05:08:46.167 に答える
26
    public void removeLineFromFile(String file, String lineToRemove) {

    try {

      File inFile = new File(file);

      if (!inFile.isFile()) {
        System.out.println("Parameter is not an existing file");
        return;
      }

      //Construct the new file that will later be renamed to the original filename.
      File tempFile = new File(inFile.getAbsolutePath() + ".tmp");

      BufferedReader br = new BufferedReader(new FileReader(file));
      PrintWriter pw = new PrintWriter(new FileWriter(tempFile));

      String line = null;

      //Read from the original file and write to the new
      //unless content matches data to be removed.
      while ((line = br.readLine()) != null) {

        if (!line.trim().equals(lineToRemove)) {

          pw.println(line);
          pw.flush();
        }
      }
      pw.close();
      br.close();

      //Delete the original file
      if (!inFile.delete()) {
        System.out.println("Could not delete file");
        return;
      }

      //Rename the new file to the filename the original file had.
      if (!tempFile.renameTo(inFile))
        System.out.println("Could not rename file");

    }
    catch (FileNotFoundException ex) {
      ex.printStackTrace();
    }
    catch (IOException ex) {
      ex.printStackTrace();
    }
  }

これは私がインターネットで見つけたものです。

于 2009-09-04T19:13:21.710 に答える
21

次のようなことをしたい:

  • 古いファイルを読み取り用に開く
  • 書き込み用に新しい (一時) ファイルを開く
  • 古いファイルの行を反復処理します (おそらくBufferedReaderを使用)
    • 各行について、削除する予定のものと一致するかどうかを確認します
    • 一致する場合は何もしない
    • 一致しない場合は、一時ファイルに書き込みます
  • 完了したら、両方のファイルを閉じます
  • 古いファイルを削除する
  • 一時ファイルの名前を元のファイルの名前に変更します

(これは宿題のように見えるので、実際のコードは書きませんが、問題がある特定のビットについて他の質問を自由に投稿してください)

于 2009-09-04T05:09:03.280 に答える
1

これが完全なクラスです。以下のファイルの「somelocation」は、ファイルの実際のパスを指します。

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;



public class FileProcess
{


    public static void main(String[] args) throws IOException
    {
        File inputFile = new File("C://somelocation//Demographics.txt");
        File tempFile = new File("C://somelocation//Demographics_report.txt");

        BufferedReader reader = new BufferedReader(new FileReader(inputFile));
        BufferedWriter writer = new BufferedWriter(new FileWriter(tempFile));

        String currentLine;

        while((currentLine = reader.readLine()) != null) {
            if(null!=currentLine && !currentLine.equalsIgnoreCase("BBB")){
                writer.write(currentLine + System.getProperty("line.separator"));
            }
        }
        writer.close(); 
        reader.close(); 
        boolean successful = tempFile.renameTo(inputFile);
        System.out.println(successful);
    }

}
于 2015-01-31T03:54:02.213 に答える