Resources.openRawResource () выпускает Android - PullRequest
13 голосов
/ 02 июня 2009

У меня есть файл базы данных в папке res/raw/. Я звоню Resources.openRawResource() с именем файла R.raw.FileName и получаю входной поток, но у меня есть другой файл базы данных на устройстве, поэтому для копирования содержимого этой базы данных на используемую мной базу данных:

 BufferedInputStream bi = new BufferedInputStream(is);

и FileOutputStream, но я получаю исключение, что файл базы данных поврежден. Как я могу продолжить? Я пытаюсь прочитать файл, используя File и FileInputStream и путь как /res/raw/fileName, но это также не работает.

Ответы [ 2 ]

39 голосов
/ 03 июня 2009

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

Исходя из примера кода в демонстрационных версиях API (content / ReadAsset), вы сможете использовать вариант следующего фрагмента кода для чтения данных файла базы данных.

InputStream ins = getResources().openRawResource(R.raw.my_db_file);
ByteArrayOutputStream outputStream=new ByteArrayOutputStream();
int size = 0;
// Read the entire resource into a local byte buffer.
byte[] buffer = new byte[1024];
while((size=ins.read(buffer,0,1024))>=0){
  outputStream.write(buffer,0,size);
}
ins.close();
buffer=outputStream.toByteArray();

Теперь копия вашего файла должна существовать в buffer, поэтому вы можете использовать FileOutputStream для сохранения буфера в новый файл.

FileOutputStream fos = new FileOutputStream("mycopy.db");
fos.write(buffer);
fos.close();
0 голосов
/ 03 февраля 2012

InputStream.available имеет серьезные ограничения и никогда не должен использоваться для определения длины контента, доступного для потоковой передачи.

http://developer.android.com/reference/java/io/FileInputStream.html#available(): «[...] Возвращает примерное количество байтов, которые можно прочитать или пропустить без блокировки для большего ввода. [...] Обратите внимание, что этот метод обеспечивает такую ​​слабую гарантию, что он не очень полезен на практике». *

У вас есть 3 решения:

  1. Просмотрите содержимое дважды, сначала просто для вычисления длины содержимого, затем для фактического чтения данных
  2. Поскольку ресурсы Android подготовлены вами, разработчик жестко запрограммировал его ожидаемую длину
  3. Поместите файл в каталог / asset и прочитайте его через AssetManager, который дает вам доступ к AssetFileDescriptor и его методам длины содержимого. Это, однако, может дать вам НЕИЗВЕСТНОЕ значение длины, что не очень полезно.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...