Вы можете полагаться на new FileInputStream(fileName).available()
, возвращая ноль, если указанный файл пуст.
Вы не можете полагаться на new FileInputStream(fileName).available() == 0
в качестве окончательного теста на то, что файл пуст. Если fileName
обычный файл в локальной файловой системе, он, вероятно, будет работать. Но если fileName
- это файл устройства или это файл в удаленной файловой системе, available()
может вернуть ноль, чтобы сообщить, что read()
придется заблокировать в течение определенного периода. (Или в случае удаленной файловой системы это может не произойти.)
Более надежный способ проверить длину обычного файла - использовать new File(fileName).length() == 0
. Однако для файла или канала устройства вызов length()
может возвращать ноль, независимо от количества байтов, которые в конечном итоге могут быть прочитаны. И имейте в виду, что new File(fileName).length()
также возвращает ноль, если файл не существует.
РЕДАКТИРОВАТЬ Если вы хотите, чтобы надежный тест показал, является ли файл пустым, вы должны сделать несколько звонков:
public static isEmptyFile(String fileName) {
File file = new File(fileName);
if (!file.exists()) {
return false;
} else if (file.length() != 0L) {
return false;
} else if (file.isFile()) {
return true;
} else if (file.isDirectory()) {
return false;
} else {
// It may be impossible to tell that a device file / named pipe is
// "empty" without actually reading it. This is not a failing of
// Java: it is a logical consequence of the way that certain
// devices, etc work.
throw new CannotAnswerException(...);
}
}
Но было бы неплохо тщательно протестировать это с различными типами «файлов» на всех платформах, на которых вы запускаете свое приложение. Поведение некоторых файловых предикатов задокументировано как специфичное для платформы; см. Javadoc .