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);
Таким образом вы также можете кодировать и внешние файлы.