java—使用bufferedreader/bufferedwriter删除文件的第n行

uxh89sit  于 2021-06-29  发布在  Java
关注(0)|答案(2)|浏览(895)

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

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

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

i1icjdpr

i1icjdpr1#

你所需要做的就是用调试器运行你的代码来发现你的 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 条件总是正确的。

9njqaruj

9njqaruj2#

一些建议:
应该使用try with resources自动关闭资源。
不要让捕获到的异常无人看管。要么做些什么从错误中恢复,要么抛出它以便调用方法能够处理它。如果无法从异常中恢复,一种简单的方法是声明 throws 在方法签名中。
将除第n项以外的所有项放入 List<String> 读取文件时。读取完成后,将列表的内容写入文件。
演示:

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

public class Main {
    public static void main(String[] args) {
        // Test
        try {
            removeNthItem(2);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    static void removeNthItem(int nth) throws IOException {
        // Put all items, except the nth item, into a List<String> list
        List<String> list = new ArrayList<>();
        try (BufferedReader reader = new BufferedReader(new FileReader(new File("Cart.txt")))) {
            int itemToRemove = (nth - 1) * 4;
            String currentLine;
            int line = 0;
            while ((currentLine = reader.readLine()) != null) {
                if (!(line == itemToRemove || line == itemToRemove + 1 || line == itemToRemove + 2
                        || line == itemToRemove + 3)) {
                    list.add(currentLine + System.lineSeparator());
                }
                line++;
            }
        }

        // Write the content of the list into the file
        try (BufferedWriter writer = new BufferedWriter(new FileWriter(new File("Cart.txt")))) {
            for (String s : list) {
                writer.write(s);
            }
        }
    }
}

相关问题