Я использую этот код для копирования файлов 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()
любого эксперта, который может сделать его более Котлин.
Фактически после полного перевода код должен выглядеть так:
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 .