Sobes.tech
Middle

Kotlin'de dosyalar ve giriş/çıkış (I/O) akışlarıyla nasıl çalışılır?

sobes.tech yapay zeka

AI'dan gelen yanıt

Kotlin standart kütüphanesi, java.io ile etkileşimi basitleştiren kullanışlı genişletmeler sağlar.

Ana yaklaşımlar ve sınıflar:

  • Dosya okuma:

    • File.readBytes(): Dosya içeriğini bayt dizisi olarak okur.
    • File.readText(): Dosya içeriğini bir dize olarak okur (kodlama dikkate alınarak).
    • File.forEachLine { ... }: Dosyanın her satırını işler.
    • File.bufferedReader(): Satır satır okuma için BufferedReader oluşturur.
    • File.inputStream(): Bayt okuma için InputStream oluşturur.
  • Dosyaya yazma:

    • File.writeBytes(bytes): Bayt dizisini dosyaya yazar.
    • File.writeText(text, append): Bir dizeyi dosyaya yazar. append = true sona eklemek için.
    • File.printWriter(): Biçimlendirilmiş metin yazmak için PrintWriter oluşturur.
    • File.outputStream(): Bayt yazmak için OutputStream oluşturur.
  • Akışlarla çalışma:

    • InputStream.bufferedReader(): Bir InputStreami BufferedReader ile sarmalar.
    • OutputStream.printWriter(): Bir OutputStreami PrintWriter ile sarmalar.
    • İçeriği kopyalamak için copyTo(outputStream) genişletme fonksiyonları.
  • Kaynak yönetimi (closure):

    • use { ... } genişletme fonksiyonları, akışları ve okuyucuları/yazıcıları otomatik olarak kapatır, hatta istisnalar durumunda bile.
import java.io.File

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

    // Dosyaya yazma
    file.writeText("Merhaba, Kotlin I/O!")
    file.appendText("\nDevam eden satır.")

    // Satır satır okuma
    file.forEachLine { line ->
        println(line)
    }

    // Tüm içeriği metin olarak okuma
    val content = file.readText()
    println("\nDosya içeriği:")
    println(content)

    // bufferedReader kullanımı ve `use`
    file.bufferedReader().use { reader ->
        reader.lines().forEach(::println) // Java Stream API ile okuma
    }

    // Dosyayı kopyalama
    val newFile = File("my_file_copy.txt")
    file.inputStream().use { input ->
        newFile.outputStream().use { output ->
            input.copyTo(output) // Kullanışlı kopyalama
        }
    }
}

Bazı metodların karşılaştırmalı tablosu:

Metod Amaç Veri tipi Satır satır/tüm Notlar
readBytes() Bayt olarak okuma ByteArray Tüm İkili veriler için uygun
readText() Metin olarak okuma String Tüm Metin dosyaları için kullanışlı
forEachLine { } Her satırı işleme String Satır satır Büyük metin dosyaları için ideal
bufferedReader() Buffer'lı okuyucu oluşturma N/A Akış Esnek kontrol, use gerektirir
writeBytes() Bayt yazma ByteArray Tüm İkili veriler için uygun
writeText() Metin yazma String Tüm/ekleme Metin dosyaları için kullanışlı
printWriter() Biçimlendirilmiş yazar oluşturma N/A Akış Biçimlendirilmiş çıktı için kullanışlı, use gerektirir

use { ... } kullanımı, Kotlin'de I/O ile güvenli çalışmak için anahtardır ve kaynakların serbest bırakılmasını garanti eder. Kotlin, mevcut Java sınıflarını (File, InputStream, OutputStream vb.) kullanışlı fonksiyonlarla genişletir.