È 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.