Auslesen von File - ASCII und Binärzeichen

Status
Nicht offen für weitere Antworten.

redbomber

Bekanntes Mitglied
Hi zusammen,
versuche gerade Daten aus einer Datei auszulesen.

Dies enthält erst einmal einige ASCII Zeichen, die ich auch problemlos auslesen kann.
Danach kommen dann binärdaten.
Dabei handelt es sich um Zahlen:
Diese sind vom Typ Integer, Double oder Short (dies weiss ich)
Die Anzahl der Zahlen weiss ich auch.

Nun ist meine Frage wie ich die genau auslesen kann.

Die ASCII Zeichen lese ich bisher wie folgt aus:

Code:
File file = new File(myWholeFileName);
			FileReader in = new FileReader(file);
			BufferedReader buf = new BufferedReader(in);
			System.out.println("Reading in file " + myWholeFileName);
			
			String line = buf.readLine();
while(line != null){

...

                        line = buf.readLine();
		        linecounter++;
}

Also ich lese die datei immer zeilenweise aus.
Was mache ich aber ab dem Punkt, ab dem ich zu den Binärdaten gelange?
 

redbomber

Bekanntes Mitglied
Also mir ist klar, dass ich mit dem FileReader Textdateien einlesen kann.

Für die Binärdaten brauche ich dann aber den FileInputStream.

Nur ich müsste ja an z.b. Zeile 9 meiner Datei von meinem FileReader zum FileInputStream wechseln.
Oder kann ich dem FileInputStream irgendwie informieren, ab welcher Zeil der datei er anfangen muss?
 

HannsW

Bekanntes Mitglied
redbomber hat gesagt.:
Also mir ist klar, dass ich mit dem FileReader Textdateien einlesen kann.

Für die Binärdaten brauche ich dann aber den FileInputStream.

Nur ich müsste ja an z.b. Zeile 9 meiner Datei von meinem FileReader zum FileInputStream wechseln.
Oder kann ich dem FileInputStream irgendwie informieren, ab welcher Zeil der datei er anfangen muss?

Du musst mit dem FileInputStream arbeiten, und kommst nicht umhin, die Textzeichen zu casten:
Code:
    BufferedInputStream fin = null;    // der geht schneller !
    int in = -1;
    String str = "";

    long skipOffset = 77125344;

    try {
        fin = new BufferedInputStream(new FileInputStream(inFileName));
    } catch (java.io.IOException io) {
        System.out.println("Kann Rep datei nicht öffnen");
        System.exit(1);
    }

  // dies dürfte Dir weiterhelfen ?? 
   try {
        fin.skip(skipOffset);
    } catch (java.io.IOException io) {
        System.exit(1);
}
 

redbomber

Bekanntes Mitglied
hey,
also ich hab das jetzt mal wie folgt probiert:

Während ich die ASCII Files auslese summiere ich die Anzahl der Bytes pro Line:
Code:
int skipBytes = 0;
BufferedReader buf = new BufferedReader(in);
String line = buf.readLine();

und dann zähle ich einfach am Ende die gelesenen Bytes zusammen:
Code:
byte[] ba = line.getBytes();
skipBytes += ba.length;

In meinem Binary Reader skippe ich dann diese Anzahl der Bytes
und kann danach die Double Werte auslesen:

Code:
FileInputStream file_input = new FileInputStream(myWholeFileName);
DataInputStream data_in = new DataInputStream(file_input);

data_in.skipBytes(...);

while (true) {
				try {
					d_data = data_in.readDouble();

				} catch (EOFException eof) {
					System.out.println("End of File");
					break;
				}
				
				data.add(d_data);
				
				System.out.println(d_data);
				counter++;
			}
			data_in.close();

Das ganze klappt aber noch nicht so ganz, es werden die falschen Werte ausgelesen, da das Leseraster der Bytes vermutlich verschoben ist.

Hab ich hier irgendwo einen Denkfehler drinne oder habt ihr vielleicht noch eine andere Idee?
 

HannsW

Bekanntes Mitglied
Nur ne Idee:
Könnt es sein, daß dir beim Addieren ein Byte pro Zeile verloren geht?
Nämlich das newLien in der Datei?
Dann müsste dies klappen?
Code:
byte[] ba = line.getBytes();
skipBytes += ba.length + 1 ;
 

redbomber

Bekanntes Mitglied
Also das habe ich jetzt auch ausprobiert, aber das klappt noch immer nicht.
Es sind immer noch zu wenige Bytes die übersprungen werden.

Ich kann dies ja testen in dem ich einfach noch mehr bytes überspringe.
Irgend wann komme ich dann an die gewünschten Daten.

Hat vielleicht noch jemand eine Idee?
 
S

Spacerat

Gast
Pauschal würde ich mal darauf tippen, das bei Verwendung von "readLine()", so manch ein String bereits Binärdaten enthält. Binärdaten dürfen nämlich ohne Linefeed enden. Da "readLine()" aber bis zum Ende einer Zeile, also bis zum Linefeed liest, wird eine folgende ASCII-Zeile natürlich überlesen. Hier hilft wohl nur ein Stream-Tokenizer, bei dem alle Nicht-ASCII-Zeichen als Tokens oder besser als Whitespace angesehen werden müssten, damit sie überlesen werden können. Ferner könnte es möglich sein, das ASCII-Daten nicht mit LF, sondern NULL-Terminiert enden. Eine solche Zeile landet mit "readLine()" sozusagen im Hades.
 
Zuletzt bearbeitet von einem Moderator:

redbomber

Bekanntes Mitglied
Also meine Files besitzen alle dieselbe Anzahl an "ASCII Zeilen", worin jedoch etwas unterschiedliches steht.

Nun habe ich bemerkt, dass die ermittelte Anzahl der zu überspringenden Bytes ja immer zu klein ist.
Bei allen Files muss ich DENSELBEN Wert hinzu addieren und dann passt das ganze.

Da die Zeilenanzahl der Kommentare also gleich ist, wird das wie du gesagt hast etwas mit den readLines() zu tun haben.


--------------------

jo, hätte nicht gedacht das dies so kompliziert ist :(

mal eine Frage zu einem anderem Ansatz.
Ich dachte daran das File komplett in Bytes einzulesen. Gibt es die Möglichkeit an einem Byte zu erkennen, ob es sich dabei um ein NewLine Zeichen handelt?
Weil dann könnte ich einfach z.b. das 7te Newlin zeichen suchen, danach weiss ich dann dass meine Daten anfangen.
 
Zuletzt bearbeitet:
S

Spacerat

Gast
Hatte ich in meinem Beitrag schon erwähnt -> "Stream-Tokenizer"...
 

redbomber

Bekanntes Mitglied
ja aber welche Information soll ich denn von dem StringTokenizer erhalten?
Ich kann ja nicht die bytes für jedes Token auslesen oder so.

Also ich versteh nur nicht wie ich den String Tokenizer hier anwenden muss, damit ich etwas über die Anzahl der zu überspringenden Bytes erfahre.
 
S

Spacerat

Gast
... genau... StreamTokenizer... nicht zu verwechseln mit StringTokenizer :)
[highlight=java]package extended.stream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.StreamTokenizer;
public class ExtendedStreamTokenizer
extends StreamTokenizer
{
public static final IOException UNEXPECTED_EOF = new IOException("unexpected end of file");
public static final IOException UNEXPECTED_OPEN = new IOException("unexpected open char");
public static final IOException UNEXPECTED_CLOSE = new IOException("unexpected close char");
public static final int
TT_CLOSE = -5,
TT_OPEN = -6,
TT_INVALID = -7,
TT_DOUBLEQUOTE = '"',
TT_SINGLEQUOTE = '\'';
private final BufferedInputStream in;
private int open = '{', close = '}', markedType;
private String markedString;
private double markedNumber;
public ExtendedStreamTokenizer(BufferedInputStream in)
{
super(new InputStreamReader(in));
this.in = in;
}
public void whitespaceChar(int token)
{
whitespaceChars(token, token);
}
public void parseNumbers(boolean sw)
{
if(sw) {
super.parseNumbers();
} else {
ordinaryChars('0', '9');
ordinaryChar('.');
ordinaryChar('-');
wordChars('0', '9');
wordChar('.');
wordChar('-');
}
}
public void wordChar(int token)
{
wordChars(token, token);
}
public void openChar(int token)
{
open = token & 0xFF;
}
public void closeChar(int token)
{
close = token & 0xFF;
}
public int nextToken()
throws IOException {
super.nextToken();
if(ttype == open) ttype = TT_OPEN;
if(ttype == close) ttype = TT_CLOSE;
return ttype;
}
public void nextLine()
throws IOException
{
do {
if(ttype == TT_EOF) throw UNEXPECTED_EOF;
nextToken();
} while(ttype != TT_EOL);
}
public void nextWord()
throws IOException
{
do {
if(ttype == TT_EOF) throw UNEXPECTED_EOF;
nextToken();
} while(ttype != TT_WORD);
}
public void nextNumber()
throws IOException
{
do {
if(ttype == TT_EOF) throw UNEXPECTED_EOF;
nextToken();
} while(ttype != TT_NUMBER);
}
public void nextClose()
throws IOException
{
do {
if(ttype == TT_EOF) throw UNEXPECTED_EOF;
nextToken();
} while(ttype != TT_CLOSE);
}
public void nextOpen()
throws IOException
{
do {
if(ttype == TT_EOF) throw UNEXPECTED_EOF;
nextToken();
} while(ttype != TT_OPEN);
}
public void nextQuotedString()
throws IOException
{
do {
if(ttype == TT_EOF) throw UNEXPECTED_EOF;
nextToken();
} while(ttype != TT_DOUBLEQUOTE && ttype != TT_SINGLEQUOTE);
}
public void nextSingleQuotedString()
throws IOException
{
do {
if(ttype == TT_EOF) throw UNEXPECTED_EOF;
nextToken();
} while(ttype != TT_SINGLEQUOTE);
}
public void nextDoubleQuotedString()
throws IOException
{
do {
if(ttype == TT_EOF) throw UNEXPECTED_EOF;
nextToken();
} while(ttype != TT_DOUBLEQUOTE);
}
public synchronized void mark(int readlimit)
{
in.mark(readlimit);
markedType = ttype;
markedString = sval;
markedNumber = nval;
}
public synchronized void reset()
throws IOException
{
in.reset();
ttype = markedType;
sval = markedString;
nval = markedNumber;
}
public synchronized int available()
throws IOException
{
return in.available();
}
}[/highlight]Dieser Code dürfte der Grund dafür sein, warum ich den StringTokenizer gar nicht mehr brauche. Zeilen zählen, Wörter zählen, Diverse String-Typen (SingleQuoted, DoubleQuoted, 0-Terminiert) lesen, im Prinzip allses was ein entsprechend konfigurierter StreamTokenizer auch kann. Zusätzlich kann an jeder beliebigen der Stream markiert werden, und später an die Stelle zurück gesprungen werden. Deswegen ist dafür auch ein BufferedInputstream nötig. Hier klemmts allerdings noch bei "LINENO", aber man arbeitet dran. Vllt. hilft der ja weiter. Ist aber (wie der grösste teil meines Quellcodes) nicht Dokumentiert.
 
Zuletzt bearbeitet von einem Moderator:
S

Spacerat

Gast
Ok... Doppelpost...
Hab' glaub' ich genug am Code oben rumeditiert... Ich frage mich, wieso ständig die Leerzeichen, Tabs und Leerzeilen bei Verwendung des Highlight-Tags verschwinden... Ist das normal, oder mache ich was falsch?
 

Ebenius

Top Contributor
[off topic] Keine Ahnung, ich kann das nicht nachvollziehen. In der ersten Zeile fehlen immer alle Leading Blanks. Benutzt Du den WYSIWYG-Editor? Mit dem Standard-Editor hab ich die Probleme nicht. Ach ja: In meinem Code hab ich nie TABs, sondern immer SPCs drin; keine Ahnung was mit TABs passiert. Allerdings editier ich ziemlich viel fremde Posts wg. fehlender Formatierung und da ist mir sowas auch noch nicht untergekommen.

Ebenius
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
M xlsx File auslesen Exception occured Allgemeine Java-Themen 13
P Kurze Frage: aus einer File die Zeilenanzahl auslesen Allgemeine Java-Themen 9
P Aus einem File Zeilen auslesen. Allgemeine Java-Themen 15
C Kompletter Pfad aus "input type=file" auslesen Allgemeine Java-Themen 3
S Property File auslesen Allgemeine Java-Themen 19
T Mit NOA *.doc file auslesen Allgemeine Java-Themen 11
D Zip file auslesen Allgemeine Java-Themen 9
I txt File in .jar File ein und auslesen Allgemeine Java-Themen 13
J Zip File auslesen Allgemeine Java-Themen 5
G Unicode file auslesen Allgemeine Java-Themen 11
D Property File auslesen in JTextFiled Allgemeine Java-Themen 4
H Package name aus Class-File auslesen Allgemeine Java-Themen 11
C txt file auslesen Allgemeine Java-Themen 3
L Input/Output Email mit großer Pdf Anhang auslesen? Allgemeine Java-Themen 7
Ernesto95 HTTP Mit JavaScript erzeugte dynamische Webseite auslesen und nach einem Schlüsselwort durchsuchen Allgemeine Java-Themen 6
K Bildschirm auslesen/ Text erkennen Allgemeine Java-Themen 5
torresbig Url nach Webseiten-Login auslesen & Daten an Webseite senden Allgemeine Java-Themen 9
S .exe Datei/Programm auslesen? Allgemeine Java-Themen 2
T INI - Einträge auslesen Allgemeine Java-Themen 6
H Auslesen eines (LDAP-)Attributs in Active Directory Allgemeine Java-Themen 2
O PDF auslesen und verändern, was ist besser iText oder PDFBox ? Allgemeine Java-Themen 9
Robertop Status von Caps- und NumLock auslesen Allgemeine Java-Themen 1
Master3000 Java Konsole über Buffered Reader Zeilenweise auslesen ? Allgemeine Java-Themen 26
G Mac Package auslesen Allgemeine Java-Themen 17
W Versionsnummer auslesen - Regex ist zickig Allgemeine Java-Themen 2
F Junit Test + Cucumber - JSON auslesen und in einem weiteren Schritt nutzen Allgemeine Java-Themen 0
M verschiedene Dokumente auslesen Allgemeine Java-Themen 1
Gaudimagspam CSV-Datei auslesen in Java Allgemeine Java-Themen 7
L Dateien richtig auslesen Allgemeine Java-Themen 6
F WireGuard Status auslesen Allgemeine Java-Themen 3
B .txt Datei erstellen und auslesen bzw. schreiben Allgemeine Java-Themen 6
I DOM-Parser - Element im Element an bestimmten Stellen auslesen Allgemeine Java-Themen 1
N Txt Datei auslesen. Allgemeine Java-Themen 5
O xlsx Datei auslesen mit POI Apache liest keine LEERZELLEN Allgemeine Java-Themen 6
O xlsx Datei auslesen mit POI von Apache wirft seltsamen Fehler. Allgemeine Java-Themen 11
J Information von getSource() Objekt auslesen Allgemeine Java-Themen 1
V EMail, Attachments auslesen von einer Email Allgemeine Java-Themen 0
K Aus String zwei Jahreszahlen auslesen Allgemeine Java-Themen 18
E CSV mit Text und Binärdaten auslesen Allgemeine Java-Themen 7
x46 Webseite in Java auslesen Allgemeine Java-Themen 2
M Html Seite auslesen Allgemeine Java-Themen 16
S Hilfe bei dem Auslesen einer YAML Datei Allgemeine Java-Themen 8
J Fenstergröße eines anderen Programmes auslesen Allgemeine Java-Themen 9
B Cookie auslesen Allgemeine Java-Themen 3
B Input/Output Programm zum Auslesen/Beschreiben von Textdateien, wie Geschwindigkeit erhöhen? Allgemeine Java-Themen 18
J Variablen Mehrere int-variablen in txt abspeichern und danach wieder auslesen Allgemeine Java-Themen 1
J Daten aus Website-Quelltext auslesen Allgemeine Java-Themen 62
J Teil einer URL auslesen Allgemeine Java-Themen 13
denny86 NetBeans Ordnernamen rekursiv auslesen und in Variable verarbeiten Allgemeine Java-Themen 38
C Atfx mit Hilfe von OpenAtfx auslesen Allgemeine Java-Themen 1
C Position von Pixeln in Bilder auslesen Allgemeine Java-Themen 2
M aktive WLAN Teilnehmer auslesen? Allgemeine Java-Themen 6
X JSONObject auslesen und in HashMap hinterlegen Allgemeine Java-Themen 16
S Kann man mit Java auf einem lokalen PC/Mac Benutzergruppen auslesen und Rechte ändern? Allgemeine Java-Themen 11
C Webseite auslesen Allgemeine Java-Themen 3
D Best Practice Gesamten Bildschirminhalt auslesen und Email schicken sobald kein Pixel sich ändert Allgemeine Java-Themen 11
A Erste Schritte Daten aus einer Website auslesen Allgemeine Java-Themen 7
J Bestimmte Zeile aus Textdatei auslesen Allgemeine Java-Themen 18
G Aus JTextField Zahlen auslesen und random generieren Allgemeine Java-Themen 10
M Tastatureingabe von Sondertasten auslesen Allgemeine Java-Themen 6
C Auslesen auslösen über Button-Click Allgemeine Java-Themen 8
U OOP Warum kann ich aus meiner Methode keinen String auslesen Allgemeine Java-Themen 4
J Auslesen Daten Java/HTML Allgemeine Java-Themen 15
4a61766120617274697374 PDF iText Wort Koordinaten auslesen Allgemeine Java-Themen 1
KeVoZ_ Bestimmte Zeile aus Console finden & auslesen Allgemeine Java-Themen 2
T Url aus txt Datei auslesen und öffnen? Allgemeine Java-Themen 4
N Werte aus Hashmap auslesen und übertragen Allgemeine Java-Themen 8
KeVoZ_ Properties mit String auslesen Allgemeine Java-Themen 11
I HTML einer Website auslesen liefert nur head Allgemeine Java-Themen 6
D Aktuell installierte Java Version auslesen unter Windows Allgemeine Java-Themen 5
M Parameter auslesen im Servlet Allgemeine Java-Themen 0
M Input/Output USB Geräteinstanzkennung auslesen Allgemeine Java-Themen 3
W 2D-Grafik Erstellungsdatum JPG direkt aus Header (EXIF) auslesen. Allgemeine Java-Themen 5
M Daten aus anderen Programmen auslesen Allgemeine Java-Themen 2
T Datei Byteweise auslesen Allgemeine Java-Themen 1
T Datentypen MNIST Datenbank auslesen (.gz) Allgemeine Java-Themen 0
T Ini Datei auslesen Allgemeine Java-Themen 3
J Temperatur aus bytes auslesen. Allgemeine Java-Themen 13
I JSoup Class auslesen Allgemeine Java-Themen 1
Bluedaishi Textdateien auslesen Allgemeine Java-Themen 12
T ELM327 OBD2 auslesen Allgemeine Java-Themen 0
D Double aus String auslesen Allgemeine Java-Themen 8
Z Zahlen aus Bild auslesen Allgemeine Java-Themen 1
A interaktives PDF auslesen/auswerten? Allgemeine Java-Themen 0
G Daten aus Website auslesen Allgemeine Java-Themen 7
S CSV Eintrag der nächsten Zeile auslesen funktioniert nicht Allgemeine Java-Themen 8
I Java FX JsonObjekt Children auslesen Allgemeine Java-Themen 23
M RXTX Details auslesen Allgemeine Java-Themen 6
N Input/Output Website Text auslesen und bestimmte Zeilen wiedergeben Allgemeine Java-Themen 4
X HTTP Auslesen der Ergebnisse von einer Webseite und in eine Liste packen Allgemeine Java-Themen 1
J Wav-Datei aus .jar auslesen Allgemeine Java-Themen 7
J Daten aus GUI auslesen und in Objekte umwandeln Allgemeine Java-Themen 6
D CSV Datei auslesen Allgemeine Java-Themen 23
N Werte aus Arrays auslesen funktioniert nicht Allgemeine Java-Themen 5
J Java JSON-Datei aus .Zip auslesen und Download mit Progress Bar Allgemeine Java-Themen 20
V Tooltips mit Java auslesen Allgemeine Java-Themen 1
I Inhalt einer Website auslesen Allgemeine Java-Themen 6
A JTable - CellRange auslesen Allgemeine Java-Themen 2
V 2d-Barcodes mit zxing auslesen Allgemeine Java-Themen 2
A Auslesen einer Datei sowie ausgeben als Liste in App Allgemeine Java-Themen 5

Ähnliche Java Themen

Neue Themen


Oben