DEV Community

3theye
3theye

Posted on

[tips]ทำให้การอ่านไฟล์เป็นเรื่องง่ายด้วยคำสั่ง USE ใน Kotlin

คำสั่งในการอ่านไฟล์แบบเดิมนั้นค่อนข้างยาวและเข้าใจยาก ตามตัวอย่างด้านล่าง

private val CustomReader by lazy {
    val file = File(cacheDir, fileName)
    val outputStream = FileOutputStream(file)
    try {
       val inputStream = assets.open(fileName)
       var bytesCopied: Long = 0
       val buffer = ByteArray(8 * 1024)
       var bytes = inputStream.read(buffer)
       while (bytes >= 0) {
           outputStream.write(buffer, 0, bytes)
           bytesCopied += bytes
           bytes = inputStream.read(buffer)
       }
    } finally {
       outputStream.close()
    }
    CustomReader(file)
}
Enter fullscreen mode Exit fullscreen mode

ใน Kotlin 1.2 มี extension function สำหรับ Closeable ที่เรียกว่า use โดยเจ้าคำสั่งนี้จะช่วยอำนวยความสะดวกให้เรา ทำให้เราไม่ต้องตาม try finally close() เหมือนแต่ก่อนอีกต่อไป.

ด้วยคำสั่งนี้เราสามารถลดความซับซ้อนของ code ด้านบนได้อย่างง่ายดาย ดั่งตัวอย่างด้านล่างนี้เลย

private val CustomReader by lazy {
    val file = File(cacheDir, fileName)
    val outputStream = FileOutputStream(file)
    outputStream.use { outputStream ->
        val inputStream = assets.open(fileName)
        var bytesCopied: Long = 0
        val buffer = ByteArray(8 * 1024)
        var bytes = inputStream.read(buffer)
        while (bytes >= 0) {
            outputStream.write(buffer, 0, bytes)
            bytesCopied += bytes
            bytes = inputStream.read(buffer)
        }
    }
    CustomReader(file)
}
Enter fullscreen mode Exit fullscreen mode

แต่ยังไม่หมด เราสามารถลด code ได้อีกด้วย extension function อีกสองตัวคือ

copy-to
private val CustomReader by lazy {
    val file = File(cacheDir, fileName)
    val outputStream = FileOutputStream(file)
    outputStream().use { fileOut ->
        assets.open(fileName).copyTo(fileOut)
    }
    CustomReader(file)
}
Enter fullscreen mode Exit fullscreen mode
outputStream
private val CustomReader by lazy {
    val file = File(cacheDir, fileName)
    file.outputStream().use { fileOut ->
        assets.open(fileName).copyTo(fileOut)
    }
    CustomReader(file)
}
Enter fullscreen mode Exit fullscreen mode

Top comments (0)