首页 > 解决方案 > 使用 BufferedReader/BufferedWriter 删除文件的第 N 行

问题描述

所以我有一个像这样结构的文本文件(产品、价格、类别、数量)。

Apple
1.0
Fruits
120
Cucumber
1.4
Vegetables
110
Pear
1.6
Fruits
120

我需要一个可以删除第 N 项的函数,在这种情况下,第二项形成文件(即第 5、6、7、8 行),所以它看起来像这样:

Apple
1.0
Fruits
120
Pear
1.6
Fruits
120

我能找到的只是从文件中删除特定字符串的方法,但这不是我在这种情况下需要的。

编辑:到目前为止,这是我的代码:

int place=2;            
try{
    File inputFile = new File("Cart.txt"); 
    File tempFile = new File("Cart1.txt"); 
    BufferedReader reader = new BufferedReader(new FileReader(inputFile));
    BufferedWriter writer = new BufferedWriter(new FileWriter(tempFile));

    int itemToRemove=place*4;
    String currentLine;
    int line=0;
    while((currentLine = reader.readLine()) != null) {
        if(line!=itemToRemove||line!=itemToRemove+1||line!=itemToRemove+2||line!=itemToRemove+3){
            writer.write(currentLine + System.getProperty("line.separator"));
        }
        line++;
    }
    writer.close();
    reader.close();
    tempFile.renameTo(inputFile);
}catch(Exception x){}

它应该从文件中删除第二个项目,但它只是制作一个副本

标签: javafile

解决方案


您需要做的就是使用调试器运行您的代码,以发现您的if条件不正确,并且递增line应该是while循环内执行的第一个操作。

这是您的代码以及我的更正。

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

public class RemovNth {

    public static void main(String[] args) {
        int place = 2;
        try {
            File inputFile = new File("Cart.txt");
            File tempFile = new File("Cart1.txt");
            BufferedReader reader = new BufferedReader(new FileReader(inputFile));
            BufferedWriter writer = new BufferedWriter(new FileWriter(tempFile));
            int itemToRemove = (place - 1) * 4;
            String currentLine;
            int line = -1;
            while ((currentLine = reader.readLine()) != null) {
                line++;
                if (line == itemToRemove || line == itemToRemove + 1 || line == itemToRemove + 2
                        || line == itemToRemove + 3) {
                    continue;
                }
                writer.write(currentLine + System.getProperty("line.separator"));
            }
            writer.close();
            reader.close();
            tempFile.renameTo(inputFile);
        }
        catch (Exception x) {
        }
    }
}

请注意,根据文档,方法renameTo可能会失败。

你的if条件永远是真实的。


推荐阅读