2011-11-22 15 views
5

Dopo aver tentato diligentemente di implementare il trasferimento di file TCP nella mia applicazione di chat per conferenze utilizzando flussi di byte non elaborati, ho deciso che è molto più semplice inviare i file che voglio trasferire attraverso i flussi di oggetto. I file vengono inviati e archiviati a destinazione (indipendentemente dal fatto che si tratti del server centrale o del client di download) come oggetti File in memoria. Tuttavia, questi file non sono utilizzabili solo come oggetti File: i client dovrebbero essere in grado di aprirli. C'è un modo in Java per salvare gli oggetti File come file del disco rigido o persino per aprirli tramite Java?Salvataggio/apertura Java Oggetti file

risposta

8

Cosa si intende per "Oggetti file"; intendi java.io.File?

Classe java.io.File è solo una rappresentazione di un nome di directory e nome file. Non è un oggetto che può contenere il contenuto di un file.

Se si hanno i dati in ad esempio un array di byte in memoria, allora sì, è possibile salvare quella di un file:

byte[] data = ...; 

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

Vedi l'Basic I/O Lesson dal Tutorial Java di Oracle per imparare a leggere e scrivere file con FileInputStream e FileOutputStream.

+0

Il mio male, non era a conoscenza del fatto che java.io.File non era in grado di contenere il contenuto del file. board :( –

1

si dovrebbe guardare in Data Handlers

È possibile utilizzarli per trasferire i file come Data Sources ma in modo "trasparente" a voi.

+0

Grazie, li guarderemo in futuro –

0

ho deciso che è molto più facile per inviare i file che voglio trasferito attraverso i flussi di oggetti "

Non è un'idea Bad:.. Costi di memoria e la latenza (cioè il tempo e lo spazio) Basta inviare e ricevere i byte, con elementi in primo piano per dirvi il nome del file e la dimensione del file

+0

Ho provato ad inviare il nome del file prima usando un PrintWriter, un d quindi i byte grezzi utilizzando un BufferedOutputStream. Il nome file e i byte invierebbero dal lato mittente senza problemi. Il lato ricevente potrebbe anche ricevere il nome del file, ma non potrebbe ricevere nessuno dei byte grezzi - ha appena creato file vuoti. Quando sono passato all'utilizzo di un flusso di oggetti, sembrava funzionare? –

+1

@RichardStokes che non funzionerà mai. Utilizzare gli stessi flussi su entrambe le estremità per la durata della connessione. PrintWriter ha un buffer, BufferedOutputStream ha un buffer, BufferedReader ha un buffer e BufferedInputStream ha un buffer. Troppi buffer per la coerenza attraverso il filo. Userei un DataOutputStream/DataInputStream per tutto, inviando il nome file con writeUTF()/readUTF(), la lunghezza con writeLong()/readLong() e i dati con write() e read(). – EJP

+0

Wow grazie, un commento brillante e completo. –