C'è un modo per creare un java.io.File
oggetto 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.
C'è un modo per creare un java.io.File
oggetto 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.
Risposte:
È necessario creare un nuovo file e copiare il contenuto da InputStream
a 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.
In una riga:
FileUtils.copyInputStreamToFile(inputStream, file);
(Org.apache.commons.io)
Crea prima un file temporaneo.
File tempFile = File.createTempFile(prefix, suffix);
tempFile.deleteOnExit();
FileOutputStream out = new FileOutputStream(tempFile);
IOUtils.copy(in, out);
return tempFile;
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 .
Se non volete usare l'altro biblioteca, ecco un semplice funzione per convertire InputStream
a 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 Inputstream
file nel file usando FileOutputStream
-
FileOutputStream out = new FileOutputStream(outFile);
copyStream (inputStream, out);
out.close();
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.
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);
}
}
try
parte di inizializzazione vengono chiuse automaticamente quando try
si esce dal blocco.