java - 如何提取Java中写入文件的数据结尾

标签 java android file randomaccessfile

我使用 Java 在 Android 中创建一个具有所需长度的空文件,如下所示:

long length = 10 * 1024 * 1024 * 1024;
String file = "PATH\\File.mp4";
RandomAccessFile randomAccessFile = new RandomAccessFile(file, "rw");
randomAccessFil.setLength(length);

该代码创建一个具有所需长度和 NULL 数据的文件。然后我将数据写入文件,如下所示:

randomAccessFile.write(DATA);

现在我的问题是:我想提取写入文件的数据末尾。我编写了这个函数来通过二分搜索尽快找到数据结尾:

long extractEndOfData(RandomAccessFile accessFile, long from, long end) throws IOException {
    accessFile.seek(from);
    if (accessFile.read() == 0) {
        //this means no data has written into the file
        return 0;
    }
    accessFile.seek(end);
    if (accessFile.read() != 0) {
        return end + 1;
    }
    long mid = (from + end) / 2;
    accessFile.seek(mid);
    if (accessFile.read() == 0) {
        return extractEndOfData(accessFile, from, mid - 1);
    } else {
        if (accessFile.read() == 0) {
            return mid + 1;
        } else {
            return extractEndOfData(accessFile, mid + 1, end);
        }
    }
}

我这样调用该函数来查找文件中的数据结尾:

 long endOfData = extractEndOfData(randomAccessFile, 0, randomAccessFile.length() - 1);

该函数适用于数据以 NON-NULL 数据开头且数据中不存在任何 NULL 数据的文件,如下所示:

enter image description here

但对于某些文件则不然。因为有些文件以 NULL 数据开头,如下所示:

enter image description here

我可以做什么来解决这个问题?非常感谢。

最佳答案

我认为你的问题很清楚:当你只在文件中搜索 NULL 时,你将永远无法找出写入了多少数据(或内容的结尾)在哪里。原因是 NULL 是一个值为 0x00 的字节,它出现在各种二进制文件(可能不是文本文件)中,而另一方面,您的文件是用 NULL 初始化的。

例如,您可以做的是将写入文件的数据大小存储在文件的前四个字节中。 所以在向文件写入DATA时,先写入它的长度,然后再写入实际的数据内容。

但我仍然想知道为什么你不将文件的大小初始化为你需要的大小。

关于java - 如何提取Java中写入文件的数据结尾,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55989213/

相关文章:

python-3.x - 如何提示用户使用python3打开文件? (游戏)

java - 安装为 snap 包时如何配置 netbeans?

Android OnGestureListener Fling 未检测到

java - 具有 TagSoup 和不间断空格值的 Groovy XmlSlurper

java - 第二次用字符串元素数组填充微调器时出错

安卓文件读取

php - .php 文件是否需要 .php 扩展名?

python - 使用python将某些文件从一个文件夹复制到另一个文件夹

java - Mule:获取异常消息

java - 如何将 POJO 转换为保留类型的映射?