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 κ.ά.) με άνετες λειτουργίες.