Como converter InputStream para o arquivo virtual

Eu tenho um método que espera que o da variável de input seja do tipo java.io.File, mas o que eu recebo é apenas InputStream. Além disso, não posso alterar a assinatura do método.

Como posso converter o InputStream em tipo de arquivo sem gravá-lo no sistema de arquivos?

Algo como isso deve funcionar. Observe que, para simplificar, usei um recurso do Java 7 (tente bloquear com recurso que pode ser fechado) e o IOUtils do Apache commons-io. Se você não pode usá-los, será um pouco mais longo, mas a mesma idéia.

 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; } } 

Você não pode. O stream de input é apenas um stream genérico de dados e não há garantia de que ele realmente se origine de um arquivo. Se alguém criasse um InputStream da leitura de um serviço da Web ou apenas convertesse uma String em um InputStream, não haveria como vinculá-lo a um arquivo. Portanto, a única coisa que você pode fazer é gravar dados do stream em um arquivo temporário (por exemplo, usando o método File.createTempFile) e alimentar esse arquivo em seu método.