Invoer-uitvoerstreams (I/O streams) zijn een van de basisconcepten van Java, ontstaan in de vroege versies van de taal. Dit concept is oorspronkelijk ontwikkeld om de processen van het lezen en schrijven van gegevens te abstraheren: een stream kan verbonden zijn met een bestand, een netwerk of zelfs de console — voor de code ziet het er hetzelfde uit.
Probleem doet zich voor wanneer een ontwikkelaar streams verkeerd beheert, ze vergeet te sluiten of verschillende soorten streams (teken- en byte-streams) door elkaar haalt, wat vaak leidt tot resource-lekken, gegevenscorruptie of runtime-fouten.
Oplossing is een goede kennis en toepassing van de hiërarchie van invoer-uitvoerstreams (InputStream/OutputStream voor bytes, Reader/Writer voor tekens), evenals de verplichting om streams te sluiten na gebruik, bij voorkeur via try-with-resources vanaf Java 7.
Voorbeeldcode voor het lezen en schrijven van een bestand:
try (BufferedReader reader = new BufferedReader(new FileReader("input.txt")); BufferedWriter writer = new BufferedWriter(new FileWriter("output.txt"))) { String line; while ((line = reader.readLine()) != null) { writer.write(line); writer.newLine(); } }
Belangrijkste kenmerken:
Wat gebeurt er als je een invoer-uitvoer stream in Java niet sluit?
Streams werken met low-level OS-resources, en het niet sluiten van een stream kan leiden tot geheugenlekken, bestandblokkeringen, crashes van de applicatie of zelfs uitputting van bestandsdescriptoren op OS-niveau.
Kan je dezelfde OutputStream gebruiken om naar verschillende bestanden te schrijven?
Nee, een klassieke OutputStream is strikt gekoppeld aan één bron/ontvanger van gegevens. Voor verschillende bestanden — verschillende OutputStream-objecten.
Wat is het verschil tussen PrintWriter en BufferedWriter? Wanneer gebruik je welke?
PrintWriter is gespecialiseerd in het uitbreiden van uitvoer met geformatteerde print methoden, zoals println(), en kan automatisch flushen. BufferedWriter verhoogt vooral de prestaties door bufferen. In de meeste toepassingsgevallen is PrintWriter de voorkeur voor tekstoutput, maar als je gewoon snel tekens of strings zonder opmaak wilt schrijven — is BufferedWriter beter.
Een ontwikkelaar leest gegevens uit een groot bestand met behulp van FileInputStream, gebruikt geen buffering en vergeet de stream te sluiten.
Voordelen:
Nadelen:
Een combinatie van BufferedReader met try-with-resources wordt gebruikt, lezen en verwerken gaat in batches per regel, de stream wordt automatisch gesloten.
Voordelen:
Nadelen: