Est-il possible de créer un objet Java.io.File
à partir d'un Java.io.InputStream
?
Mon exigence est la lecture du fichier à partir d'un fichier RAR. Je n'essaie pas d'écrire un fichier temporaire, j'ai un fichier dans l'archive RAR que je tente de lire.
Vous devez créer un nouveau fichier et copier le contenu de InputStream
dans ce fichier:
File file = //...
try(OutputStream outputStream = new FileOutputStream(file)){
IOUtils.copy(inputStream, outputStream);
} catch (FileNotFoundException e) {
// handle exception here
} catch (IOException e) {
// handle exception here
}
J'utilise la fonction IOUtils.copy()
pour éviter la copie manuelle des flux. En outre, il a tampon intégré.
En une ligne:
FileUtils.copyInputStreamToFile(inputStream, file);
(org.Apache.commons.io)
Créez d'abord un fichier temporaire.
File tempFile = File.createTempFile(prefix, suffix);
tempFile.deleteOnExit();
FileOutputStream out = new FileOutputStream(tempFile);
IOUtils.copy(in, out);
return tempFile;
Depuis Java 7, vous pouvez le faire en une ligne même sans utiliser de bibliothèques externes:
Files.copy(inputStream, outputPath, StandardCopyOption.REPLACE_EXISTING);
Voir la Documentation API .
Si vous ne souhaitez pas utiliser d'autres bibliothèques, voici une fonction simple permettant de convertir InputStream
en 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);
}
}
Maintenant, vous pouvez facilement écrire une Inputstream
dans un fichier en utilisant FileOutputStream
-
FileOutputStream out = new FileOutputStream(outFile);
copyStream (inputStream, out);
out.close();
Si vous utilisez Java version 7 ou supérieure, vous pouvez utiliser try-with-resources pour fermer correctement la FileOutputStream
. Le code suivant utilise IOUtils.copy()
from commons-io .
public void copyToFile(InputStream inputStream, File file) throws IOException {
try(OutputStream outputStream = new FileOutputStream(file)) {
IOUtils.copy(inputStream, outputStream);
}
}