Middle
Jak pracovat se soubory a vstupně/výstupními (I/O) toky v Kotlinu?
sobes.tech AI
Odpověď od AI
Standardní knihovna Kotlinu poskytuje pohodlné rozšíření pro práci s I/O, zjednodušující interakci s java.io.
Hlavní přístupy a třídy:
-
Čtení ze souboru:
File.readBytes(): Čte obsah souboru do pole bajtů.File.readText(): Čte obsah souboru jako řetězec (s ohledem na kódování).File.forEachLine { ... }: Zpracovává každý řádek souboru.File.bufferedReader(): VytváříBufferedReaderpro řádkové čtení.File.inputStream(): VytváříInputStreampro čtení bajtů.
-
Zápis do souboru:
File.writeBytes(bytes): Zapíše pole bajtů do souboru.File.writeText(text, append): Zapíše řetězec do souboru.append = truepřidá na konec.File.printWriter(): VytváříPrintWriterpro pohodlný zápis formátovaného textu.File.outputStream(): VytváříOutputStreampro zápis bajtů.
-
Práce s proudy:
InputStream.bufferedReader(): ObalujeInputStreamdoBufferedReader.OutputStream.printWriter(): ObalujeOutputStreamdoPrintWriter.- Rozšíření
copyTo(outputStream)pro kopírování obsahu proudů.
-
Správa zdrojů (closures):
- Rozšíření
use { ... }zajišťují automatické uzavření proudů a čteček/zapisovačů, i při výjimkách.
- Rozšíření
import java.io.File
fun main() {
val file = File("my_file.txt")
// Zápis do souboru
file.writeText("Ahoj, Kotlin I/O!")
file.appendText("\nPokračování řádku.")
// Čtení po řádcích
file.forEachLine { line ->
println(line)
}
// Čtení celého souboru jako text
val content = file.readText()
println("\nCelý obsah souboru:")
println(content)
// Použití bufferedReader s `use`
file.bufferedReader().use { reader ->
reader.lines().forEach(::println) // Čtení přes Java Stream API
}
// Kopírování souboru
val newFile = File("my_file_copy.txt")
file.inputStream().use { input ->
newFile.outputStream().use { output ->
input.copyTo(output) // Pohodlné kopírování proudů
}
}
}
Porovnání některých metod:
| Metoda | Účel | Datový typ | Řádek-řádek/kompletní | Poznámka |
|---|---|---|---|---|
readBytes() |
Čtení do bajtů | ByteArray |
Kompletní | Vhodné pro binární data |
readText() |
Čtení jako řetězec | String |
Kompletní | Vhodné pro textové soubory |
forEachLine { } |
Zpracování každého řádku | String |
Řádek-řádek | Ideální pro velké textové soubory |
bufferedReader() |
Vytvoření bufferovaného čteče | N/A | Proudové | Flexibilní kontrola, vyžaduje use |
writeBytes() |
Zápis bajtů | ByteArray |
Kompletní | Vhodné pro binární data |
writeText() |
Zápis řetězce | String |
Kompletní/přidání | Pohodlné pro textové soubory |
printWriter() |
Vytvoření formátovaného zápisovače | N/A | Proudové | Pohodlné pro formátovaný výstup, vyžaduje use |
Použití use { ... } je klíčové pro bezpečnou práci s I/O v Kotlinu, zajišťující uvolnění zdrojů. Kotlin rozšiřuje stávající třídy Java (File, InputStream, OutputStream atd.) o pohodlné funkce.