Textdatei einlesen - erstes Zeichen falsch

Andi_CH

Top Contributor
Ich sollte eine Konfigurationsdatei einlesen (Attached - eigentlich heisst die Datei nur test.conf, aber das kann ich nicht hochladen ;-) )

Woher kommt es wohl, dass das erste Byte der Zeile "-1" ist?
Kann man so etwas geschickt handeln?
Editiert in Eclipse, Text file encoding für das Projekt UTF-8


Java:
	private boolean parseFile(String fileName) {
		boolean result = true;
		try {
			FileReader fr = new FileReader(fileName);
			BufferedReader br = new BufferedReader(fr);
			String line;
			while ((line=br.readLine()) != null ) {
				line = line.trim();
				System.out.println(line);
// Die Ausgabe sieht ganz normal aus
				for (int i=0; i<2; i++)
					System.out.println(line.charAt(i) + ", byte " + (byte)line.charAt(i));
//, byte -1 (auf der Konsole sie die erste Stelle eher wie ein ; aus)
//#, byte 35
				System.out.println(line.startsWith("#"));
//logischerweise false
 
Zuletzt bearbeitet:
M

maki

Gast
Mit einem hexeditor untersucht (Hex-Editor MX unter Windows) zeigt sich, dass die ersten 3 Bytes "falsch" sind für textdateien:
EF BB BF ..
 

HimBromBeere

Top Contributor
Kann es auch sein, dass die Byte-Order-Mark da am Anfang steht? Die mogelt sich da gerne mal rein, sobald deine Textdatei mal auf einer anderen Plattform zu Hause war... ist das erste Zeichen für die Angabe, in welcher Reihenfolge die Bytes ausgewertet werden müssen (Vgl: Byte Order Mark ? Wikipedia)
Einfach mal in einem Texteditor deiner Wahl (nun nicht gerade Notepad, das kann das nicht, z.B. Notepad++ kann das) das BOM umstellen...

EDIT:
dass die ersten 3 Bytes "falsch" sind für textdateien:
Die sind nicht falsch, sondern geben nur eine andere Interpretationsreihenfolge an.
Das dürfte das EF BB FB erklären...
 

Andi_CH

Top Contributor
Zuerst war es nur eines, jetzt sind es 3
Tja, eines ist wie die da rein kommen (das ist mir absolut umklar) aber eigentlich laufen meine Anstrengungen dahin, ungültige Zeichen zu verwerfen, denn was jetzt passiert ist, kann immer wieder vorkommen.

Java:
private boolean isValidChar(char c) {
	return ((byte)c > 19);
}

Ist allenfalls suboptimal ;-)
 
M

maki

Gast
EF BB BF steht nach HimBromBeere für UTF-8, zeig doch mal den Code der die Datei einliest.
 

Andi_CH

Top Contributor
Der Code steht im Einganspost
Ich darf mich auf keinen Fall darauf verlassen, dass die config-Dateien mit Eclipse in einer bestimmten Coedierung entstanden sind - vielleicht wurden die mit vi auf Linux oder gar mit "KleinstweichBüroWort" erstellt und als Text gespeichert.

Vielleicht bleibe ich doch beim
Code:
return (c>=' ')
;-)
 
Zuletzt bearbeitet:

Andi_CH

Top Contributor
Die Datei befindet sich innerhalb der Projektstrukur und wird ins bin-Verzeichnis kopiert und, so vermute ich mal, somit umcodiert. (Das ist die Notfalldatei, falls keine andere gefunden wird)

Erste Zeile als Bytearray
[-17, -69, -65, 35, 32, 100, ......

Als jar-externe Datei irgendow im Filesystem deponiert und absolut adressiert funktioniert es problemlos, aber eben ich muss solche Situationen auch bei den "externen" Dateien tolerieren, denn ich kann nicht bestimmen wer in Zukunft die Datei womit ediert.

Ich möchte zwar die Notfalldatei nicht anders behandeln wie die anderen, aber kann (soll?) ich die führenden Bytes ausnutzen? Ignorieren ist vermutlich zukunftssicherer...
 

HimBromBeere

Top Contributor
Ist ja Wahnsinn, ich konnte sogar mal zwei JAVA-Schwergewichten was Neues erzählen, jetzt bin ich über alle Maßen beeindruckt...

Wie auch immer, funktioniert das Einlesen der manipulierten Datei denn überhaupt? Denn falls ja heißt das ja schonmal, dass wir auf dem richtigen Weg mit der BOM sind... falls nicht, muss es ja was anderes sein.
 

Andi_CH

Top Contributor
öhm - einmal mehr dachte ich, ich hätte mich klar genug ausgedrückt :oops:

Die ausführliche Variante:

Also ja es tut, aber nur wenn ich Datei von dir NICHT in den Projektbereich (src/configuration) kopiere, denn dann wird sie ins bin-Verzeichnis kopiert und umcodiert. Das gibt dann den Bytearry den ich oben gezeigt habe.

Wenn ich eine saubere Datei (zum Beipiel deine) irgendwohin ins Filesystem kopiere und absolut addressiere funktioniert es, aber damit ist ja erst klar wie das entsteht.

Wie ich im konkreten Fall damit umgehen soll ist noch fraglich.

Im Moment mache ich Folgendes

Java:
	private String removeInvalidChar(String pIn) {
		String retVal = "";
		byte[] bArr = pIn.toLowerCase().getBytes();
		for (byte b : bArr) {
			try {
				char c = (char)b;
				if (b > 19)
					retVal += c;
			} catch (Exception e) {}
		}
		return retVal;
	}
 
S

Spacerat

Gast
Java:
public Text(Reader in)
throws IOException
{
	this.txt = new StringBuilder();
	int r;
	char c;
	while((r = in.read()) != -1) {
		if((c = (char) r) == 0) {
			throw new IOException("error reading text");
		}
		txt.append(c);
	}
	in.close();
}
@Andy_CH: Mit diesem Teil einer Klasse lese ich Plaintext-Dateien jeglicher Herkunft, auch deine. Allerdings wird dieses BOM am Anfang als kryptische Zeichenfolge interpretiert, lässt sich aber vermutlich filtern. Vllt. hilfts ja.
[EDIT]Ach ja... des BOM merk' ich mir...[/EDIT]
 
Zuletzt bearbeitet von einem Moderator:

Andi_CH

Top Contributor
Jetz habe ich zu lange gewartet mit ändern - gibt es noch eine weiter kreative Idee wie ich "ungültige" Charakter eliminieren kann.
 
S

Spacerat

Gast
Äh... was bitte sind denn nun noch ungültige Charaktäre? Wenn's ein Problem mit meinem Code gibt, würd' ich's gern' wissen.
 

Andi_CH

Top Contributor
Das Problem ist, dass ich nicht verstehe wo nun was eliminiert wird und ob ich das wirklich nur hinbekomme wenn ich die Datei Zeichenweise einlese, was mich ehrlich gesagt ein wenig stört.
(Ich bin nun mal ein Mensch der nicht die erste Idee für die Beste hält weil es die erste war)

Ausserdem habe ich nach "einer weiteren kreativen Idee" gefragt, womit ich nicht gesagt habe, dass deine falsch ist.

----

EDIT: Der Code scheint doch nicht zu funktionieren:

Ich hab ein Testprogramm gebaut, der output ist:

-17
-69
-65
35
32
68


Java:
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;

public class Text {

	StringBuilder txt;

	public Text(Reader in) throws IOException {
		this.txt = new StringBuilder();
		int r;
		char c;
		while((r = in.read()) != -1) {
			if((c = (char) r) == 0) {
				throw new IOException("error reading text");
			}
			txt.append(c);
		}
		in.close();
	}

	public static void main(String[] args) {
		final String fileName = "C:/temp/test.conf";
		try {
			Reader rdr = new FileReader(fileName);
			Text t = new Text(rdr);
			for (byte b : t.txt.toString().getBytes()) {
				System.out.println(b);
			}
		} catch (FileNotFoundException e) {
			System.out.println("File not found");
		} catch (IOException e) {
			System.out.println("IOException");
		}
	}
}
 
Zuletzt bearbeitet:
S

Spacerat

Gast
Die Ausgabe ist vollkommen korrekt. Des BOM liegt im Enhanced ASCII-Bereich also über 127. Die Bytedarstellung is somit negativ. Ich hatte ja schon gesagt, dass man das filtern muss.
 

Andi_CH

Top Contributor
... und was bringt mir dann deine Software? Soweit war ich ja schon am Anfang ;-)
Anyway, hier kommt glaub nichts mehr - Danke allen die mitgewirkt haben.
 
S

Spacerat

Gast
1. Du kannst während des Lesens ggf. überprüfen, ob ein Zeichen im ASCII-Bereich (1 - 127) liegt und
2. Du kannst mit einem Zähler abfragen, ob die BOM-Sequenz vorhanden ist. Ist sie vorhanden, kannst du den Inhalt des Builders "on the fly" korrigieren. Beim zeilenweise Lesen, hast du diese Möglichkeit jedoch nicht.
[EDIT]Obwohl... Ich red' Schwachfug...
Java:
final String BOM = String.valueOf(new char[]{0xEF, 0xBB, 0xBF});
text.replace(BOM, "");
:oops:[/EDIT]
 
Zuletzt bearbeitet von einem Moderator:

Andi_CH

Top Contributor
Ich lese eine Zeile, mache trim(), prüfe ob die Zeile mit "#" beginnt und wenn nicht wird ausgewertet.

Vermutlich werde ich trim() überschreiben.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
KogoroMori21 Textdatei einlesen im Array (Selection Sort Algorithmus) Java Basics - Anfänger-Themen 3
A Textdatei mit stream einlesen Java Basics - Anfänger-Themen 2
A Textdatei mit BufferedReader einlesen Java Basics - Anfänger-Themen 0
F Textdatei einlesen in ArryList (Objekte abspeichern?) Java Basics - Anfänger-Themen 4
G Erste Schritte Textdatei einlesen und in Array speichern Java Basics - Anfänger-Themen 5
F Textdatei einlesen und Zeilen zählen Java Basics - Anfänger-Themen 10
S Textdatei einlesen und JFrame füllen Java Basics - Anfänger-Themen 14
C Einlesen in Array von Textdatei sehr langsam Java Basics - Anfänger-Themen 7
P Input/Output Textdatei einlesen - 1. Zeichen fehlt Java Basics - Anfänger-Themen 7
J Textdatei einlesen und ausgeben - NullPointerException Java Basics - Anfänger-Themen 5
C Spalte einer Textdatei einlesen Java Basics - Anfänger-Themen 10
C Textdatei einlesen Java Basics - Anfänger-Themen 8
M Textdatei einlesen Java Basics - Anfänger-Themen 3
B Input/Output Textdatei einlesen Windows / Linux Java Basics - Anfänger-Themen 2
F Textdatei einlesen Java Basics - Anfänger-Themen 7
C Textdatei einlesen -> Probleme Java Basics - Anfänger-Themen 3
S Textdatei stückweise einlesen Java Basics - Anfänger-Themen 7
R String einlesen, Textdatei danach durchsuchen und aus Zeile Objekt erzeugen Java Basics - Anfänger-Themen 5
E Textdatei einlesen Java Basics - Anfänger-Themen 7
D Textdatei einlesen und darin suchen Java Basics - Anfänger-Themen 11
K Textdatei einlesen funtioniert nicht Java Basics - Anfänger-Themen 8
B Textdatei als String einlesen Java Basics - Anfänger-Themen 3
A Textdatei einlesen Java Basics - Anfänger-Themen 12
W Textdatei einlesen Java Basics - Anfänger-Themen 4
N Textdatei einlesen, Filtern und Splitten Java Basics - Anfänger-Themen 4
G Textdatei einlesen Java Basics - Anfänger-Themen 2
saxman Unicode aus Textdatei einlesen und wieder abspeichern Java Basics - Anfänger-Themen 13
M Textdatei mit unterschiedlicher Spaltenanzahl einlesen Java Basics - Anfänger-Themen 4
B Problem beim einlesen einer Textdatei Java Basics - Anfänger-Themen 3
0 Textdatei in Char[] einlesen ? Java Basics - Anfänger-Themen 3
H Zahlen von Textdatei einlesen Java Basics - Anfänger-Themen 2
Dilandau textdatei einlesen und zeilen sammeln Java Basics - Anfänger-Themen 12
A Textdatei einlesen Java Basics - Anfänger-Themen 32
V Textdatei mit filechooser wählen und dann einlesen Java Basics - Anfänger-Themen 4
G Inhalt einer Textdatei in ein Array einlesen Java Basics - Anfänger-Themen 2
S Textdatei einlesen? Java Basics - Anfänger-Themen 9
R Textdatei einlesen Java Basics - Anfänger-Themen 5
D komplette Textdatei einlesen Java Basics - Anfänger-Themen 15
G Textdatei einlesen Java Basics - Anfänger-Themen 2
O Fehlermeldung bei Einlesen der textdatei. Java Basics - Anfänger-Themen 2
H Leere Zeilen in Textdatei löschen lassen Java Basics - Anfänger-Themen 5
W String einer Textdatei in einzelne Stringobjekte pro Zeile aufteilen Java Basics - Anfänger-Themen 14
N Textdatei aus Resourcen-Ordner eines Projekts/ jar-file lesen Java Basics - Anfänger-Themen 4
javapingu Jeglichen Inhalt einer Textdatei nach Zeile n löschen Java Basics - Anfänger-Themen 8
izoards Textdatei Human unreadable abspeichern Java Basics - Anfänger-Themen 17
A Eine Textdatei auslesen Java Basics - Anfänger-Themen 16
LeoDerKek Textdatei in JAR-File Java Basics - Anfänger-Themen 4
3 Textdatei Zeilenweise auslesen Java Basics - Anfänger-Themen 3
Ray19941 Über BlueJ Textdatei selbstständig erstellen lassen Java Basics - Anfänger-Themen 2
NeoLexx Datenströme Lesen und Schreiben einer Textdatei Java Basics - Anfänger-Themen 2
D Input/Output Mehrzeiligen String aus Textdatei erstellen Java Basics - Anfänger-Themen 5
M Datenbank oder Textdatei? Java Basics - Anfänger-Themen 4
X Textdatei: zwei-zeilenweise gleiche Zeilen rausschmeißen Java Basics - Anfänger-Themen 21
K Textdatei auslesen und über Mqtt schicken Java Basics - Anfänger-Themen 4
L Objekt aus Textdatei in ArrayList speichern Java Basics - Anfänger-Themen 4
J Wörter aus Textdatei suchen Java Basics - Anfänger-Themen 2
S Importieren einer Textdatei Java Basics - Anfänger-Themen 2
x-tshainge Innerhalb von Textdatei addieren Java Basics - Anfänger-Themen 9
Jinnai4 Werte in Textdatei ändern Java Basics - Anfänger-Themen 2
JDimi Textdatei mit beliebig vielen Zeilenumbrüchen erstellen Java Basics - Anfänger-Themen 2
it_is_all Bild-Pfad wird gefunden, nicht aber Textdatei-Pfad Java Basics - Anfänger-Themen 8
M Best Practice Daten-Import /Trabsfomration aus Textdatei Java Basics - Anfänger-Themen 12
G Wert in Textdatei ersetzen? Java Basics - Anfänger-Themen 2
J Daten einer Textdatei in ein JTable importieren. Java Basics - Anfänger-Themen 3
C Input/Output Textdatei vom Java-Programm nicht geladen Java Basics - Anfänger-Themen 58
T Länge einer Textdatei Java Basics - Anfänger-Themen 11
S Übertragen einer Textdatei in ein 2d-Array Java Basics - Anfänger-Themen 2
N Integers aus Textdatei auslesen und mehrere Arrays erstellen Java Basics - Anfänger-Themen 9
T Textdatei öffnen und ans Ende scrollen Java Basics - Anfänger-Themen 11
J Textdatei filtern und bearbeiten Java Basics - Anfänger-Themen 1
C Textdatei oder doch eine Datenban Java Basics - Anfänger-Themen 15
J Input/Output Tilemap effizient speichern als Textdatei Java Basics - Anfänger-Themen 7
J Input/Output Zeile in Textdatei ändern Java Basics - Anfänger-Themen 14
M Textdatei(en) in .jar schreiben Java Basics - Anfänger-Themen 5
K Textdatei auslesen Java Basics - Anfänger-Themen 10
H Input/Output Inhalt einer GUI in Textdatei speichern Java Basics - Anfänger-Themen 1
K Erste Schritte Textdatei -> Array Java Basics - Anfänger-Themen 1
F Problem mit Tabulatoren bei Zeilen zählen einer Textdatei Java Basics - Anfänger-Themen 17
L Namen aus Textdatei auslesen Java Basics - Anfänger-Themen 1
E Textdatei kopieren funktioniert nicht Java Basics - Anfänger-Themen 12
M Zweidimensionales Array aus Textdatei gewinnen Java Basics - Anfänger-Themen 6
C Aus einer Textdatei Zahlen lesen mit Leerzeichen Java Basics - Anfänger-Themen 11
S Methoden Textdatei auslesen Java Basics - Anfänger-Themen 11
G Textdatei auf Dubletten prüfen Java Basics - Anfänger-Themen 8
T Textdatei Zeile löschen? Java Basics - Anfänger-Themen 4
T Textdatei beschreiben/bearbeiten Java Basics - Anfänger-Themen 4
C auslesen bestimmter werte einer textdatei und anschl. hineinschreiben in eine neue txt-datei. Java Basics - Anfänger-Themen 2
S Textdatei lesen, Methode gibt nur die letzte Zeile aus. Warum? Java Basics - Anfänger-Themen 5
R Werte in eine Textdatei schreiben Java Basics - Anfänger-Themen 20
J Neue Zeile an bestimmter Stelle in Textdatei einfügen Java Basics - Anfänger-Themen 2
D Textdatei in geschachtelte Array speichern Java Basics - Anfänger-Themen 17
T Scanner für große Textdatei Java Basics - Anfänger-Themen 11
A Unterschied Textdatei und Quelltextdatei Java Basics - Anfänger-Themen 5
J Input/Output Textdatei in einer JAR lesen Java Basics - Anfänger-Themen 3
T Erste Schritte einzelne Wörter aus textdatei lesen... Java Basics - Anfänger-Themen 4
S Textdatei im Internet lesen und editieren Java Basics - Anfänger-Themen 2
M Input/Output Objekte in einer Textdatei ablegen (Highscore) Java Basics - Anfänger-Themen 9
P CSV Daten in Textdatei Speichern Java Basics - Anfänger-Themen 3
K Input/Output Eingelesenedaten von Scanner als Textdatei ausgeben? Java Basics - Anfänger-Themen 2
N Input/Output Konsolenausgabe in Textdatei speichern/umleiten Java Basics - Anfänger-Themen 7

Ähnliche Java Themen

Neue Themen


Oben