Datei *effektiv* einlesen



  • Hi,
    z.Z. lese ich Dateien mit dem FileInputStream in einen String ein.
    Das verbraucht aber inklusive des Try-Blocks zu viele Zeilen - ich brauche eine Lösung, die möglichst wenige Zeilen benötigt.
    Jemand eine Idee?

    Thanks 🙂



  • alles in eine zeile pferchen? 🤡



  • Ok, ich präzisiere: Eine Lösung, die weniger Semikolons benötigt wird gesucht 😉



  • Wo ist denn da der Sinn? Willst du eleganten Code schreiben? Dann poste doch mal den jetzigen und wir können Verbesserungsvorschläge machen. Semikolone zählen ist ja wohl kein guter Anhaltspunkt.



  • Wegen der Länge: Ich habe es mir einfach als Herausforderung gesetzt, mit möglichst wenig Code eine bestimmte Aufgabe zu lösen, und dabei natürlich noch im lesbaren (stilistisch-sauberen) Bereich zu bleiben.

    Ich habe etwas herumoptimiert und bin inzwischen auf eine recht kurze Form gekommen. Ich hötte nur gedacht, dass es in Java einen einzigen Befehl gibt, der eine Datei sofort in einen String schreibt:

    System.out.println("Pfad der Textdatei eingeben:");
    String pfad = (new BufferedReader(new InputStreamReader(System.in))).readLine();
    
    byte textbytes[] = new byte[100000];
    int len = new FileInputStream(pfad).read(textbytes);
    text = new String(textbytes,0,len);
    


  • Du hast den sauberen Bereich schon verlassen weil finally mit close() fehlt. Ich würde mir als Kriterium setzen, den Code möglichst lesbar zu haben. Warum liest du den String aus der Textdatei eigentlich nicht mit einem InputStreamReader?



  • Stimmt, das close() fehlt. Kannst du ein Beispiel posten, wie das funktioniert? Ich kenne nur den FileInputStream.

    Und wie gesagt geht bei dieser Sache Kompaktheit vor sauberen Code, ist nur eine kleine persönliche Herausforderung mit wie wenig Code ich ein bestimmtes Problem lösen kann.



  • Ein Beispiel für finally:

    byte textbytes[] = new byte[100000];
    InputStream stream = null;
    try {
        stream = new FileInputStream(pfad);
        int len = stream.read(textbytes);
        text = new String(textbytes,0,len);
    }
    finally {
        safeClose(stream);
    }
    

    safeClose ist eine Funktion, die du dir selber schreibst. Die prüft auf null, falls nicht null close() und fängt dabei jede IOException.

    Ja, ich weiß, macht deinen Code mit Sicherheit nicht kürzer. Aber muss einfach sein. Wenn du bereit bist, guten Stil und Sicherheit einzutauschen, um aus privatem Vergnügen jetzt besonders kurzen Code zu schreiben, kann ich dir einfach nicht helfen, weil ich das selber so nicht versuche. Sorry, bin ja schon still. 😃


Log in to reply