Мой код должен считывать массив байтов (см. ниже), и перед чтением мне нужно знать размер файла. К сожалению, изучая код, я могу найти только методы для получения выделенного размера, который обычно больше реального размера файла.
Так как же мне получить фактический размер файла в байтах? ?
Мой (неправильный код) пока выглядит так:
Код: Выделить всё
SMBClient client = new SMBClient();
try(Connection connection = client.connect(hostname)) {
AuthenticationContext ac = new AuthenticationContext(user, password.toCharArray(), domain);
Session session = connection.authenticate(ac);
// Connect to Share
try (DiskShare share = (DiskShare) session.connectShare(shareName)) {
FileAllInformation fileInfo = share.getFileInformation(path);
File file = share.openFile(path, EnumSet.of(AccessMask.GENERIC_READ), null, SMB2ShareAccess.ALL, SMB2CreateDisposition.FILE_OPEN, null);
long fileSize = fileInfo.getStandardInformation().getAllocationSize();
// this part is problematic as it throws an IOException
// if not the fileSize amount of bytes can be read
byte[] bytes = IOUtils.toByteArray(fileIn, fileInfo.getStandardInformation().getAllocationSize());
}
}
Я пишу плагин протокола для Apache Nutch. А API ожидает, что содержимое файла будет предоставлено в формате byte[].
Почему бы IOUtils не прочитать весь файл?
Вызов IOUtils.toByteArray(fileIn) прочитает весь файл. Но это завершается с ошибкой IOException, если размер файла превышает 2 ГБ. Поэтому я хотел бы указать максимальный размер для чтения. И здесь API IOUtils позволяет указать количество байтов с помощью IOUtils.toByteArray(fileIn, sum). Но предостережение заключается в том, что теперь вызов завершится неудачей, если файл меньше. Таким образом, мне нужно знать размер файла (и, следовательно, количество байтов, которые я хочу прочитать), прежде чем делать этот вызов.
Подробнее здесь: https://stackoverflow.com/questions/790 ... e-via-smbj
Мобильная версия