BinaryStream

Status
Nicht offen für weitere Antworten.

j4v4

Mitglied
Hallo!
Ich bräuchte hilfe und zwar weiß ich nicht wie ich den BinaryStream effektiv schreibe (damit ich dann genau angeben kann das er nur die letzten 4 Zeichen ausgibt) weil ich ja schon eine main habe und so wie ich den Konstruktor geschrieben habe nicht geht.

Vielleicht kann man das gleich direkt hineinschreiben in die void countPIM, hab da leider nicht viel Ahnung gerade.

Es handelt sich um diese Datei hier:
http://imarkus.net/EmbCheck_original.java

Java:
public class CopyBytes {
public static void main(String[] args) throws IOException {
        FileInputStream in = null;
        FileOutputStream out = null;
        try {
            in = new FileInputStream(PINFile);
            out = new FileOutputStream(MSGCODE);
            int c;
            while ((c = in.read()) != -1) {
                out.write(c);
            }
        } finally {
            if (in != null) {
                in.close();
            }
            if (out != null) {
                out.close();
            }
        }
    }
}

So sollte es eigentlich funktionieren und ist auch keine große Sache denke ich aber leider komm ich trotzdem nicht weiter und brauch eure hilfe :)


Danke!
 

sliwalker

Top Contributor
"BinaryStream effektiv schreibe (damit ich dann genau angeben kann das er nur die letzten 4 Zeichen ausgibt)"

Du willst also nur die letzten vier Zeichen in den Stream schreiben?
Zeichen oder Bytes? multibyte characterset?
Ist die Datei groß? Vielleicht erst alles einlesen und Array[Array.length-4] bis Array[Array.length] schreiben?

Verstehe ich Dich richtig?
 

j4v4

Mitglied
Nun ja, ich ruf das Programm in der Konsole etc auf und er liest aus einer Datei aus die so ca. aussieht:

Code:
310000000757A1051RTX 2710105001682072349 000010000 000000000000000710105001682049651 ¼wo÷]pÀ˜ÿÿÿÿ  
450000000757710105001682072349 0WABERER'S INTERNATIONAL Zrt. KTC-841Nagykõrösi út 351. HUN1239 BUDAPEST HUN05 
810000000757A2710105001682072349 4950 0000000 Ó20«Œýèÿÿÿÿ 200908051310470021 
91000000075705 
110000000758 
310000000758A1051RTX 2710105001682072356 000010000 000000000000000710105001682049669 ºÿÉúB}Öÿÿÿÿ  
450000000758710105001682072356 0WABERER'S INTERNATIONAL Zrt. KTC-842Nagykõrösi út 351. HUN1239 BUDAPEST HUN05 
810000000758A2710105001682072356 5332 0000000—ÄÈrÞiÞ—ÿÿÿÿ 200908051310470021

Soweit funzt das Programm eh, er liest mir die letzten 4 Zahlen raus (0021) und gibt sie dann aus. Nur hängt er sich dann auf weil ein zeichen drinnen ist, dass er nicht kennt und sagt "tschüss, ich will nimmer".
und meine idee war, die datei binär einzulesen (damit er nicht mehr selber interpretiert) und dann sage, dass er eben diese 4 zahlen nehmen soll

PS:Eingelesen wird eben mit dem PIMCode und der richtige "wert" soll dann an MSGCODE, der am ende eben ausgegeben wird.
Hier die dazugehörige Card.java -> http://imarkus.net/Card.java
Wenn ich die Datei ausführe, sieht die Ausgabe so aus: http://imarkus.net/ausgabe.txt
Und so sieht zB die Datei aus die ich einlese: http://imarkus.net/eingabe.txt
 

sliwalker

Top Contributor
Gib dem Reader mit, welches Encoding verwendet werden soll.
Welches das ist musst Du wissen. In welchem Encoding wird die Datei geschrieben?

Byteweises Einlesen ist schon OK. Nur mach nicht den Fehler dann die Bytes falsch zu interpretieren.
Wie machst Du das denn irgendwann zum String?
 

nocturn

Aktives Mitglied
Hallo Super_frettchen,

Mach das mal so:
Das ist eine UTF-16-Datei,
das bedeutet das du sie auch so lesen must.


Java:
BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("c:/test"), Charset.forName("UTF-16")));

Den Rest solltest du jetzt selber können.

PS: Binär und Digital bedeuten haargenau das selbe; Sprich: Binär einlesen tust du immer!
 

j4v4

Mitglied
Nunja aber wie lese ich das byteweise ein, mit dem BinaryStream?
Ist ja der fehler das er es falsch interpretiert (kommt dann ein steuerzeichen etc und dann hängt es ihn auf).

Und wenn ich einfach nur das Charset.forName("UTF-16") reinhau, dann gibt er mir den fehler zurück:

$ /opt/java/jdk1.6.0_11/bin/javac EmbCheck.java
EmbCheck.java:120: ';' expected
BufferedReader datenStrom = new BufferedReader(dateiInhalt), Charset.forName("UTF-16");
^
1 error
PROD:UTF8:card@somvat602015:/data/card/ferial
$ /opt/java/jdk1.6.0_11/bin/javac EmbCheck.java
EmbCheck.java:120: ';' expected
BufferedReader datenStrom = new BufferedReader(dateiInhalt), Charset.forName("UTF-16");
^
1 error
 
B

bygones

Gast
Nunja aber wie lese ich das byteweise ein, mit dem BinaryStream?
Ist ja der fehler das er es falsch interpretiert (kommt dann ein steuerzeichen etc und dann hängt es ihn auf).

Und wenn ich einfach nur das Charset.forName("UTF-16") reinhau, dann gibt er mir den fehler zurück:

$ /opt/java/jdk1.6.0_11/bin/javac EmbCheck.java
EmbCheck.java:120: ';' expected
BufferedReader datenStrom = new BufferedReader(dateiInhalt), Charset.forName("UTF-16");
^
1 error
PROD:UTF8:card@somvat602015:/data/card/ferial
$ /opt/java/jdk1.6.0_11/bin/javac EmbCheck.java
EmbCheck.java:120: ';' expected
BufferedReader datenStrom = new BufferedReader(dateiInhalt), Charset.forName("UTF-16");
^
1 error
das ist ja auch kein gueltiger Java code.
Java:
BufferedReader datenStrom = new BufferedReader(dateiInhalt), Charset.forName("UTF-16");
schau dir das doch nochmal genauer an....
 

j4v4

Mitglied
Jau, stimmt

Java:
import java.util.regex.*;
BufferedReader datenStrom = new BufferedReader ((dateiInhalt), Charset.forName("UTF-16"));

Jetzt ist der Fehler:
Code:
$ /opt/java/jdk1.6.0_11/bin/javac EmbCheck.java
EmbCheck.java:121: cannot find symbol
symbol  : constructor BufferedReader(java.io.FileReader,java.nio.charset.Charset)
location: class java.io.BufferedReader
                        BufferedReader datenStrom = new BufferedReader ((dateiInhalt), Charset.forName("UTF-16"));
                                                    ^
Note: EmbCheck.java uses unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.
1 error

Datei sieht so aus:
http://binary.wmw.cc/EmbCheck.java
 
B

bygones

Gast
klick mal auf den "bufferedReader" link hier im Forum... es gibt keinen Konstruktor der einen Stream und ein Charset aufnimmt...

mehr kann ich leider nicht sagen :(
 

j4v4

Mitglied
Hm, nur wie kann ich das Problem lösen?
Ist ja eigentlich nur wegen der einen Zeile, dass er sich aufhängt, sonst würde meine Methode funzen aber trotzdem muss ich das Problem irgenwie lösen :(
 

j4v4

Mitglied
Also der void countPIN(String date) {
sieht dann so aus

Java:
BufferedReader Read = new BufferedReader(new InputStreamReader(new FileInputStream(PINFile), Charset.forName("UTF-16")));

Und das ist die Meldung:

Code:
$ /opt/java/jdk1.6.0_11/bin/javac EmbCheck.java
EmbCheck.java:68: cannot find symbol
symbol  : variable Charset
location: class EmbCheck
                        BufferedReader Read = new BufferedReader(new InputStreamReader(new FileInputStream(PINFile), Charset.forName("UTF-16")));
                                                                                                                     ^
Note: EmbCheck.java uses unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.
1 error
 
Zuletzt bearbeitet:
B

bygones

Gast
hast du Charset importiert ?
was ist Read ? die Variable scheint es nicht zu geben ...

scheint als fehlen noch ein paar grundlegende Java Verstaendnisse ?!
 

j4v4

Mitglied
Ja hab ich vergessen hinzuzufügen :)

Ich versteh nur nicht was das hier heißen soll:

Code:
$ /opt/java/jdk1.6.0_11/bin/javac EmbCheck.java
Note: EmbCheck.java uses unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.
PROD:UTF8:card@somvat602015:/data/card/ferial

Und das read brauch ich dann bei der Klasse EmbCheck
"while( null != (Linie = Read.readLine())) {"
 
B

bygones

Gast
Code:
$ /opt/java/jdk1.6.0_11/bin/javac EmbCheck.java
Note: EmbCheck.java uses unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.
PROD:UTF8:card@somvat602015:/data/card/ferial
das kommt immer wenn du Generics in irgendeinerweise missachtest

zb
Java:
List l = new ArrayList();
// anstatt
List<String> ll  = new ArrayList<String>();
 

j4v4

Mitglied
Und was ist daran falsch?

Java:
Vector Cards = new Vector();

Also ich seh da nix falsches, außer es fehlt mir eben an dem (Grund)wissen.

Danke und lg
 
B

bygones

Gast
Collections sind seit java1.5 mit einem Typ versehen, damit man (compiler) weiss welche art von elementen in die Collection gelangen.

D.h. wenn du einen Vector hast der mit Strings gefuellt wird / ist, schreibt man [c]Vector<String> v = new Vector<String>();[/c] etc

ansonsten solltest du eher ArrayList anstelle von Vector nehmen, da dieser veraltet ist
 

j4v4

Mitglied
Dann funktioniert add(Card) oder Card.add nichtmehr, sprich ich muss eh ArrayListen nehmen.

Nur wenn ich eine ArrayList nehme, dann sieht
Java:
Cards.add(new Card(Linie.substring(14,32),date,"O"+NFCCode[i]));

bestimmt anderes aus, oder?
 
B

bygones

Gast
nein... beide definieren die gleiche Schnittstelle (List)... egal

d.h. beide haben eine add methode
 

j4v4

Mitglied
Nunja, so gehts aber nicht da zeigt er mir dann eben die add Methoden an:

Vector<String> Cards = new Vector<String>();
 
B

bygones

Gast
Nunja, so gehts aber nicht da zeigt er mir dann eben die add Methoden an:

Vector<String> Cards = new Vector<String>();

dann lass es lieber weg - eine genaue Erklaerung waere wahr. zu komplex und wenn du noch nie mit generischen Klassen zu tun hattest und noch manche Grundlagen fehlen kanns zu komplex sein.

Du kannst die Warnung des Compilers akzeptieren (wenn du die [c]<String>[/c] ueberall wieder entfernst) - es sind warnungen, keine Fehler
 

j4v4

Mitglied
Hm dann würde ich aber gerne trotzdem die Ausgabe sehen, anstatt nur den Hinweis, weil per mail kann ich mir die ausgabe auch nicht verschicken ("$ /opt/java/jdk1.6.0_11/bin/javac EmbCheck.java | mail -s name@domain.com")
 

sliwalker

Top Contributor
Du willst in Cards, welches so definiert ist, dass es nur Elemente vom Typ String aufnehmen kann, ein Objekt vom Typ Card adden.
Natürlich geht das nicht. Entweder entferne alle Typisierungen von Listen und lebe mit der Warnung, oder definiere Deine Listen so, dass sie das aufnehmen können, was Du brauchst.

Aber mich würde mal interessieren, wie hier jemand allein anhand der Textdatei sagen kann welches Encoding dahintersteht.
Zauberei? Soweit ich das erlebt habe, kannst Du darüber gar nichts sagen, außer Du weißt in welchem Encoding die Datei geschrieben wurde.
 

Leroy42

Top Contributor
Aber mich würde mal interessieren, wie hier jemand allein anhand der Textdatei sagen kann welches Encoding dahintersteht.
Zauberei? Soweit ich das erlebt habe, kannst Du darüber gar nichts sagen, außer Du weißt in welchem Encoding die Datei geschrieben wurde.

Richtig! Ein Encoding sagt nur etwas darüber aus, wie die ascii-Werte
interpretiert werden sollen. Welches Encoding beim Erstellen der
Datei verwendet wurde wird nirgends abgespeichert!
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
N FileInputstream und BinaryStream Java Basics - Anfänger-Themen 3

Ähnliche Java Themen

Neue Themen


Oben