Sobes.tech
Middle

Πώς να εργαστείτε με αρχεία και ροές εισόδου/εξόδου (I/O) σε Kotlin;

sobes.tech AI

Απάντηση από AI

Η τυπική βιβλιοθήκη του Kotlin παρέχει άνετες επεκτάσεις για εργασία με I/O, απλοποιώντας την αλληλεπίδραση με το java.io.

Βασικές προσεγγίσεις και κλάσεις:

  • Ανάγνωση από αρχείο:

    • File.readBytes(): Διαβάζει το περιεχόμενο του αρχείου σε έναν πίνακα byte.
    • File.readText(): Διαβάζει το περιεχόμενο του αρχείου ως συμβολοσειρά (λαμβάνοντας υπόψη την κωδικοποίηση).
    • File.forEachLine { ... }: Επεξεργάζεται κάθε γραμμή του αρχείου.
    • File.bufferedReader(): Δημιουργεί έναν BufferedReader για γραμμική ανάγνωση.
    • File.inputStream(): Δημιουργεί ένα InputStream για ανάγνωση byte.
  • Εγγραφή σε αρχείο:

    • File.writeBytes(bytes): Γράφει έναν πίνακα byte σε αρχείο.
    • File.writeText(text, append): Γράφει μια συμβολοσειρά σε αρχείο. Το append = true προσθέτει στο τέλος.
    • File.printWriter(): Δημιουργεί έναν PrintWriter για εύκολη εγγραφή μορφοποιημένου κειμένου.
    • File.outputStream(): Δημιουργεί ένα OutputStream για εγγραφή byte.
  • Εργασία με ρεύματα:

    • InputStream.bufferedReader(): Τυλίγει το InputStream σε BufferedReader.
    • OutputStream.printWriter(): Τυλίγει το OutputStream σε PrintWriter.
    • Οι επεκτάσεις 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() Ανάγνωση σε byte ByteArray Ολόκληρο Κατάλληλο για δυαδικά δεδομένα
readText() Ανάγνωση ως κείμενο String Ολόκληρο Βολικό για αρχεία κειμένου
forEachLine { } Επεξεργασία κάθε γραμμής String Γραμμή-προς-γραμμή Ιδανικό για μεγάλα αρχεία κειμένου
bufferedReader() Δημιουργία buffer ανάγνωσης N/A Ρεύμα Ευέλικτος έλεγχος, απαιτεί use
writeBytes() Εγγραφή byte ByteArray Ολόκληρο Κατάλληλο για δυαδικά δεδομένα
writeText() Εγγραφή κειμένου String Ολόκληρο/προσθήκη Βολικό για αρχεία κειμένου
printWriter() Δημιουργία formatter writer N/A Ρεύμα Βολικό για μορφοποιημένη έξοδο, απαιτεί use

Η χρήση use { ... } είναι κλειδί για ασφαλή εργασία με I/O στο Kotlin, διασφαλίζοντας την απελευθέρωση πόρων. Το Kotlin επεκτείνει τις υπάρχουσες κλάσεις Java (File, InputStream, OutputStream κ.ά.) με άνετες λειτουργίες.