2011-11-22 5 views
5

Después de esforzarme por implementar la transferencia de archivos TCP en mi aplicación de chat de conferencia usando flujos de bytes sin formato, decidí que era mucho más fácil enviar archivos que deseaba transferir a través de secuencias de objetos. Los archivos se envían y almacenan en su destino (ya sea el servidor central o el cliente de descarga) como objetos de archivo en memoria. Sin embargo, estos archivos no sirven como objetos de archivo, los clientes deberían poder abrirlos. ¿Hay alguna forma en Java para guardar los objetos de archivo como archivos de disco duro o incluso abrirlos a través de Java?Guardado/apertura de archivos Java

Respuesta

8

¿Qué quiere decir con "Objetos de archivo"; quieres decir java.io.File?

La clase java.io.File es solo una representación de un nombre de directorio y nombre de archivo. No es un objeto que puede contener el contenido de un archivo.

Si usted tiene los datos de, por ejemplo, una matriz de bytes en la memoria, entonces sí, se puede ahorrar que en un archivo:

byte[] data = ...; 

OutputStream out = new FileOutputStream(new File("C:\\someplace\\filename.dat")); 
out.write(data); 
out.close(); 

Véase el Basic I/O Lesson de tutoriales de Java de Oracle para aprender a leer y escribir archivos con un FileInputStream y FileOutputStream.

+0

Es malo, no sabía que java.io.File no podía contener los contenidos del archivo. Volver al dibujo tablero así :( –

1

usted debe buscar en Data Handlers

Usted las puede utilizar para transferir archivos como Data Sources pero de una manera "transparente" para usted.

+0

Gracias, los miraré en futuro. –

0

He decidido que es mucho más fácil de enviar archivos que desea transferir través de las corrientes de objeto "

No es mala idea:.. Costes de la memoria y la latencia (tiempo y espacio) Simplemente envíe y reciba los bytes, con las cosas en el frente para decirle el nombre del archivo y el tamaño del archivo.

+0

Intenté enviar el nombre de archivo primero usando un PrintWriter, un d luego los bytes sin formato usando un BufferedOutputStream. El nombre de archivo y los bytes enviarían desde el lado del remitente sin problemas. El lado del receptor también podría recibir el nombre del archivo, sin embargo, no podría recibir ninguno de los bytes sin procesar, solo hizo los archivos vacíos. Cuando cambié a usar un flujo de objeto, parecía funcionar? –

+1

@RichardStokes Eso nunca funcionará. Use las mismas transmisiones en ambos extremos durante la vida de la conexión. PrintWriter tiene un buffer, BufferedOutputStream tiene un buffer, BufferedReader tiene un buffer, y BufferedInputStream tiene un buffer. Demasiados búferes para coherencia a través del cable. Yo usaría un DataOutputStream/DataInputStream para todo, enviando el nombre de archivo con writeUTF()/readUTF(), la longitud con writeLong()/readLong(), y los datos con write() y read(). – EJP

+0

Wow gracias, un comentario brillantemente minucioso. –