Java-检查文件是否仅包含空字符的最佳方法

Java-best way to check if file contains only null characters

提问人:SymbolKina 提问时间:9/13/2023 更新时间:9/13/2023 访问量:42

问:

我遇到了一个问题,我无法解决它。 我有一个文件,可以从 2 个应用程序进行读取和写入。当设备意外关闭时,文件的内容将保持相同的大小,但每个字符都替换为 Null 字符。 现在我需要一种方法来检查内容文件是否为 null。 最好的性能方法是什么? 谢谢

Java Spring 性能 文件 null

评论

1赞 Gimby 9/13/2023
没有真正的高性能方法,因为文件的大小将决定处理速度。如果一个文件是 20 演出,无论如何它都会很慢。除非你可以走捷径,比如检查最多前 200 个字节。
1赞 Deadron 9/13/2023
意外关闭不太可能导致文件意外填充 null 字符。如果文件充满了空字符,则意味着必须将它们显式写入文件。无论哪种方式,让两个应用程序可以读写同一个文件都是一个非常糟糕的主意。如果你想并发写入一个文件,你需要像sqlite这样的东西来管理访问。故障情况取决于文件系统,但主要会导致访问问题和/或混合写入。
0赞 SymbolKina 9/14/2023
谢谢大家的回复。@Gimby你给了我一个好主意,只检查文件的第一部分。
0赞 SymbolKina 9/14/2023
@Deadron我不明白为什么在关机后文件内容被 NULL 字符替换,我调试了所有可能的情况而没有任何结果。你是对的,通过不同的应用程序在同一个文件上写是一个坏主意,但这就是服务的开发方式。
1赞 Holger 9/22/2023
“空字符”是指零字节?也许,它们不是写在内容上,而是预期的内容一开始就没有写出来,而是驻留在缓存中。

答:

-1赞 Leonidas Sokoridas 9/13/2023 #1

要在 Java 中执行检查文件是否仅包含空字符,您可以以字节块为单位读取文件,并验证每个块中的所有字节是否为零。以下是您可以使用以下方法:BufferedInputStream

import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.IOException;

public class Main {
    public static void main(String[] args) {
        try {
            System.out.println(isFileNull("path/to/your/file.txt"));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static boolean isFileNull(String filepath) throws IOException {
        try (BufferedInputStream bis = new BufferedInputStream(new FileInputStream(filepath))) {
            byte[] buffer = new byte[1024];
            int bytesRead;
            while ((bytesRead = bis.read(buffer)) != -1) {
                for (int i = 0; i < bytesRead; i++) {
                    if (buffer[i] != 0) {
                        return false;
                    }
                }
            }
        }
        return true;
    }
}

解释:

  • 我们习惯于以块的形式读取文件。BufferedInputStream
  • 在该方法中,我们使用该方法将文件的块读取到字节数组缓冲区中,该方法返回读取的字节数,如果到达流的末尾,则返回 -1。isFileNullread
  • 然后,我们遍历缓冲区中的每个字节,并使用简单的比较 () 检查它们中是否有任何一个不为零。如果我们发现任何非零字节,我们会立即返回。buffer[i] != 0false
  • 如果我们到达文件末尾而没有找到任何非零字节,则返回 .true
  • 请注意,我们使用 try-with-resources 语句来确保正确关闭,即使抛出异常也是如此。BufferedInputStream

评论

2赞 rzwitserloot 9/13/2023
此代码非常复杂。关键是你可以有效地调用(如返回单个字节的 no-args 那个)。您是双缓冲:您已将其包装在 BIS 中,并使用 .您只需要其中之一。解决这个问题,再加上教坏习惯的小细节,这个反对票可以变成赞成票。BufferedInputStreamread()byte[] buffer = new byte[1024];
1赞 rzwitserloot 9/13/2023
坏习惯是.这是有毒的坏事,需要将其消除。这里的简单解决方法是,可以而且几乎总是应该声明为 .在这里也这样做。更少的代码,更好的代码,更轻松的调试。三赢。e.printStackTrace();mainthrows Exception
0赞 SymbolKina 9/14/2023
谢谢,我会尝试这个解决方案,然后让你知道