Я пытаюсь определить, является ли данный файл разреженным. Я знаю, что есть способ проверить, используя собственный API Windows, и что в системах на базе Unix есть команда stat для получения чисел для логического размера и фактических выделенных блоков. Однако мой проект старается не использовать собственный код и не запускать лишние процессы.
Есть ли в Java что-нибудь, позволяющее определить, является ли файл разреженным?
Моя первоначальная попытка использования ChatGPT привела к следующему:
Код: Выделить всё
public static boolean isSparseFile(Path path) throws IOException {
// Get the logical size of the file
long logicalSize = Files.size(path);
// Read the file to calculate the actual size
long actualSize = 0;
try (var stream = Files.newInputStream(path)) {
byte[] buffer = new byte[4096]; // Read in chunks
int bytesRead;
while ((bytesRead = stream.read(buffer)) != -1) {
for (int i = 0; i < bytesRead; i++) {
if (buffer[i] != 0) {
actualSize += bytesRead; // Count only non-zero bytes
break; // We only need to count once per chunk
}
}
}
}
// If the actual size is significantly less than the logical size, it's sparse
return actualSize < logicalSize;
}
Но этот метод кажется подозрительным. Похоже, что он определит файл как «разреженный» только в том случае, если есть выровненный по частям раздел размером 4096 нулевых байт, и в противном случае просто прочитает весь размер файла (в этом случае почему бы не прервать первый найденный нулевой блок когда bytesRead != -1?). Это создает риск того, что файл будет разреженным с частями меньше 4096 или с нулевым чаном больше 4096, который выходит за границу фрагмента. Кроме того, я не могу найти в Интернете код, подтверждающий этот метод. Также вполне возможно, что файл с пустым пространством не был разрежен файловой системой и в любом случае для этих пустых пространств выделены блоки. Этот метод все равно объявит этот файл разреженным.
Подробнее здесь:
https://stackoverflow.com/questions/791 ... -is-sparse