È possibile creare un oggetto File da InputStream


121

C'è un modo per creare un java.io.Fileoggetto da un java.io.InputStream?

Il mio requisito è leggere il file da un RAR. Non sto cercando di scrivere un file temporaneo, ho un file all'interno dell'archivio RAR che sto cercando di leggere.


1
il mio requisito è leggere il file da un RAR. Supponiamo che io non stia cercando di scrivere il file temporaneo dal RAR, all'interno di RAR ho un file, ho solo bisogno di leggere.
— androidgalaxyman

Non capisco la domanda. Si prega di precisare. Se vuoi il File originale da InputStream, non ce n'è uno: stai leggendo un file RAR, non un File. Se vuoi qualcos'altro, cosa?
— Marchese di Lorne

Risposte:


87

È necessario creare un nuovo file e copiare il contenuto da InputStreama quel file:

File file = //...
try(OutputStream outputStream = new FileOutputStream(file)){
    IOUtils.copy(inputStream, outputStream);
} catch (FileNotFoundException e) {
    // handle exception here
} catch (IOException e) {
    // handle exception here
}

Sto usando conveniente IOUtils.copy()per evitare la copia manuale dei flussi. Inoltre ha il buffering integrato.


3
Impossibile risolvere gli IOUtil in Android Studio e il collegamento a cui hai fatto riferimento è un 404.
— Shahraiz T.

3
org.apache.directory.studio:org.apache.commons.io doveva essere aggiunto come dipendenza. Colpa mia. :)
— Shahraiz T.

7
Si prega di chiudere correttamente OutputStream, utilizzare una prova con risorse o IOUtils.closeQuietly. So che è solo un esempio, ma i principianti lo copieranno letteralmente.
— Rafael Membrives

59

In una riga:

FileUtils.copyInputStreamToFile(inputStream, file);

(Org.apache.commons.io)


29

Crea prima un file temporaneo.

File tempFile = File.createTempFile(prefix, suffix);
tempFile.deleteOnExit();
FileOutputStream out = new FileOutputStream(tempFile);
IOUtils.copy(in, out);
return tempFile;

Includi il nome del pacchetto di IOUtils
— Ridhuvarshan

org.apache.commons.io
— Shehan Simen

Esiste anche in org.apache.axis2.util con un terzo parametro per la funzione di copia. La funzionalità funziona anche lì. Qualche confronto su cosa usare?
— Ridhuvarshan

26

Da Java 7, puoi farlo in una riga anche senza utilizzare alcuna libreria esterna:

Files.copy(inputStream, outputPath, StandardCopyOption.REPLACE_EXISTING);

Consulta i documenti dell'API .


2
Se lo utilizzi con Android, è richiesto un SDK minimo di 26.
— Neph

3

Se non volete usare l'altro biblioteca, ecco un semplice funzione per convertire InputStreama OutputStream.

public static void copyStream(InputStream in, OutputStream out) throws IOException {
    byte[] buffer = new byte[1024];
    int read;
    while ((read = in.read(buffer)) != -1) {
        out.write(buffer, 0, read);
    }
}

Ora puoi facilmente scrivere un Inputstreamfile nel file usando FileOutputStream-

FileOutputStream out = new FileOutputStream(outFile);
copyStream (inputStream, out);
out.close();

1

Facile soluzione Java 11 con prova con blocco delle risorse

public static void copyInputStreamToFile(InputStream input, File destination) {  

    try (OutputStream output = new FileOutputStream(destination)) {
        input.transferTo(output);
    } catch (IOException ioException) {
        ioException.printStackTrace();
    }

}

java.io.InputStream # transferTo è disponibile da Java 9.


0

Se stai usando Java versione 7 o successiva, puoi usare try-with-resources per chiudere correttamente il file FileOutputStream. Il codice seguente viene utilizzato IOUtils.copy()da commons-io .

public void copyToFile(InputStream inputStream, File file) throws IOException {
    try(OutputStream outputStream = new FileOutputStream(file)) {
        IOUtils.copy(inputStream, outputStream);
    }
}  

Non è necessario chiudere OutputStream? Come nella risposta di Tomasz N.
— trinity420

3
@ trinity420 Le risorse specificate nella tryparte di inizializzazione vengono chiuse automaticamente quando trysi esce dal blocco.
— h3xStream
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.