Ich habe eine Methode, die erwartet, dass die Eingabevariable vom Typ java.io.File ist, aber ich erhalte nur InputStream. Außerdem kann ich die Signatur der Methode nicht ändern.
Wie kann ich den InputStream in einen Dateityp konvertieren, ohne die Datei tatsächlich in das Dateisystem zu schreiben?
java
file
inputstream
RAM
quelle
quelle
File
Objekt anstelle des InputStream?Antworten:
So etwas sollte funktionieren. Beachten Sie, dass ich der Einfachheit halber eine Java 7-Funktion (Block mit verschließbarer Ressource versuchen) und IOUtils von Apache commons-io verwendet habe. Wenn Sie diese nicht verwenden können, dauert es etwas länger, aber die gleiche Idee.
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; } }
quelle
deleteOnExit
als zusätzlichen Gesundheitscheck und verlasse mich nie bedingungslos darauf. Ich weiß, dass in bestimmten Situationen (kill -9
z. B. der JVM) die Shutdown-Hooks, die das Löschen durchführen, niemals aufgerufen werden.implementation 'org.apache.directory.studio:org.apache.commons.io:2.4'
zu gradle hinzu.Das kannst du nicht. Der Eingabestream ist nur ein generischer Datenstrom und es gibt keine Garantie dafür, dass er tatsächlich aus einer Datei stammt. Wenn jemand einen InputStream aus dem Lesen eines Webdienstes erstellt oder nur einen String in einen InputStream konvertiert hat, gibt es keine Möglichkeit, diesen mit einer Datei zu verknüpfen. Sie können also nur Daten aus dem Stream in eine temporäre Datei schreiben (z. B. mithilfe der File.createTempFile-Methode) und diese Datei in Ihre Methode einspeisen.
quelle
File#createTempFile()
wirklich Ihre beste Wahl.File#deleteOnExit()
, wodurch die JVM versucht, die Datei beim Beenden der JVM automatisch zu löschen. Natürlich ist es am besten, die temporäre Datei manuell und sofort zu löschen, sobald Sie wissen, dass die Datei nicht mehr benötigt wird und nicht mehr verwendet wird. Aber in einer unvollkommenen Welt sind manchmal unvollkommene Lösungen notwendig.