IO Streams

JavatarAang

Mitglied
Hallo leute, ich beschäftige mich gerade mit IO Streams.

Jedoch komme ich mit einem teil nicht klar.
BufferedStreams.
Es gibt eine methode, um einzelne zeilen von Textdateien einzulesen "readline()".
read ist mein BufferedReader
Ich deklariere einen String s = read.readLine(); //<- Liest das nur die erste Zeile und speichert dass in mein String s ?
jetzt möchte ich eine while schleife
while(s != null){
system.out.Println("Hello World");
}

Nun erhalte ich aber eine endlosschleife :(
Die zeilen enden doch aber irgendwann oder nicht ?!
Danke im voraus.
 

httpdigest

Top Contributor
Wenn dein Code so aussieht:
Java:
String s = read.readLine();
while (s != null) {
  System.out.println("Hello World");
}
dann ist das natürlich eine Endlosschleife, wenn der BufferedReader eine Zeile gelesen hat.
Du hast ja in etwa dann sowas programmiert:
Java:
int a = 1;
while (a == 1) {
  System.out.println("Hello World");
}
Das heißt, der Wert deiner Variablen "s" wird ja nie wieder (innerhalb der Schleife) geändert.
 

httpdigest

Top Contributor
Du musst einfach innerhalb der Schleife wieder s = read.readLine() aufrufen. Woher soll denn der String 's' wissen, dass er ursprünglich mal von reader.readLine() kam und dass er automatisch den nächsten Wert vom BufferedReader zugewiesen bekommen soll, wenn du ... was machst?
 

JavatarAang

Mitglied
okay, hast recht. wenn ich s.readline in die while schleife packe, springt er dan praktisch immer eine zeile weiter. Bis iwann mal meine Zeile null ist richtig ?
 

karlmasutra

Mitglied
Hallo zusammen,

ich hätte auch mal eine Frage zu Streams.
Folgendes Szenario. Ich habe ein Programm zur Fakultätsberechnung geschrieben und wollte das Ergebnis (Typ long) jetzt in eine Datei schreiben lassen.

1. Idee: FileWriter
Hat auch funktioniert, nur hat mich gestört, dass ich zusätzlich einen String mit einbauen musste, da es keine Methode für long gibt.
2. Idee: DataOutputStream(FileOutputStream)
Hier gibt es ja eine Methode writeLong, also dachte ich, dass ich einen Treffer habe. Blöderweise schreibt er mir nur irgendwelche Zeichen in die Datei, nicht die Zahl die er eigentlich schreiben sollte.
Mach ich es über writeUTF und verknüpfe die Zahl mit eine String, geht es wieder.

Kann mir vllt sagen wieso die Methode writeLong nicht funktioniert?

VG
Marco
 

httpdigest

Top Contributor
Die Methode DataOutputStream.writeLong() funktioniert so, wie sie funktionieren soll.
Sie schreibt 8 Bytes eines Zweierkomplement Longs in Big Endian (auch "Network Byte Order" genannt).
Solch einen Wert kannst du dir natürlich nicht einfach in einem Texteditor anzeigen lassen, welcher glaubt, dass die Bytes in der Datei Zeichen in einem Zeichensatz (ASCII, ANSI, UTF-8, etc.) entsprechen.
Nein, die Bytes entsprechen der genannten Kodierung einer 8-Byte Ganzzahl, entsprechen also nicht einer Kodierung der long-Zahl als Zeichenkette in einem Zeichensatz wie ASCII.
 

httpdigest

Top Contributor
Aber wie kann ich mir denn dann einen long-Variable ausgeben lassen? Also ohne das ich mit einem String konkateniere?
Java:
long derWert = 1024;
System.out.println(derWert);

EDIT: Wenn du damit meinst, wie du einen long-Wert mit Hilfe von DataOutputStream und DataInputStream in eine Datei schreiben und dann aus dieser wieder auslesen und ausgeben kannst:
Java:
import java.io.*;
public class Test {
  public static void main(String[] args) throws IOException {
    // In Datei schreiben:
    long zuSchreibenderWert = 1024;
    try (FileOutputStream fos = new FileOutputStream("meineDatei.bin");
         DataOutputStream dos = new DataOutputStream(fos)) {
      dos.writeLong(zuSchreibenderWert);
    }
    // Aus Datei lesen:
    try (FileInputStream fis = new FileInputStream("meineDatei.bin");
         DataInputStream dis = new DataInputStream(fis)) {
      long gelesenerWert = dis.readLong();
      System.out.println(gelesenerWert);
    }
  }
}
 
Zuletzt bearbeitet:

karlmasutra

Mitglied
EDIT: Wenn du damit meinst, wie du einen long-Wert mit Hilfe von DataOutputStream und DataInputStream in eine Datei schreiben und dann aus dieser wieder auslesen und ausgeben kannst:
Java:
import java.io.*;
public class Test {
  public static void main(String[] args) throws IOException {
    // In Datei schreiben:
    long zuSchreibenderWert = 1024;
    try (FileOutputStream fos = new FileOutputStream("meineDatei.bin");
         DataOutputStream dos = new DataOutputStream(fos)) {
      dos.writeLong(zuSchreibenderWert);
    }
    // Aus Datei lesen:
    try (FileInputStream fis = new FileInputStream("meineDatei.bin");
         DataInputStream dis = new DataInputStream(fis)) {
      long gelesenerWert = dis.readLong();
      System.out.println(gelesenerWert);
    }
  }
}

Und genau das funktioniert ja nicht. Das habe ich ja vorhin gemeint.
Hier mein Quellcode:
Java:
package oo1;

import java.io.DataOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class Streams {
    public static void main (String [] args) {
        Fakultaet f = new Fakultaet(15);
        FileWriter fw;   
        DataOutputStream dos;
        try {
            dos = new DataOutputStream(new FileOutputStream("/Users/h0ax3s/Desktop/fakultaet.txt"));
            dos.writeLong(f.fakRek(f.getX()));
            dos.flush();
            dos.close();  
        } catch (IOException e) {
            e.printStackTrace();
        }

    }
}
Java:
package oo1;
public class Fakultaet {
     private long x;

     public Fakultaet(long x) {
          this.x = x;
     }

     public long fakRek(long x) {
          if(x==0 || x ==1) {
          return 1;
          } if( x < 0) {
             return 0;
          } else {
             return x *=fakRek(x-1);
          }
     }

     public long fakIt(long x) {
          long erg = 1; 
          for (int i = 1; i <= x; i++) {
             erg = erg * i;
          }
          return erg;
     }

     public long getX() {
          return x;
     }
}
Hier die Ausgabe der txt
Code:
0wwX
 

httpdigest

Top Contributor
10000%ig funktioniert das. Führe den Code, den ich geschickt habe, einfach mal aus. Du darfst nur eben nicht erwarten, die Datei einfach in einem Texteditor öffnen zu können und dort eine lesbare Zahl zu sehen... herrgottnochmal. .:)
Du musst natürlich (wie ich ja auch in dem Code benutzt hatte) einen DataInputStream verwenden.
Wenn du unbedingt die Zahl tatsächlich als Zeichenkette in der Datei speichern möchtest, verwende einfach einen PrintWriter auf einem FileOutputStream.
Dann kannst du auch Long.toString(deinLong) nehmen.

EDIT: Du hast leider auch noch mit keinem Wort erwähnt, wie, womit und wo du eigentlich die geschriebene Datei wieder einliest? Wie machst du das? Welcher Code oder welches Programm generierte dir die Zeichenkette "0wwX" aus deinem letzten Beispiel? Zeig den Code am besten mal und dann schreiben wir den um, dass er DataInputStream verwendet.
 
Zuletzt bearbeitet:

karlmasutra

Mitglied
Ja da ist doch die Lösung meines Problems. :D
Mit dem PrintWriter(FileOutputStream(.....)) hat es geklappt. Danke dafür.

10000%ig funktioniert das. Führe den Code, den ich geschickt habe, einfach mal aus. Du darfst nur eben nicht erwarten, die Datei einfach in einem Texteditor öffnen zu können und dort eine lesbare Zahl zu sehen... herrgottnochmal. .:)
Da haben wir mal klassisch aneinander vorbei geredet. Ich dachte du wolltest mir mit deinem Code sagen, dass ich den long-Wert jetzt in der Datei sehen kann. :D

Welcher Code oder welches Programm generierte dir die Zeichenkette "0wwX" aus deinem letzten Beispiel?
Das war der Stream, der in die Datei geschrieben wurde. Also mein erwarteter long-Wert.

Bezüglich einer Weiterverarbeitung(einlesen in ein anderes Programm etc.) habe ich mich noch garnicht gekümmert, da ich erstmal nur Werte(sichtbar) in einer Datei stehen haben wollte.

Danke nochmals für deine Hilfe. Lass es dir gut gehen.

VG
Marco
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
8u3631984 Frage zu Java Streams min / max Allgemeine Java-Themen 17
Z Mit Java 8+ Streams Zeilen nummern zu Zeilen hinzufügen Allgemeine Java-Themen 17
F Streams als Alternative für dieses Problem ? Allgemeine Java-Themen 15
Monokuma Lesbarkeit von Streams Allgemeine Java-Themen 6
Monokuma Foreach Schleifen in Streams umändern Allgemeine Java-Themen 23
J Streams Allgemeine Java-Themen 6
LimDul Streams und Exception Allgemeine Java-Themen 8
LimDul Mittels Streams aus Strings A B C den String A, B und C machen Allgemeine Java-Themen 12
K Lesbarkeit von Streams Allgemeine Java-Themen 5
X Ermittlung eines doppelte Paars mit Streams Allgemeine Java-Themen 50
mihe7 Lesbarkeit von Streams Allgemeine Java-Themen 5
N Streams wann .filtern? Allgemeine Java-Themen 2
A Lambda und Streams verstehen Allgemeine Java-Themen 4
M Wie funktionieren parallele Java Streams? Allgemeine Java-Themen 1
R Collections BiPredicate in Java 8 Streams Allgemeine Java-Themen 7
F Umgehen mit übergebenen Streams Allgemeine Java-Themen 3
hdi Überwachen des err-Streams? Allgemeine Java-Themen 8
N read streams umleiten Allgemeine Java-Themen 2
DEvent GZIP Streams und gzip Allgemeine Java-Themen 2
S Streams zusammenfügen Allgemeine Java-Themen 4
J Objekt in Datei speichern mittels Streams Allgemeine Java-Themen 6
F Double mit Streams aus Datei einlesen Allgemeine Java-Themen 3
C in Streams Allgemeine Java-Themen 4
M Sind Streams asynchron? Allgemeine Java-Themen 2
Saxony DOS Konsole und deren Streams Allgemeine Java-Themen 5
B Probleme mit Streams Allgemeine Java-Themen 5
T Zwei Streams verbinden Allgemeine Java-Themen 3
L Die Wahl des richtigen Streams? Allgemeine Java-Themen 3
G Video Streams mit Servlets Allgemeine Java-Themen 3
P Streams per Mail mit JavaMailAPI versenden Allgemeine Java-Themen 3
A Streams: merkwürdiges Verhalten Allgemeine Java-Themen 7
A Streams - merkwürdiges Verhalten Allgemeine Java-Themen 2
thE_29 Problem mit Streams Allgemeine Java-Themen 6

Ähnliche Java Themen

Neue Themen


Oben