입력 변수 중 하나가 java.io.File 유형이 될 것으로 예상하는 메소드가 있지만 내가 얻는 것은 InputStream뿐입니다. 또한 메서드의 서명을 변경할 수 없습니다.
실제로 파일 시스템에 파일을 쓰지 않고 InputStream을 파일 유형으로 변환하려면 어떻게해야합니까?
답변
이와 같은 것이 작동합니다. 단순성을 위해 Java 7 기능 (닫을 수있는 리소스가있는 시도 블록)과 Apache commons-io의 IOUtils를 사용했습니다. 그것들을 사용할 수 없다면 조금 더 길지만 같은 생각입니다.
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;
}
}
답변
당신은 할 수 없습니다. 입력 스트림은 데이터의 일반 스트림 일 뿐이며 실제로 파일에서 생성된다는 보장은 없습니다. 누군가 웹 서비스를 읽음으로써 InputStream을 만들거나 String을 InputStream으로 변환했다면 이것을 파일에 연결할 방법이 없습니다. 따라서 할 수있는 유일한 일은 실제로 스트림의 데이터를 임시 파일에 쓰고 (예 : File.createTempFile 메서드 사용)이 파일을 메서드에 공급하는 것입니다.