Java - 打开 txt 文件并清除所有多个空格

Java - open txt file and clear all multiple spaces

我有一个 txt 文件,我想做的是打开它并删除所有多个空格,使它们成为一个。我使用:

br = new BufferedReader(new FileReader("C:\Users\Chris\Desktop\file_two.txt"));
bw = new BufferedWriter(new FileWriter("C:\Users\Chris\Desktop\file_two.txt"));

while ((current_line = br.readLine()) != null) {
     //System.out.println("Here.");
     current_line = current_line.replaceAll("\s+", " ");
    bw.write(current_line);
}        
br.close();
bw.close();

但是,至少在我看来是正确的,文件上什么也没有写。如果我使用 system.out.println 命令,它不会被打印出来,这意味着执行永远不会在 while 循环中......我做错了什么?谢谢

您正在读取文件,同时在上面写入内容..这是不允许的...

这样更好的方法是先读取文件并将处理后的文本存储在另一个文件中,最后用新文件替换原始文件..试试这个

        br = new BufferedReader(new FileReader("C:\Users\Chris\Desktop\file_two.txt"));
        bw = new BufferedWriter(new FileWriter("C:\Users\Chris\Desktop\file_two_copy.txt"));
        String current_line;
        while ((current_line = br.readLine()) != null) {
            //System.out.println("Here.");
            current_line = current_line.replaceAll("\s+", " ");
            bw.write(current_line);
            bw.newLine();
        }
        br.close();
        bw.close();
        File copyFile = new File("C:\Users\Chris\Desktop\file_two_copy.txt");
        File originalFile = new File("C:\Users\Chris\Desktop\file_two.txt");
        originalFile.delete();
        copyFile.renameTo(originalFile);

可能会有帮助...

你必须先读后写,你不能同时读和写同一个文件,你需要使用RandomAccessFile来做到这一点。

如果您不想学习新技术,您将需要写入一个单独的文件,或者将所有行缓存到内存中(即 ArrayList),但您必须关闭 BufferedReader 在初始化 BufferedWriter 之前,否则会出现文件访问错误。

编辑: 如果您想查看它,这里有一个 RandomAccessFile 用于您预期用途的用例示例。值得指出的是,这只有在最终行长度小于或等于原始行时才有效,因为这种技术基本上是覆盖现有文本,但应该非常快,内存开销很小,并且适用于非常大的文件:

public static void readWrite(File file) throws IOException{
    RandomAccessFile raf = new RandomAccessFile(file, "rw");

    String newLine = System.getProperty("line.separator");

    String line = null;
    int write_pos = 0;
    while((line = raf.readLine()) != null){
        line = line.replaceAll("\s+", " ") + newLine;
        byte[] bytes = line.getBytes();
        long read_pos = raf.getFilePointer();
        raf.seek(write_pos);
        raf.write(bytes, 0, bytes.length);
        write_pos += bytes.length;
        raf.seek(read_pos);
    }
    raf.setLength(write_pos);
    raf.close();
}

您的方法几乎没有问题:

  • 主要是您试图同时读取和写入同一个文件。
  • 另一个是 new FileWriter(..) 总是创建新的空文件,这会阻止 FileReader 从您的文件中读取任何内容。

您应该阅读 file1 的内容并将其修改后的版本写在 file2 中。之后将 file1 替换为 file2.

您的代码可能看起来或多或少像

Path input = Paths.get("input.txt");
Path output = Paths.get("output.txt");

List<String> lines = Files.readAllLines(input);
lines.replaceAll(line -> line.replaceAll("\s+", " "));

Files.write(output, lines);
Files.move(output, input, StandardCopyOption.REPLACE_EXISTING);