java 我如何从一个文件中删除空行并将非空行写回同一个文件?

dgtucam1  于 2023-03-11  发布在  Java
关注(0)|答案(3)|浏览(122)

我目前正在一本书上学习Java,遇到了一个练习,要求我编写一个程序,读取一个文件,删除任何空行,并将非空行写回同一个文件。
因为我找不到任何关于如何做到这一点的信息,这是我写的代码:

class Ask7 {
    public static void main(String[] args) throws IOException {
        File inpFile = new File("textFile.txt");
        PrintWriter out = new PrintWriter("tempFile.txt");

        Scanner in = new Scanner(inpFile);

        while(in.hasNextLine()) {
            String line = in.nextLine();

            if(line.length() > 0) {
                out.println(line);
            }
        }

        in.close();
        out.close();
    }
}

你能帮我把tempFile.txt的内容复制到inpFile.txt并删除tempFile.txt,或者建议一个更好的方法吗?

u1ehiz5o

u1ehiz5o1#

由于您在注解中声明了任务是重写输入文件,因此可以使用如下所示的方法:

import java.io.*;

public class Ask7 {

    public static void main(String[] args) throws IOException {

        // Create a File object
        File textFile = new File("textFile.txt");

        // Create a BufferedReader object to read the contents of the file
        BufferedReader reader = new BufferedReader(new FileReader(textFile));

        // Create a StringBuilder object to store the contents of the file
        StringBuilder builder = new StringBuilder();

        String line;

        // Loop through each line of the file
        while ((line = reader.readLine()) != null) {
            // Check if the line is not empty
            if (!line.trim().isEmpty()) {
                // If the line is not empty, append it to the StringBuilder object
                builder.append(line).append("\n");
            }
        }

        reader.close();

        // Create a FileWriter object to write to the same file
        FileWriter writer = new FileWriter(textFile);

        // Write the contents of the StringBuilder object to the file
        writer.write(builder.toString());

        writer.close();
    }
}

一种更简洁但也更复杂的实现相同结果的方法是利用流和收集器:

import java.io.IOException;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.Files;
import java.util.stream.Collectors;

public class Ask7 {

    public static void main(String[] args) throws IOException {
    
        // Create a Path object
        Path textFilePath = Paths.get("textFile.txt");
        
        // Read the contents of the file into a stream of lines using Files.lines()       
        String fileContents = Files.lines(textFilePath)
                                    // Filter out empty lines using the filter() method
                                    .filter(line -> !line.trim().isEmpty())
                                    // Collect the remaining non-empty lines into a single string, 
                                    // joining them together with newline characters between each line
                                    .collect(Collectors.joining("\n"));
                                    
        // Write the filtered contents to the same file using the Files.write() method,
        // after converting the string into a byte array using the getBytes() method,
        // because Files.write() expects data to be in this form
        Files.write(textFilePath, fileContents.getBytes());
    }
}
j5fpnvbx

j5fpnvbx2#

同时读取和写入同一个文件是可能的,但这会使问题过于复杂,而且可能效率低下。
对于现有代码,最简单的解决方案是获取当前输出文件并覆盖输入文件。请参见Files.copy()。首先必须关闭输入和输出文件。请参见Paths.get()来构建Path对象。
另一种选择是,如果输入文件适合可用内存,则将所需的(非空)行附加到String或StringBuilder中,并在每行后附加回车符(CR-LF或LF或System.lineSeparator()),然后关闭输入文件,重新打开它进行写入,并使用类似于OP代码或类似于Files.write()的代码写入String。

5cg8jx4n

5cg8jx4n3#

写入临时文件是一种很好的做法,尤其是在处理文件大到足以影响服务器资源的情况下。Java提供了一种使用唯一名称创建临时文件的功能,以防止与其他进程发生冲突。原始文件完全处理后,可以用临时文件替换原始文件。
如果在此过程中出现问题,原始文件将保持不变,您可以检查临时文件以寻找线索。否则,原始文件将被自动替换(假设临时文件和原始文件位于同一个卷上),在您写入部分文件时,不会有人读取它。

public static void removeBlanks(String filename) throws IOException {
    File temp = File.createTempFile("RemoveBlanks", null);
    File inpFile = new File(filename);
    Scanner in = new Scanner(inpFile);
    PrintWriter out = new PrintWriter(temp);
    while(in.hasNextLine()) {
        String line = in.nextLine();
        if(line.trim().length() > 0) {
            out.println(line);
        }
    }
    in.close();
    out.close();
    Files.move(temp.toPath(), inpFile.toPath(), StandardCopyOption.REPLACE_EXISTING);
}

相关问题