Как получить java.io.File из ресурса R.raw

Я добавил исходный ресурс в проект Android Studio:

Тогда мне нужно получить экземпляр java.io.File указывающий на него.

Я пробовал три вещи, но файл не найден, а File.exists() равен false:

 // Option 1: // // com.example.myapp:raw/plano_metrobus // val fileName = resources.getResourceName(R.raw.plano_metrobus) Log.w("xxx", fileName) Log.w("xxx", File(fileName).exists().toString()) // Option 2 // // android.resource://com.example.myapp:raw/plano_metrobus // val uri = Uri.parse("android.resource://" + fileName) Log.w("xxx", uri.toString()) Log.w("xxx", File(uri.toString()).exists().toString()) // Option 3 // // android.resource://com.example.myapp/2131427328 // val uri2 = Uri.parse("android.resource://" + packageName + "/" + R.raw.plano_metrobus) Log.w("xxx", uri2.toString()) Log.w("xxx", File(uri2.toString()).exists().toString()) 

Каков правильный способ создания объекта File ?

Тогда мне нужно получить экземпляр java.io.File, указывающий на него.

Это невозможно. Это файл на вашей машине разработки. Это не файл на устройстве.

Каков правильный способ получить объект File?

В идеале вы этого не делаете. Вы не можете изменить ресурс, и, надеюсь, все, что вы используете, которое принимает File также может принимать InputStream . Если это так, используйте openRawResource() в объекте Resources , и вы получите один из них, вызвав getResources() в Context (например, Activity , Service ).

Если вы используете некоторую стороннюю библиотеку, которая плохо написана и требует файл, вам нужно будет использовать этот openRawResource() , а затем скопируйте байты из этого InputStream в некоторый файл, который вы контролируете (например, в getCacheDir() ), , Затем вы можете использовать полученный файл.

Следуя предыдущему совету, я закончил использование Context.getCacheDir() для создания Context.getCacheDir() версии файла, а затем смог использовать его с PdfRenderer . Вот решение:

 val FILENAME = "FileName.pdf" val file = File(applicationContext.cacheDir, FILENAME) if (!file.exists()) { val input = resources.openRawResource(R.raw.plano_metrobus) val output = FileOutputStream(file) val buffer = ByteArray(1024) while (true) { val size = input.read(buffer) if (size == -1) { break; } output.write(buffer, 0, size) } input.close() output.close() } val fileDescriptor = ParcelFileDescriptor.open(file, ParcelFileDescriptor.MODE_READ_ONLY) val renderer = PdfRenderer(fileDescriptor) 
Intereting Posts
Kotlin – Невозможно использовать параметр T в качестве параметра типа reified. Вместо этого используйте класс Чтение нескольких строк из одной линии в Котлине? Больше удовольствия с делегатами Котлина Преобразование Double в ByteArray или Array <Byte> Kotlin Неразрешенная ссылка Ошибка загрузки Spring Boot + Kotlin Android только setStackFromEnd, только если RecycleView / List больше экрана Как имитировать излучение 2 infiite Наблюдаемые потоки и есть другие Observable, которые объединяют их и буферируют каждые 10 секунд? каков рекомендуемый способ использования двойного удара Kotlin для элемента с нулевым классом Внутренние занятия Наследование в Котлине Размер RealmResults возвращается Zero Возвращает результат запроса postgresql в функции Почему я не вижу ничего полезного в logcat при вызове метода из Kotlin? Разница между «*» и «Any» в генериках Котлина Проблема с расширением метода в скрипте Котлин