Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
Input/OutputDatenströme schließen in eigener Methode
Ich habe den Titel so gewählt, weil ich nicht sicher bin, wo genau mein Fehler liegt.
Folgendes Problem:
Ich habe einen Code, der eine Datei byteweise einliest, verarbeitet und anschließend in eine neue Datei schreibt. Danach sind die Byteströme wieder zu schließen. Soweit so gut, funktioniert auch alles. Nun lautet die Aufgabenstellung allerdings, die beiden close() Aufrufe in eine eigene Methode "auszulagern".
Mein Versuch (stark gekürzt):
Java:
public void machWas() {
//Byteströme öffnen
dis = new DataInputStream(
new BufferedInputStream(
new FileInputStream(
new File(inFile))));
dos = new DataOutputStream(
new BufferedOutputStream(
new FileOutputStream(
new File(outFile))));
/******** Daten werden verarbeitet *******/
// Aufruf Methode close()
close();
} // Ende von machWas()
public void close() {
if (dis != null) {
dis.close();
}
if (dos != null) {
dos.close();
}
} // Ende von close()
Schreibe ich die beiden If-Abfragen an die Stelle des Aufrufs close() innerhalb von machWas() funktionert alles wie es soll. Schreibe ich es so wie oben bekomme ich für dis und dos in der Methode close() die Fehlermeldung "cannot be resolved to a variable". Nach meinem Verständnis stimmt da also was nicht mit dem Aufruf von dis und dos innerhalb von close(). Ich habe aber keinen Schimmer, was.
Bedeutet, dass deine Variablen dis und dos in der Methode close() nicht verfügbar sind. Ich weiß nicht wie und wo du die beiden Variablen deklariert hast, aber sie scheinen nicht global zu sein.
Daher würde ich dir raten die beiden Streams deiner close Methode als Parameter zuübergeben .. bspw. so:
Das ist vermutlich eine Uebung - aber ein denkbar schlechtes Beispiel. Seit Java7 gibt es den Try-With-Resources Block, der den Vorteil hat, dass beim Verlassen des Blocks alle Resourcen automatisch geschlossen werden (alle die AutoCloseable implementieren um genau zu sein).
Code:
import java.io.*;
public class TryWithResources {
public static void main(String[] args) {
String inFile = "";
String outFile = "";
try (InputStream dis = new DataInputStream(
new BufferedInputStream(
new FileInputStream(
new File(inFile))));
OutputStream dos = new DataOutputStream(
new BufferedOutputStream(
new FileOutputStream(
new File(outFile)))); ) {
// arbeite mit den streams
// nicht noetig, weil das Verlassen des Blocks alle Streams schliesst, aber dennoch guter Stil
dis.close();
dos.close();
}
catch (IOException e)
{
// handle exception...
}
}
}
Es verdeutlicht was passiert und richtet keinen Schaden an. Code ist fuer Menschen geschrieben, nicht nur fuer die Maschine. Ist vermutlich Ansichtssache.
Erstmal vielen Dank. Robat hat mir weitergeholfen. Ich habe es zwar nicht so gemacht, wie vorgeschlagen (Aufgabenstellung war so, dass ich mit close() keine Parameter übergeben durfte). Aber ich habe dis und dos eine Ebenen höher deklariert und jetzt läuft alles.