Sobes.tech
Middle

Ինչպես աշխատել ֆայլերով և մուտք/ելք (I/O) հոսքերով Kotlin-ում?

sobes.tech AI

Պատասխան AI-ից

Կոտլինի ստանդարտ գրադարանն ապահովում է հարմար ընդլայնումներ I/O-ի հետ աշխատանքի համար, պարզեցնելով java.io-ի հետ փոխազդեցությունը:

Հիմնական մոտեցումներ և դասեր:

  • Ֆայլից ընթերցում:

    • File.readBytes(): Կարդում է ֆայլի բովանդակությունը բայթների զանգվածի մեջ:
    • File.readText(): Կարդում է ֆայլի բովանդակությունը որպես տող (կոդավորումը հաշվի առնելով):
    • File.forEachLine { ... }: Հետամշակում է ֆայլի յուրաքանչյուր տող:
    • File.bufferedReader(): Ստեղծում է BufferedReader՝ տողային ընթերցման համար:
    • File.inputStream(): Ստեղծում է InputStream՝ բայթների ընթերցման համար:
  • Ֆայլին գրառում:

    • File.writeBytes(bytes): Գրում է բայթների զանգվածը ֆայլում:
    • File.writeText(text, append): Գրում է տողը ֆայլում, append = true ավելացնում է վերջում:
    • File.printWriter(): Ստեղծում է PrintWriter՝ ձևաչափված տեքստի համար:
    • File.outputStream(): Ստեղծում է OutputStream՝ բայթների գրառման համար:
  • Հոսքերի հետ աշխատում:

    • InputStream.bufferedReader(): Օղակավորում է InputStreamBufferedReader-ով:
    • OutputStream.printWriter(): Օղակավորում է OutputStreamPrintWriter-ով:
    • copyTo(outputStream): ընդլայնման ֆունկցիա՝ հոսքերի բովանդակությունը պատճենելու համար:
  • Ռեսուրսների կառավարում (closures):

    • use { ... } ընդլայնումները ապահովում են հոսքերի և ընթերցողների/գրողների ավտոմատ փակումը, նույնիսկ արտահայտությունների դեպքում:
import java.io.File

fun main() {
    val file = File("my_file.txt")

    // Գրառում ֆայլում
    file.writeText("Բարև, Kotlin I/O!")
    file.appendText("\nշարքի շարունակություն.")

    // Ստորագրի ընթերցում
    file.forEachLine { line ->
        println(line)
    }

    // Բոլոր ֆայլի բովանդակությունը որպես տող
    val content = file.readText()
    println("\nԲոլոր բովանդակությունը:")
    println(content)

    // BufferedReader-ով use-ով
    file.bufferedReader().use { reader ->
        reader.lines().forEach(::println) // Java Stream API-ով ընթերցում
    }

    // Ֆայլի պատճենում
    val newFile = File("my_file_copy.txt")
    file.inputStream().use { input ->
        newFile.outputStream().use { output ->
            input.copyTo(output) // հարմար պատճենում
        }
    }
}

Որոշ մեթոդների համեմատական աղյուսակ:

մեթոդը նպատակը տվյալների տիպը տող-տող/ամբողջ նշում
readBytes() ընթերցում բայթերով ByteArray ամբողջական հարմար է բինարային տվյալների համար
readText() ընթերցում որպես տող String ամբողջական հարմար է տեքստային ֆայլերի համար
forEachLine { } յուրաքանչյուր տող մշակելիս String տող-տող իդեալական մեծ տեքստային ֆայլերի համար
bufferedReader() բուֆերային ընթերցող ստեղծել N/A հոսքային ճկուն վերահսկում, պահանջում է use
writeBytes() բայթների գրառում ByteArray ամբողջական հարմար է բինարային տվյալների համար
writeText() տող գրանցել String ամբողջական/ավելացնել հարմար է տեքստային ֆայլերի համար
printWriter() ձևաչափված գրիչ ստեղծել N/A հոսքային հարմար է ձևաչափված արտածման համար, պահանջում է use

use { ... } օգտագործումը կարևոր է Kotlin- ում անվտանգ I/O աշխատանքի համար, ապահովելով ռեսուրսների ազատում։ Kotlin ընդլայնում է առկա Java դասերը (File, InputStream, OutputStream և այլն) հարմարավետ ֆունկցիաներով։