使用BufferedReader删除行

时间:2014-05-09 11:58:12

标签: java bufferedreader filereader

我目前正在使用以下代码从计算机上读取.txt文件:

BufferedReader in = new BufferedReader(new FileReader("./Data/text.txt"));
String data = null;
try {
    while ((data = in.readLine()) != null) {
        String[] args = data.split(":");

        if (args[1] == "yes")) {
            file.add(data);
        } else {
            //Remove line here  
        }
    }
} finally {
    in.close();
}

现在,对于我读过的每一行,我都会做一个简单的检查,如果答案不是“是”,我想删除该行并继续下一行。

这可能吗?或者你只能阅读而不是改变吗?

4 个答案:

答案 0 :(得分:4)

您无法从文件中“删除”特定行,但您可以读取行,删除不需要的行并使用清理的行覆盖文件内容。

答案 1 :(得分:0)

如前所述,您可以阅读所有内容并跳过不想要的内容,之后您可以将其余内容存储在同一个文件中。

    List<String> file = new ArrayList();

    BufferedReader in = new BufferedReader(new FileReader("./Data/text.txt"));
    String data = null;
    try {
        while ((data = in.readLine()) != null) {
            String[] args = data.split(":");

            if (args[1].equals("yes")) {
                file.add(data);
            } else {
                //skip this line
            }
        }
        in.close();

        //Add to file
        FileWriter fw = new FileWriter("./Data/text.txt");
        BufferedWriter out = new BufferedWriter(fw);
        for (String line : file) {
            out.write(line + "\n");
        }
        out.flush();
        out.close();

    } catch (Exception e){

    }

您也可以使用Apache Commons IO

    File file = new File("./Data/text.txt");
    List<String> lines = org.apache.commons.io.FileUtils.readLines(file)

    for (int i = 0; i < lines.size(); i++) 
        if (! lines.get(i).split(":")[1].equals("yes")) 
            lines.remove(i--);

    org.apache.commons.io.FileUtils.writeLines(file, lines);

对于arg[1],您必须非常小心,如果您有空行,则结果为ArrayIndexOutOfBoundsException

<强>附录

我想使用 Java 8 lambda表达式和 Java 7 java.nio.file.*包发布另一种方式。

    List<String> lines = Files.readAllLines(Paths.get("./Data/text.txt"), Charset.defaultCharset());

    Predicate<String> filter = line -> line.split(":")[1].equals("./Data/text.txt");

    String output = lines
            .stream()
            .filter(filter)
            .map(l -> l + "\n")
            .collect(StringBuilder::new, StringBuilder::append, StringBuilder::append)
            .toString();

    Files.write(Paths.get("test"), output.getBytes());

答案 2 :(得分:0)

最简单的解决方案是复制您要保留的所有行,并将现有文件替换为您刚刚创建的文件。

File orig = new File("Data/text.txt");
File tmp = new File(orig+".tmp");
try (BufferedReader in = new BufferedReader(new FileReader(orig));
     PrintWriter pw = new PrintWriter(new FileWriter(tmp))) {
     for (String data; (data = in.readLine()) != null; )
          if (data.split(":")[1].equals("yes"))
              pw.println(data);
}
if (orig.delete())
    tmp.renameTo(orig);
else
    // cannot delete old file :|

答案 3 :(得分:0)

如果我错了,请纠正我,但你的代码已经删除了&#39;不需要的行(args [1]!=&#34;是&#34;),为什么?因为你的IF有如下声明:

  

IF&#39; args [1]&#39;是的&#39;是&#39;是然后将其添加到&#39;文件&#39; ELSE什么都不做

也就是说,除yes之外,它不会被添加到file,您应该检查file的内容(我假设它是&#39} ; sa List<String>类型),但我很确定您的代码已经是正确的。

或者您可以在continue;块中添加else