Mam metodę, która oczekuje, że jedna ze zmiennych wejściowych będzie typu java.io.File, ale otrzymuję tylko InputStream. Nie mogę też zmienić podpisu metody.
Jak mogę przekonwertować InputStream na typ pliku bez faktycznego zapisywania pliku w systemie plików?
java
file
inputstream
Baran
źródło
źródło
File
obiektu zamiast InputStream?Odpowiedzi:
Coś takiego powinno działać. Zauważ, że dla uproszczenia użyłem funkcji Java 7 (spróbuj blokować z zamykanym zasobem) i IOUtils z Apache commons-io. Jeśli nie możesz ich użyć, potrwa to trochę dłużej, ale ten sam pomysł.
import org.apache.commons.io.IOUtils; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; public class StreamUtil { public static final String PREFIX = "stream2file"; public static final String SUFFIX = ".tmp"; public static File stream2file (InputStream in) throws IOException { final File tempFile = File.createTempFile(PREFIX, SUFFIX); tempFile.deleteOnExit(); try (FileOutputStream out = new FileOutputStream(tempFile)) { IOUtils.copy(in, out); } return tempFile; } }
źródło
deleteOnExit
jako dodatkowego sprawdzenia poczytalności, nigdy nie polegając na nim bezwarunkowo. Wiem, że w pewnych sytuacjach (kill -9
na przykład JVM) zaczepy zamykające, które wykonują usuwanie, nigdy nie zostaną wywołane.implementation 'org.apache.directory.studio:org.apache.commons.io:2.4'
do gradle.Nie możesz. Strumień wejściowy to po prostu ogólny strumień danych i nie ma gwarancji, że faktycznie pochodzi z pliku. Gdyby ktoś utworzył InputStream z odczytu usługi internetowej lub po prostu przekonwertował String na InputStream, nie byłoby sposobu, aby połączyć to z plikiem. Więc jedyne, co możesz zrobić, to zapisać dane ze strumienia do pliku tymczasowego (np. Używając metody File.createTempFile) i przesłać ten plik do swojej metody.
źródło
File#createTempFile()
to naprawdę najlepszy wybór.File#deleteOnExit()
, co powoduje, że maszyna JVM próbuje automatycznie usunąć plik po zakończeniu pracy maszyny JVM. Oczywiście najlepiej jest usunąć plik tymczasowy ręcznie i natychmiast, gdy wiesz, że plik nie jest już potrzebny i nie jest już używany. Ale w niedoskonałym świecie czasami konieczne są niedoskonałe rozwiązania.