Как мы можем записать массив байтов в файл (и прочитать его обратно из этого файла) на Java?
Да, мы все знаем, что уже существует множество подобных вопросов, но они становятся очень запутанными и субъективными из-за того, что существует так много способов выполнить эту задачу.
Итак, давайте уменьшим объем вопроса:
Домен:
- Android / Java
Чего мы хотим:
- Быстро (насколько это возможно)
- Без ошибок (строго скрупулезно)
Чего мы не делаем:
- Сторонние библиотеки
- Любые библиотеки, для которых требуется Android API более поздней версии, чем 23 (Marshmallow)
(Таким образом, это исключает Apache Commons, Google Guava, Java.nio и оставляет нас с хорошим старым Java.io)
Что нам нужно:
- Массив байтов всегда остается точно таким же (содержимое и размер) после прохождения процесса записи, а затем чтения
- Метод записи требует только двух аргументов: Файл файла и байт[] данных
- Метод чтения возвращает байт[] и требует только одного аргумента: File файл
В моем конкретном случае эти методы являются частными (не библиотекой) и НЕ несут ответственности за следующее (но если вы хотите создать более универсальное решение, применимое к более широкой аудитории, сделайте это).:
- Потокобезопасность (файл не будет доступен более чем одному процессу одновременно)
- Файл имеет значение null
- Файл, указывающий на несуществующее местоположение
- Отсутствие разрешений в расположении файла
- Массив байтов слишком велик
- Массив байтов равен нулю
- Работа с любыми аргументами/возможностями "индекса", "длины" или "добавления"
Итак... мы как бы ищем окончательный пуленепробиваемый код, который люди в будущем могут считать безопасным для использования, потому что ваш ответ набрал много голосов, и нет комментариев, в которых говорится: "Это может произойти, если..."
Это то, что у меня есть до сих пор:
Запись Байтов В Файл:
private void writeBytesToFile(final File file, final byte[] data) {
try {
FileOutputStream fos = new FileOutputStream(file);
fos.write(data);
fos.close();
} catch (Exception e) {
Log.i("XXX", "BUG: " + e);
}
}
Считывание Байтов Из Файла:
private byte[] readBytesFromFile(final File file) {
RandomAccessFile raf;
byte[] bytesToReturn = new byte[(int) file.length()];
try {
raf = new RandomAccessFile(file, "r");
raf.readFully(bytesToReturn);
} catch (Exception e) {
Log.i("XXX", "BUG: " + e);
}
return bytesToReturn;
}
Из того, что я прочитал, возможными исключениями являются:
Исключение FileNotFoundException : Правильно ли я понимаю, что этого не должно произойти, если указанный путь к файлу был получен с помощью собственных внутренних инструментов Android и/или если приложение было протестировано должным образом?
Исключение IOException : Я действительно не знаю, что может быть причиной этого... но я предполагаю, что если это так, то ничего не поделаешь.
Итак, имея это в виду... можно ли улучшить или заменить эти методы, и если да, то чем?