JavaFX Mit Stream-API (1.8) in Textdatei schreiben

Phoenixz

Mitglied
Abend,

hab da ein kleines Problem. Ich habe eine ArrayList mit verschiedenen Strings, möchte davon aber nur die ersten 10 ausgeben. Anschließend möchte ich diese in eine Textdatei schreiben.
Dies möchte ich alles mit Hilfe des Interface
Java:
Stream<T>
und Lambda-Ausdrücken schaffen (falls dies möglich ist):

Java:
FileWriter fwriter = new FileWriter("stream.txt");
//Füllen
ArrayList<Integer> strings = new ArrayList<>();
for (int i = 0; i < 100; i++) {
	    	strings.add("nummer" + String.valueOf(i));
}

Stream<String> stream1 = strings.stream().limit(10);
stream1.forEach(w -> fwriter.write(w)); // hier gibt es eine Errormeldung s.u.

fwriter.close();

Folgende Errormeldung taucht auf:
"Exception in thread "main" java.lang.Error: Unresolved compilation problem:
Unhandled exception type IOException"

Try-catch-Block bringt nichts (Vorschlag des Compilers), was mache ich falsch?
 
Zuletzt bearbeitet:

nvidia

Bekanntes Mitglied
Der Lambda-Ausdruck ist das Problem. Die write()-Methode wirft eine checked Exception, IOException in diesem Fall, und diese wird vom umgebenden Kontext, dem Stream, nicht verarbeitet. D.h. die Exception muss also direkt im Lambda-Ausdruck behandelt werden. Das ist relativ unschön, aber gehört mit zu den "Trade-Offs" die getroffen worden sind. Vll. verbessert sich da etwas in den kommenden Java-Versionen. Jedenfalls müsste der Code ungefähr wie folgt aussehen.

Java:
stream1.forEach(w -> {
            try {
                fwriter.write(w);
            } catch (IOException e) {
                throw UncheckedIOException::new;
            }
        });
 

Ruzmanz

Top Contributor
Ich persönlich lagere die Methoden gerne aus, damit man die Debuggen kann und der Quelltext leserlicher wird. Hättest du da einen Einwand nvidia?

Java:
public class IDontKnow {  
	FileWriter fwriter;

    public IDontKnow() {
    	List<String> s = Arrays.asList(new String[]{"a", "b", "c", "d"});
        s.forEach(this::appendToFile);
        // == s.forEach(text -> appendToFile(text));
    }
    
    private void appendToFile(String text) {
    	try {
    		fwriter.write(text);
    	} catch(IOException ex) {
    		throw new UncheckedIOException(ex);
    	}
    }
}
 

nvidia

Bekanntes Mitglied
Hm, naja, bei so kurzen Ausdrücken ist das Geschmackssache, kann man tun, muss man nicht. Und eigentlich will man etwas leicht anderes, und zwar die Funktionalität zwischen dem try-catch abstrahieren. Angenommen wir bleiben bei deinem Beispiel und bekommen von irgendwoher einen FileWriter. Dann könnte die erste Maßnahme wie folgt aussehen:

Java:
 public class IDontKnow {
        @FunctionalInterface
        private interface ConsumerWithEx<T> {
            void accept(T t) throws Exception;
        }

        FileWriter fwriter;

        private static <T> Consumer<T> toUnchecked(ConsumerWithEx<T> consumer){
            return (T arg) -> {
                try {
                    consumer.accept(arg);
                } catch (IOException e) {
                    throw new UncheckedIOException(e);
                } catch (Exception e) {
                    throw new RuntimeException(e);
                } catch (Throwable t){
                    throw t;
                }
            };
        }

        public IDontKnow() {
            Consumer<String> appendToFile = toUnchecked(fwriter::write);
            Arrays
                .stream(new String[]{"a", "b", "c", "d"})
                .forEach(appendToFile::accept);
        }
    }

Und falls wirklich noch mehr hinzukommt als nur das Schreiben der Zeile, vll. eine Validierung etc. kann man dann so wie du eine weitere Methode einführen.

Java:
        public IDontKnow() {
            //Consumer<String> appendToFile = toUnchecked(fwriter::write);
            Consumer<String> appendToFile = toUnchecked(this::appendToFile);
            Arrays
                .stream(new String[]{"a", "b", "c", "d"})
                .forEach(appendToFile::accept);
        }

        private void appendToFile(String text) throws IOException {
            //mach dies
            fwriter.write(text);
            //mach jenes
        }

Aber man sieht das bei der Verwendung von Lambda-Ausdrücken darauf geachtet werden sollte das keine checked Exceptions verwendet werden, es ist einfach hakelig und unschön.
 
Zuletzt bearbeitet:
Ähnliche Java Themen
  Titel Forum Antworten Datum
S Stream API, Anonyme Klasse AWT, Swing, JavaFX & SWT 8
F Output Stream / File Dateien / Speichern AWT, Swing, JavaFX & SWT 13
N Input/Output Stream werte in Label anzeigen. AWT, Swing, JavaFX & SWT 6
M html aus einem Stream Laden und Anzeigen AWT, Swing, JavaFX & SWT 4
B Swing Sudoku: Laden / Speichern von Zahlen aus/in mehrere JTextFields aus/in eine(r) Textdatei AWT, Swing, JavaFX & SWT 9
N In Textdatei Text anfügen per GUI AWT, Swing, JavaFX & SWT 3
N Textdatei GUI, Text in Textarea anzeigen mehrere Zeilen AWT, Swing, JavaFX & SWT 1
D String als Textdatei in ausgewähltem Speicherplatz speichern AWT, Swing, JavaFX & SWT 32
T textdatei beschreiben AWT, Swing, JavaFX & SWT 3
X Zeilen aus einer Textdatei einzelnd als String abrufen AWT, Swing, JavaFX & SWT 8
K GUI Elemente über eine separate Textdatei beschriften? AWT, Swing, JavaFX & SWT 4
C SWT Combobox mit Textdatei füllen AWT, Swing, JavaFX & SWT 2
S Textdatei zu JTable AWT, Swing, JavaFX & SWT 14
L Zeilenumbrüche aus JTextArea MIT in Textdatei schreiben AWT, Swing, JavaFX & SWT 4
A Swing von Textdatei einlesen und per JLabel anzeigen AWT, Swing, JavaFX & SWT 2
B textdatei speichern AWT, Swing, JavaFX & SWT 9
J Aus einer JList den Inhalt als Textdatei speichern AWT, Swing, JavaFX & SWT 15
J Daten aus einer Textdatei in ArrayList holen AWT, Swing, JavaFX & SWT 9
B SWT Textdatei Lesen und Anzeige in View - Zeichensatzproblem AWT, Swing, JavaFX & SWT 4
J Integer aus Textdatei auslesen und in Variable speichern AWT, Swing, JavaFX & SWT 11
G Den Ihnhalt aus einem JTextArea in eine Textdatei speichern? AWT, Swing, JavaFX & SWT 16
G Komponente zur Anzeige einer Textdatei. AWT, Swing, JavaFX & SWT 10
G Anzeigen einer Textdatei in einem Fenster AWT, Swing, JavaFX & SWT 6
izoards JTable in CSV File schreiben... AWT, Swing, JavaFX & SWT 23
A JavaFX Daten in eine HTML-Table mit JS schreiben AWT, Swing, JavaFX & SWT 3
M Eigene Klasse mit Grafikobjekten schreiben AWT, Swing, JavaFX & SWT 4
P Variable einer Eingabe in anderes Textfeld schreiben AWT, Swing, JavaFX & SWT 7
M JavaFX berechneten Wert in TableView schreiben AWT, Swing, JavaFX & SWT 1
W Kodierung (CharSet) beim Schreiben ändern AWT, Swing, JavaFX & SWT 1
3 Swing JList-Inhalt als verschlüsselte Datei schreiben und lesen AWT, Swing, JavaFX & SWT 1
A Swing KeyEvent mit KeyListener und KeyAdapter kürzer schreiben AWT, Swing, JavaFX & SWT 7
S Swing Verzeichnis/Datei-Pfad in JTextField schreiben AWT, Swing, JavaFX & SWT 2
S Swing Eigenen Button schreiben AWT, Swing, JavaFX & SWT 6
B Daten in eine JTable schreiben AWT, Swing, JavaFX & SWT 3
1 Eigenes Layout schreiben AWT, Swing, JavaFX & SWT 4
J Swing Bild laden, Kreise drin malen, Schreiben AWT, Swing, JavaFX & SWT 2
C Integer in ein Textfield schreiben. AWT, Swing, JavaFX & SWT 4
M Swing In GUI-Builder-JFrame mit Menü Schreiben und Zeichnen AWT, Swing, JavaFX & SWT 4
W Vergleich zweier Strings und schreiben in Textarea AWT, Swing, JavaFX & SWT 12
A Swing Text auf eine Seite an beliebigen Orten schreiben AWT, Swing, JavaFX & SWT 6
M JFreeChart in ein File schreiben (bzw. JFrame in ein File Schreiben) AWT, Swing, JavaFX & SWT 2
P Swing Alle Zeilen einer Spalte (jTable) zusammen zählen und in eine eigene Zeile das Ergebnis schreiben. AWT, Swing, JavaFX & SWT 7
E werte zurück in GUI schreiben AWT, Swing, JavaFX & SWT 4
S 3D-Creator schreiben? AWT, Swing, JavaFX & SWT 5
J Eigenen Parser schreiben AWT, Swing, JavaFX & SWT 8
T JTree Daten in DB schreiben am besten SQL AWT, Swing, JavaFX & SWT 21
G Text in JTable schreiben AWT, Swing, JavaFX & SWT 3
S Wie kann man eine XSLT-Parser schreiben? AWT, Swing, JavaFX & SWT 2
L Swing Farbige JComboBox schreiben AWT, Swing, JavaFX & SWT 5
R Direkt in Puffer schreiben AWT, Swing, JavaFX & SWT 7
I 2D-Grafik Problem mit schreiben von Text auf eine Grafik AWT, Swing, JavaFX & SWT 7
M Text in txt-Datei in letzte Zeile schreiben? AWT, Swing, JavaFX & SWT 14
U Beste Möglichkeit JTable-Änderungen in DB zu schreiben? AWT, Swing, JavaFX & SWT 14
D Suche Framework um Grafikprogramm zu schreiben. AWT, Swing, JavaFX & SWT 36
J In JTextfield bei event schreiben AWT, Swing, JavaFX & SWT 4
F png-Datei erstellen und einzelne Pixel schreiben AWT, Swing, JavaFX & SWT 2
G eigenen Observer schreiben AWT, Swing, JavaFX & SWT 6
G JIntegerField selber schreiben AWT, Swing, JavaFX & SWT 2
S Vorhandene Datei in anderes Verzeichnis schreiben! AWT, Swing, JavaFX & SWT 8
T JTable in *.dat schreiben und auslesen AWT, Swing, JavaFX & SWT 7
G Textfeld Auslesen und in Array schreiben (bei newline) AWT, Swing, JavaFX & SWT 2
I Event, Eventquelle und Listener selber schreiben AWT, Swing, JavaFX & SWT 9
W Vollbild Frames neu schreiben AWT, Swing, JavaFX & SWT 2
I BMP mit ImageIO schreiben AWT, Swing, JavaFX & SWT 1
M .txt unter Verwendung von JSpinner in Textfeld schreiben AWT, Swing, JavaFX & SWT 4
S Menuausgabe in Tabelle schreiben AWT, Swing, JavaFX & SWT 7
S In Instanz von JTextArea schreiben AWT, Swing, JavaFX & SWT 4
H Yes No Dialog eleganter schreiben AWT, Swing, JavaFX & SWT 2
S Text eines JButtons vertikal schreiben AWT, Swing, JavaFX & SWT 5
V Listener selber schreiben? AWT, Swing, JavaFX & SWT 2
M Daten in JTable aus DB schreiben ? AWT, Swing, JavaFX & SWT 16
P Eigenes Look&Feel schreiben (Tutorials?) AWT, Swing, JavaFX & SWT 6
G Vertikal schreiben AWT, Swing, JavaFX & SWT 5
G TableModel auswerten und in Datei schreiben AWT, Swing, JavaFX & SWT 3
R JPanel als Screenshot in eine Datei schreiben AWT, Swing, JavaFX & SWT 3

Ähnliche Java Themen

Neue Themen


Oben