Intereting Posts
Ошибка Kotlin при ссылке на активность из внутреннего класса Есть ли какая-либо функция репликации в Котлине? Почему настройка onClickListener работает один раз? Как создать переменную функции с переменным числом аргументов? Расчет спящего гиберната @Formula Kotlin switch-statement с более чем двумя переменными? Как использовать одни и те же конструкторы в разных классах, а также определять конструкторы в интерфейсе? IllegalArgumentException: параметр, заданный как непустой, равен null Почему моя работа не начинается? Kotlin – TypeCastException на view.getTag () Сравнение ссылок и стоимости Kotlin Decompiler генерирует ошибочный код – можно ли предотвратить? Делегирование недвижимости, измененное изменчивой картой Что означает предупреждение «Использовать свойства из пакетов вариантов сборки»? Использование Kotlin для передачи изображения из ImageView в другую активность на Android

Лучшая практика для преобразования java-кода, используемого для копирования файлов с файлами в кеш-папку в Android на Kotlin

Я использую этот код для копирования файлов Asset в Android для кэширования папки, дело в том, что это был Java-код, и я конвертирую его в Kotlin, но он больше похож на Java (ish) в основном вокруг цикла:

val file = File("${cacheDir.path}/$fileName") val dir = file.parentFile dir.mkdirs() val inputStream = assets.open(fileName) val bufferedOutputStream = BufferedOutputStream(FileOutputStream(file)) val buf = ByteArray(10240) var num = inputStream.read(buf) // Java version: while ((num = fi.read(buf)) > 0) while (num > 0) { bufferedOutputStream.write(buf, 0, num) num = inputStream.read(buf) } bufferedOutputStream.close() inputStream.close() 

любого эксперта, который может сделать его более Котлин.

Solutions Collecting From Web of "Лучшая практика для преобразования java-кода, используемого для копирования файлов с файлами в кеш-папку в Android на Kotlin"

Фактически после полного перевода код должен выглядеть так:

 val file = File("${cacheDir.path}/$fileName") val dir = file.parentFile dir.mkdirs() val inputStream = assets.open(fileName).use { input -> val bufferedOutputStream = file.outputStream().buffered().use { output -> input.copyTo(output, 10240) } } 

Это использует Closeable.use расширения Closeable.use , некоторые другие удобные функции расширения и функцию copyTo упомянутую выше разработчиком, чтобы упростить код до максимальных значений.

PS: Closeable.use должен быть котлинским аналогом конструкции Java 7 try-with-resource с гораздо большей простотой.

Идиоматический способ переписать это – полностью избавиться от цикла while и заменить его на стандартную библиотечную функцию copyTo .