2008-11-07 17 views
7

He estado haciendo algunos programas de socket para transmitir información a través del cable. Me encontré con un problema con DataOutputStream.writeUTF(). Parece permitir cadenas de hasta 64k, pero tengo algunas situaciones en las que puedo ejecutar esto. ¿Hay alguna buena alternativa que soporte cadenas más grandes o necesito hacer mi propia?Escribir cadenas grandes con DataOutputStream

Respuesta

15

En realidad usa dos bytes para escribir la longitud de la cadena antes de usar un algoritmo que la compacte en uno, dos o tres bytes por carácter. (Consulte la documentación en java.io.DataOutput) Está cerca de UTF-8, pero aunque esté documentado como tal, existen problemas de compatibilidad. Si no está terriblemente preocupado por la cantidad de datos que va a escribir, puede escribir fácilmente el suyo escribiendo primero la longitud de la cadena y luego los datos brutos de la cadena usando el método getBytes.

// Write data 
String str="foo"; 
byte[] data=str.getBytes("UTF-8"); 
out.writeInt(data.length); 
out.write(data); 

// Read data 
int length=in.readInt(); 
byte[] data=new byte[length]; 
in.readFully(data); 
String str=new String(data,"UTF-8"); 
+0

Esperaba que hubiera una API, pero eso básicamente confirma lo que estaba pensando. – Glen

2

Debería poder usar OutputStreamWriter con la codificación UTF-8. No hay un método explícito de writeUTF, pero puede establecer el juego de caracteres en el constructor. Trate

Writer osw = new OutputStreamWriter(out, "UTF-8"); 

donde out es lo OutputStream que está envolviendo ahora.

7

ObjectOutputStream.writeObject() maneja adecuadamente cadenas largas (verificado por mirar el código fuente). Escribir la cadena de esta manera:

ObjectOutputStream oos = new ObjectOutputStream(out); 
... other write operations ... 
oos.writeObject(myString); 
... other write operations ... 

Leer esta manera:

ObjectInputStream ois = new ObjectInputStream(in); 
... other read operations ... 
String myString = (String) ois.readObject(); 
... other read operations ... 

Otra diferencia con DataOutputStream es que el uso ObjectOutputStream escribe automáticamente una cabecera de flujo de 4 bytes cuando se crea una instancia, pero por lo general su va a ser un castigo bastante pequeño para pagar.

Cuestiones relacionadas