Если у меня есть файл .dat
, который я пытаюсь прочитать, как я могу подсчитать количество 32-битных целых чисел? Я получаю 2 разных ответа двумя разными способами.
Первый способ:
int size = 0;
try (DataInputStream Input = new DataInputStream(
new BufferedInputStream(new FileInputStream(file.getFD())))){
while (true) {
file.skipBytes(4);
size += 1;
}
}catch(Exception ex){
System.out.println(ex);
}
System.out.println(size);
Второй способ:
File fileRead = new File(file);
ret = fileRead.length() / 4
Первый метод, вероятно, является наиболее точным, поскольку я каждый раз читаю 4 байта и пропускаю его, чтобы получить размер целых чисел, последовательно упаковываемых в файл. Однако второй метод просто дает мне прямой размер файла и делится на 4, что не то же самое. Я думаю, это может быть включение дополнительных данных, связанных с файлом, не связанных с контентом.
Первый способ хорош, но очень неэффективен для больших файлов. Есть идеи, как я могу ускорить процесс и эффективно получить количество целых чисел?
Если вы хотите много раз знать, можете ли вы прочитать 32-битное целое число из определенного файла двоичный, метод 2 - верный ответ.
Вы не должны читать свой файл через DataInputStream
, если не уверены, что он был записан через DataOutputStream
, потому что тогда это не просто простой двоичный файл: вместо этого он становится Файл объекта Java, который будет содержать много служебных данных с каждым записанным объектом.
Не могли бы вы объяснить, почему у двух подходов разный размер? Я полагаю, что для двоичного файла фактический размер файла, вероятно, содержит данные, которые не являются частью содержимого, поэтому фактическое количество прочитанных 32-битных целых чисел может быть меньше?
Прежде всего: каков формат файла? Содержит ли он простые 32-битные слова или сериализованные объекты Java?
Вы можете «токенизировать» строки, пока читаете их - при условии, что это «текстовый» файл; оцените токены до обнаружить, если это целое число или нет ... затем подсчитайте вхождения.