FileInputStream для байтового массива в приложении Android

У меня есть FileInputStream, созданный с помощью Context.openFileInput(). Теперь я хочу преобразовать файл в массив байтов.

К сожалению, я не могу определить размер массива байтов, необходимый для FileInputStream.read(byte[]). Метод available() не работает, и я не могу создать файл для проверки его длины с использованием определенного пути, вероятно, потому, что путь недоступен для пользователей без полномочий root.

Я читал о ByteArrayOutputStream, и, похоже, динамически настраивает размер массива байтов, чтобы соответствовать, но я не могу получить, как читать из FileInputStream для записи в ByteArrayOutputStream.

Ответы

Ответ 1

Это должно работать.

InputStream is = Context.openFileInput(someFileName);
ByteArrayOutputStream bos = new ByteArrayOutputStream();
byte[] b = new byte[1024];
while ((int bytesRead = is.read(b)) != -1) {
   bos.write(b, 0, bytesRead);
}
byte[] bytes = bos.toByteArray();

Ответ 2

Это самый простой способ

FileInputStream fis =  openFileInput(fileName);

byte[] buffer =   new byte[(int) fis.getChannel().size()];

fis.read(buffer);

Ответ 3

Вы можете предварительно выделить массив байтов, используя

int size = context.getFileStreamPath(filename).length();

Таким образом, вы избежите выделения блоков памяти при каждом заполнении ByteArrayOutputStream.

Ответ 4

Для того, чтобы метод работал на любом устройстве и приложении, вам просто нужно заменить:

InputStream is = Context.getContentResolver().openInputStream(yourFileURi);

Таким образом вы также можете кодировать и внешние файлы.