PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : uchar in Java



RogerJFX
24-05-2005, 18:55
Leute, das muß ich einfach hier platzieren. Das ist zu lustig.

Klar, uchar gibt es in Java nicht. Braucht man an sich auch nicht. Ich hatte nur irgendwann das f... Problem, daß ich es mit einem Server zu tun hatte, der grundsätzlich Daten junked rausgeworfen hat. Heißt: ne Content-Length hatte ich nicht. Und wie groß ich einen Buffer anlegen sollte, war mir auch nicht klar. Also habe ich alles, was kam, in einen StringBuffer geworfen und habe das dann einfach zum Schluß als String weitergegeben. Sollte das dann ein byteArray sein, alles klar, dann eben String.getBytes(). Also z.B. PNG-Images lese ich genau so.

In MicroEdition geht das auch alles. Aber eben nicht in J2SE.

Es bleibt dabei:


...
int ch;
StringBuffer buffer = new StringBuffer();
while ( (ch = in.read()) != -1 && !noMoreWaiting) {
buffer.append( (char) ch);
}
return buffer.toString();


Ist auch kein Problem, sollte Text übermittelt. Aber bei einem PNG geht String.getBytes() eben nicht, wohl wegen irgendwelcher Locales.

Was aber geht (zum Kringeln, in der Tat):

char[] data = String.toCharArray();

Der Witz: negative (byte) chars bleiben so erhalten. Und die kann ich ja dann zu ints konvertieren. Z.B.



char[] chData = myString.toCharArray();
File tmpF = new File(System.getProperty("user.home") + "/~jfx_tmp.png");
try {
DataOutputStream out = new DataOutputStream(new FileOutputStream(tmpF));
for (int i = 0; i < chData.length; i++) {
int b = (byte) chData[i] >= 0 ? (byte) chData[i] : (byte) chData[i] + 256;
out.write(b); // ints werden hier geschrieben...
}
out.flush();
out.close();
...



Und das PNG befindet sich auf der Festplatte.

Also ich find's komisch.

Ach so, bleibt vielleicht zu erwähnen, daß man das bei großen Dateien besser nicht macht. Zeichenweises Einlesen ist nicht besonders performant, in der Tat.

Cheers,

Roger

anda_skoa
24-05-2005, 20:00
Ist auch kein Problem, sollte Text übermittelt. Aber bei einem PNG geht String.getBytes() eben nicht, wohl wegen irgendwelcher Locales.

Was aber geht (zum Kringeln, in der Tat):

char[] data = String.toCharArray();

Könnte damit zusammenhängen daß ein char doppelt so groß ist wie ein byte.

Selbst wenn ich nur zeichenweise lesen sollte, würde ich bei vermutlich trotzdem eine der beiden read() Methoden mit byte[] benutzen, einfach mit einem Array der Länge 1.

Und dann statt einem StringBuffer in einen DataOutputStream schreiben bis die Übertragung komplett ist.

Hat außerdem den Vorteil daß man jederzeit, also auch während des Vorgangs, auf eine temporäre Datei umschalten kann, wenn der Inhalt für In-Memory zu groß wird.

Ciao,
_

RogerJFX
24-05-2005, 20:10
Und dann statt einem StringBuffer in einen DataOutputStream schreiben bis die Übertragung komplett ist.

_

Schon klar. Das war auch nur ein Beispiel mit dem DataOutputStream, das ich so natürlich nie verwende. Der eigentliche Witz ist eher, daß ich aus einem String tatsächlich Data ziehen kann.

Wie erwähnt: in MicroEdition geht auch String.getBytes();

Heißt: irgendwie scheint in ME ein anderer Datentyp vorzukommen.

Aber daß ein char in Java 16 bit hat, fällt mir söben auch auf (meine Fresse...).

Trotzdem ist mir das alles noch nicht ganz klar, wenn ich ehrlich bin. Vielleicht mal ein bißchen in der API rumdekompilieren?

Cheers,

Roger