如何提取 Java 中写入文件的数据结尾
How to extract end of data written inside a file in Java
我使用 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
数据开头,如下所示:
我该怎么做才能解决这个问题?非常感谢。
我认为您的问题很明确:当您仅在文件中搜索 NULL 时,您将永远无法找出写入了多少数据(或内容的末尾)。原因是 NULL 是一个值为 0x00 的字节,它出现在各种二进制文件(可能不是文本文件)中,另一方面,你的文件是用 NULL 初始化的。
例如,您可以将写入文件的数据大小存储在文件的前四个字节中。
所以写DATA到文件的时候,先写它的长度,再写实际的数据内容。
但我还是想知道为什么你不把文件的大小初始化为你需要的大小。
我使用 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
数据开头,如下所示:
我该怎么做才能解决这个问题?非常感谢。
我认为您的问题很明确:当您仅在文件中搜索 NULL 时,您将永远无法找出写入了多少数据(或内容的末尾)。原因是 NULL 是一个值为 0x00 的字节,它出现在各种二进制文件(可能不是文本文件)中,另一方面,你的文件是用 NULL 初始化的。
例如,您可以将写入文件的数据大小存储在文件的前四个字节中。 所以写DATA到文件的时候,先写它的长度,再写实际的数据内容。
但我还是想知道为什么你不把文件的大小初始化为你需要的大小。