expertenaustausch > comp.lang.* > comp.lang.java

Manfred Nebel (01.06.2004, 08:10)
Hallo,

da ich in Google kein Beispiel/keine Antwort gefunden habe, versuche ich es
mal hier.
Wie finde ich die Byte-Länge eines Tokens vom StreamTokenizer.
Umwandlung in String und .length()*2 bei UTF ist ja wohl nicht das Wahre.

Hintergrund ist das Einlesen einer txt-Datei im UTF-16 Format, die die Daten
für eine Datenbank enthällt.
eine Umwandlung in ASCII kommt nicht in Frage, da mehrere Ländercodes
verwendet werden.
Für die Angaben in .setUnicodeStream(int, stream, int) wird die Länge
benötigt.

Danke Manfred

....
int lines = 100;
....
try {
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
Connection con =
DriverManager.getConnection("jdbc:odbc:XXX", "XXX", "XXX");
PreparedStatement stm = con.prepareStatement ("INSERT INTO table " +
"VALUES(?, ?, ?, ?, ?, ? ,?, ?, ?, ?, ?, ?, ?, Sysdate)");
BufferedReader inTok = new BufferedReader (new InputStreamReader
(new FileInputStream("daten.txt"),"UTF-16"),65535);
StreamTokenizer stT = new StreamTokenizer(inTok);
stT.eolIsSignificant(true);
for (int i=0; i<lines; i++) {
stm.setUnicodeStream (1, stT.nextToken(), stT.length());
...
Jochen Theodorou (01.06.2004, 09:41)
Manfred Nebel schrieb:
> Hallo,
> da ich in Google kein Beispiel/keine Antwort gefunden habe, versuche ich es
> mal hier.
> Wie finde ich die Byte-Länge eines Tokens vom StreamTokenizer.
> Umwandlung in String und .length()*2 bei UTF ist ja wohl nicht das Wahre.


zudem stimmt es nicht ungbedingt.

> Hintergrund ist das Einlesen einer txt-Datei im UTF-16 Format, die die Daten
> für eine Datenbank enthällt.
> eine Umwandlung in ASCII kommt nicht in Frage, da mehrere Ländercodes
> verwendet werden.
> Für die Angaben in .setUnicodeStream(int, stream, int) wird die Länge
> benötigt.


Wie wäre es damit, den String zu hohlen und dann in ein byte[]
umzuwandeln? String#getBytes(String);

Gruss theo
Stefan Matthias Aust (01.06.2004, 10:21)
Manfred Nebel wrote:

> StreamTokenizer stT = new StreamTokenizer(inTok);
> stT.eolIsSignificant(true);
> for (int i=0; i<lines; i++) {
> stm.setUnicodeStream (1, stT.nextToken(), stT.length());


Das da kann doch nicht funktionieren, weil nextToken ein "int" liefert,
dein Unicode-Digens aber einen InputStream erwartet. Das Längenproblem
ist dagegen trivial. Die Doku sagt doch, dass jedes Zeichen 2 Bytes
umfasst, wenn du also einen String s liest, wäre die Länge also
s.length() * 2. In deinem Fall also "stT.sval.length() * 2".

bye
Manfred Nebel (01.06.2004, 10:57)
Hallo,

> Das da kann doch nicht funktionieren, weil nextToken ein "int" liefert,
> dein Unicode-Digens aber einen InputStream erwartet. Das Längenproblem
> ist dagegen trivial. Die Doku sagt doch, dass jedes Zeichen 2 Bytes
> umfasst, wenn du also einen String s liest, wäre die Länge also
> s.length() * 2. In deinem Fall also "stT.sval.length() * 2".


Da hast Du recht, ich habe gerade etwas anderes gefunden:
while ((type = st.nextToken()) != StreamTokenizer.TT_EOF) {

type= müsste man ausprobieren, welches INT wann geliefert wird.
Statt EOF müsste EOL verwendet werden, da ich zeilenweise einlese.

Gruß Manfred

Die API schreibt zu nextToken():
Parses the next token from the input stream of this tokenizer. The type of
the next token is returned in the ttype field. Additional information about
the token may be in the nval field or the sval field of this tokenizer.
Typical clients of this class first set up the syntax tables and then sit in
a loop calling nextToken to parse successive tokens until TT_EOF is
returned.
Manfred Nebel (01.06.2004, 11:34)
Es wird immer komplizierter.

> > stm.setUnicodeStream (1, stT.nextToken(), stT.length());


setUnicodeStream kann keine Token aufnehmen. Obiger Code gibt Fehlermeldung:

setUnicodeStream(int, java.io.InputStream, int) in
java.sql.PreparedStatement cannot be applied to
setUnicodeStream(int, java.io.StreamTokenizer, int)

Gruß Manfred
Ähnliche Themen