我使用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
数据的文件中效果很好:
但是对于某些文件则不是。因为某些文件以NULL
数据开头,如下所示:
我该怎么做才能解决此问题?非常感谢。
答案 0 :(得分:1)
我认为您的问题很清楚:仅在文件内部搜索NULL时,您将永远无法找到写入了多少数据(或内容的结尾)。原因是NULL是一个值为0x00的字节,该字节出现在所有类型的二进制文件(可能不是文本文件)中,另一方面,您的文件使用NULL初始化。
例如,您可以做的是将写入文件的数据大小存储在文件的前四个字节中。 因此,在将DATA写入文件时,请先写入其长度,然后再写入实际数据内容。
但是我仍然想知道为什么您不将文件的大小初始化为所需的大小。