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
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");
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.
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.
- 1. Rendimiento de DataInputStream \ DataOutputStream
- 2. Cómo escribir archivos (grandes) con Ruby Eventmachine
- 3. java: ¿escribir archivos grandes?
- 4. Sockets de Java: DataOutputStream o OutputStream?
- 5. Comparación de cadenas grandes en JavaScript con un hash
- 6. Cómo lidiar con cadenas grandes y memoria limitada
- 7. cómo usar ByteArrayOutputStream y DataOutputStream simultáneamente (Java)
- 8. No se puede escribir en DataOutputStream más allá de un tamaño específico - OutOfMemoryError
- 9. Cómo escribir gsub con comillas para cadenas UTF-8?
- 10. Escribir cadenas UTF-8 en MySQL con Python
- 11. Resharper con archivos grandes o * muy * grandes
- 12. Cómo escribir cadenas unicode en un archivo?
- 13. Cómo escribir cadenas en un OutputStream
- 14. Operaciones bit a bit en cadenas grandes en PHP
- 15. manera mas potente para almacenar grandes cantidades de cadenas estáticas
- 16. ¿Dónde se aumenta maxStringContentLength para que WCF pase cadenas grandes?
- 17. ¿Cómo encontrar cadenas comunes entre dos archivos muy grandes?
- 18. C# FileStream: Tamaño de búfer óptimo para escribir archivos grandes?
- 19. Manejo de listas de cadenas grandes en java
- 20. ¿Nuevo en pruebas unitarias, cómo escribir grandes pruebas?
- 21. Procesamiento de cadenas grandes, ¿es esta fragmentación de montón de objetos grandes?
- 22. ¿Cómo escribir archivos grandes en Blobstore utilizando la API experimental?
- 23. WM_COPYDATA SendMessage - ¿Puede enviar grandes cadenas de caracteres?
- 24. cond con cláusulas grandes
- 25. Cómo escribir archivos grandes en SQL Server FILESTREAM?
- 26. Aritmética con enteros arbitrariamente grandes en PHP
- 27. StringBuilder error de memoria al trabajar con cadenas grandes en java
- 28. Trabajando con grandes colecciones Backbone
- 29. Clojure - Calcular con números grandes
- 30. Grandes imágenes con el cairo
Esperaba que hubiera una API, pero eso básicamente confirma lo que estaba pensando. – Glen