bufferedReader readline, encoding

Azeruel

Mitglied
Hallo zusammen,

ich stehe gerade vor einer kleineren Problematik die ich im Moment so nicht nachvollziehen kann.

Ich habe eine Logdatei, welche im UTF-16 zeichensatz gespeichert ist. Soweit kein Problem... sollte man meinen.

Anbei der Code:
Java:
BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(temp), "UTF-16"));
          int i=0;
          while(true)
          {
            line = reader.readLine();
            if(line!=null)
              System.out.println(++i+" "+line);
            else 
              Thread.sleep(500);
          }
          } catch(Exception e) { }

Der Output ist bis zum ersten Ende der Datei korrekt. Gedacht ist dieses Konstrukt aber zur Überwachung einer Logdatei. Ergo habe ich testweise mittels Ultraedit eine Zeile hinzugefügt (wärend das Programm weitergelaufen ist). Die Ausgabe folgte prommt... auf Chinesisch. In der Textdatei selbst wird die Zeile absolut korrekt gespeichert.

Die Hex werte sehen absolut sauber aus. Nach restart des Programms (und damit das erste Einlesen bis zum Ende der Datei) erfolgt die Ausgabe ebenfalls wieder korrekt.

Über Ideen und Anregungen würde ich mich freuen.

Lg
 
Zuletzt bearbeitet:
S

SlaterB

Gast
nicht schön, aber vielleicht eine Notlösung:
kommst du weiter wenn du die Daten als Stream in ein byte[] einliest
und darauf immer einen neuen UFT-16-Reader erstellst (ByteArrayInputStream usw.)

muss nicht für jede Zeile sein, sondern nur 1x pro Thread.sleep(500);
die while-Schleife sollte dann vielleicht über eine eigene Klasse laufen, um das intern zu regeln
 

Azeruel

Mitglied
Sobald ich Zeit dafür finde, werde ich das mal genauer ausprobieren, nichts desto trotz kann das ganze ja nicht der Sinn der Sache sein.Ich verstehe ja derzeit nichtmal wirklich wo genau das Problem liegt. Am InputStreamReader selbst kann es ja eigentlich nicht liegen. Das Encoding ist ja eindeutig gesetzt. Der BufferedReader dürfte ja den Stream nicht ändern.

EDIT:
Ich habe gerade das Encoding auf UTF-8 gestellt. Dabei scheint er das Problem nicht zu haben. Die Buchstaben werden mir korrekt angezeigt. Das ganze stellt aber dennoch keine Lösung dar, da nun natürlich der Textstream falsch interpretiert wird (00 74 => "leerzeichen"t). Nachträgliches manipulieren würde natürlich zum Ziel führen, aber das soll an dieser Stelle kein Diskussionsthema sein.
 
Zuletzt bearbeitet:

Wortraum

Bekanntes Mitglied
Eine Lösung kann ich Dir nicht bieten, aber ich kann das Verhalten in ähnlicher Weise bestätigen. Zwar wurde bei mir nichts weiter ausgegeben, nachdem ich eine Zeile zur Datei hinzufügte, aber die Datei war danach zerschossen oder von Chinesen gehakt. Das betraf nicht nur die neue Zeile, sondern die komplette Datei.

Auffällig ist, daß sie vorher 270 Byte lang war, und nachdem ich eine Zeile mit weiteren Zeichen hinzufügte, war sie nur noch 170 Byte lang.

Das ganze probierte ich unter Windows mit Gvim und diesem Quelltext (der ist weitesgehend von Dir raubkopiert):
Java:
public static void main(String[] args) throws Exception {
    File txtFile = new File("c:/Users/xyzzy/a.txt");
    String txtEncoding = "UTF-16";
    InputStream fis = new FileInputStream(txtFile);
    Reader isr = new InputStreamReader(fis, txtEncoding);
    BufferedReader reader = new BufferedReader(isr);

    String line;
    int lineNum = 0;
    while (true) {
        line = reader.readLine();
        if (line != null) {
            ++lineNum;
            System.out.println(lineNum + ":\t" + line);
        } else {
            Thread.sleep(500);
        }
    }
}

Statt einer Notlösung interessiert mich überhaupt erst einmal das Warum. Was passiert da?
 
Zuletzt bearbeitet:

Azeruel

Mitglied
Ich weiß nicht genau ob ich dich richtig verstanden habe?!? Aber ich kann nicht bestätige dass die Datei an sich verändert wird, das wäre ja auch schlimm. Der Fehler müsste an dieser Stelle bei dir beim Speichern der Datei im GVim sein. Dies kann ich jedoch ausschließen, da wie gesagt, nach dem Speichern der Datei und erneuten öffnen im Editor alles korrekt angezeigt wird.
 

Wortraum

Bekanntes Mitglied
Das hast Du schon richtig verstanden. Da ich sonst mit UTF-16 nichts mache – also in Textdateien –, kann es durchaus sein, daß hier Vim oder Vim-Einstellungen schuld sind. Nein, nein, nicht der Benutzer, sondern Vim! ;) Aber die chinesischen Zeichen erhalte ich dort auch. Wenn ich die „zerstörte“ Datei als UTF-8 lade, ist fast alles richtig. Einzig die ersten beiden Bytes verstehe ich spontan nicht; es ist keine gültige Folge für den BOM, weder in UTF-8, UTF-8Y noch UTF-16.

In meinem Fall mag das sogar noch Sinn ergeben, wenn Vim das ganze als UTF-8 rausschiebt, aber bei Dir … Eigentlich liebe ich ja solche Kodierungsprobleme (ja, krank), aber für mehr als eine oberflächliche Betrachtung fehlt mir gerade die Zeit.

EDIT: Also ich habe das jetzt einfach mit Jedit gemacht, der schreibt es auch nach der Änderung brav als UTF-16. Nun kommt die für Dich „schockierende“ Nachricht: es funktioniert alles so, wie es soll; in Java wird jede weitere Zeile korrekt angezeigt.

Eine kleine Fehlerquelle gibt es dennoch: Wenn man Zeichen an die letzte Zeile anhängt und speichert, wird der neue Teil vom BufferedReader als neue Zeile gewertet. Die Zählvariable für die Zeile wird dann erhöht und eine neue Zeile angezeigt, kurz: hier kommt dann etwas durcheinander. Das kann theoretisch jederzeit passieren, wenn nach 500ms der Thread zum Leben erwacht und sich voller Eifer in die Arbeit stürzt, während ein anderer Prozeß Zeichen an die Datei anhängt. Das ist aber unabhängig von Deinem jetzigen Problem, aber ich dachte, ich erwähne es mal.
 
Zuletzt bearbeitet:
Ähnliche Java Themen
  Titel Forum Antworten Datum
K BufferedReader.readLine erkennt Zeilenende nicht Allgemeine Java-Themen 11
V wie bufferedreader.readline() unterbrechen? Allgemeine Java-Themen 4
D BufferedREader#readLine Allgemeine Java-Themen 20
J BufferedReader br.readLine(); Allgemeine Java-Themen 22
conan2 BufferedReader.readLine() von anderem Thread aus beenden Allgemeine Java-Themen 4
N readLine() von BufferedReader hält das Programm fest/auf! Allgemeine Java-Themen 10
W Socket.setSoTimeout -> BufferedReader -> Default value Allgemeine Java-Themen 4
kodela Unterschiedliches Verhalten von BufferedReader Allgemeine Java-Themen 3
D BufferedReader bricht nach 1248 Iterationen ab Allgemeine Java-Themen 14
C BufferedReader/BufferedWriter schreibt nicht alle Bytes Allgemeine Java-Themen 2
C TCP Server und BufferedReader Leerstring im Stream? Allgemeine Java-Themen 5
A BufferedReader ohne System.in Allgemeine Java-Themen 9
J BufferedReader Datei einlesen Allgemeine Java-Themen 8
Messoras Der BufferedReader mag mich nicht Allgemeine Java-Themen 47
C Threading mit BufferedReader/InputStream & sockets Allgemeine Java-Themen 0
J BufferedReader OutOfMemory umgehen? Allgemeine Java-Themen 10
B Input/Output BufferedReader Allgemeine Java-Themen 3
O BufferedReader von ganz unten anfangen zu lesen Allgemeine Java-Themen 7
S BufferedReader/PrintWriter an einer HTML Allgemeine Java-Themen 6
M BufferedReader: Vom Logfile zur Datenbank Allgemeine Java-Themen 6
S Null Pointer Exception bei BufferedReader Allgemeine Java-Themen 4
D 'InputStreamReader' & 'BufferedReader' führen zu "cannot find symbol"-Fehler Allgemeine Java-Themen 3
D Scanner leer aber bufferedReader nicht?! Allgemeine Java-Themen 2
Developer_X Java BufferedReader mit URL Allgemeine Java-Themen 5
Semox Fehler - Zuweisung aus BufferedReader an Variable Allgemeine Java-Themen 3
S Exception beim BufferedReader Allgemeine Java-Themen 3
G getFilePointer in BufferedReader? Allgemeine Java-Themen 2
D (BufferedReader) inLine() "verschluckt" zeilen ? Allgemeine Java-Themen 2
M BufferedReader.read(char[] cbuf) liefert falsche Werte? Allgemeine Java-Themen 4
W Frage zu BufferedReader Allgemeine Java-Themen 2
K Wie kann ich einen BufferedReader beschleunigen? Allgemeine Java-Themen 4
B while mit BufferedReader beenden Allgemeine Java-Themen 5
F Zu große Werte beim byteweisen Lesen mit BufferedReader.read Allgemeine Java-Themen 5
S BufferedReader problem Allgemeine Java-Themen 11
D BufferedReader in image umwandeln Allgemeine Java-Themen 3
M BufferedReader input - hängt sich auf Allgemeine Java-Themen 4
C Probleme mit URL und BufferedReader Allgemeine Java-Themen 6
C BufferedReader oder DataInputStream Allgemeine Java-Themen 4
M Store a String in a BufferedReader Allgemeine Java-Themen 2
kodela Byte Order Mark (BOM) bei readLine() ignorieren Allgemeine Java-Themen 5
S readLine() liest nur jede 2. Zeile Allgemeine Java-Themen 3
P readLine() liest nur jede dritte Zeile? Allgemeine Java-Themen 3
J RandomAccessFile readLine(); Allgemeine Java-Themen 5
S Stream ReadLine() Allgemeine Frage Allgemeine Java-Themen 5
S readLine oder sowas? Allgemeine Java-Themen 13
R read/readline blockiert Allgemeine Java-Themen 5
S String Encoding Verständnisproblem Allgemeine Java-Themen 22
X Encoding in Tomcat Allgemeine Java-Themen 2
B Input/Output Encoding ISO->UTF8 Allgemeine Java-Themen 3
Thallius Merkwürdiges StringBuilder verhalten (Char Encoding) Allgemeine Java-Themen 6
M Verschlüsselung von Text und Files durch RSA (Encoding Problem) Allgemeine Java-Themen 7
S Falsches Encoding bei Drag and Drop von Umlauten Allgemeine Java-Themen 16
M Datei wird nicht vollständig geschrieben (FileOutputStream, OutputStreamWriter, Encoding) Allgemeine Java-Themen 6
C Encoding Problem Windows Allgemeine Java-Themen 9
R Encoding FileWriter Allgemeine Java-Themen 1
C Encoding problem Allgemeine Java-Themen 22
C BASE64 encoding von Binärdaten Allgemeine Java-Themen 4
M Charset Encoding für Dateinamen Allgemeine Java-Themen 4
I Encoding Problem bei exec und Windows Allgemeine Java-Themen 2
S Encoding-Problem (?) Allgemeine Java-Themen 5
lumo encoding einer text-datei Allgemeine Java-Themen 2
Y CSV Encoding Problem Allgemeine Java-Themen 6
N Encoding Unicode Textfile Allgemeine Java-Themen 5
S File encoding feststellen Allgemeine Java-Themen 4
S Bestes Text file encoding..? Allgemeine Java-Themen 36
P Textfiles laden - egal welches Encoding Allgemeine Java-Themen 9
J Encoding und Gewinnung von Zeichen aus der Hexa-Darstellung Allgemeine Java-Themen 6
P Textfile Encoding herausfinden Allgemeine Java-Themen 2
P Encoding-Probleme bei Properties-Dateien Allgemeine Java-Themen 5
R Encoding Allgemeine Java-Themen 10
B platform's default character encoding? Allgemeine Java-Themen 10
N Mal wieder char-encoding Probleme Allgemeine Java-Themen 5
M Problem mit Base64 Encoding Allgemeine Java-Themen 2
M Encoding automatisch erkennen Allgemeine Java-Themen 4
M Standart Encoding des OS ermiteln Allgemeine Java-Themen 4
S [Base64] Encoding von String nicht korrekt Allgemeine Java-Themen 5
byte String Encoding Allgemeine Java-Themen 9
S File Encoding im Programm setzen? Allgemeine Java-Themen 3

Ähnliche Java Themen

Neue Themen


Oben