입력 변수 중 하나가 java.io.File 유형이 될 것으로 예상하는 메소드가 있지만 내가 얻는 것은 InputStream뿐입니다. 또한 메서드의 서명을 변경할 수 없습니다.
실제로 파일 시스템에 파일을 쓰지 않고 InputStream을 파일 유형으로 변환하려면 어떻게해야합니까?
입력 변수 중 하나가 java.io.File 유형이 될 것으로 예상하는 메소드가 있지만 내가 얻는 것은 InputStream뿐입니다. 또한 메서드의 서명을 변경할 수 없습니다.
실제로 파일 시스템에 파일을 쓰지 않고 InputStream을 파일 유형으로 변환하려면 어떻게해야합니까?
File
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;
}
}
deleteOnExit
추가 온 전성 검사로 사용 하며, 무조건 의존하지 않습니다. 특정 상황 ( kill -9
예 : JVM)에서 삭제를 수행하는 종료 후크가 호출되지 않는다는 것을 알고 있습니다.
implementation 'org.apache.directory.studio:org.apache.commons.io:2.4'
gradle에 추가하십시오 .
당신은 할 수 없습니다. 입력 스트림은 데이터의 일반 스트림 일 뿐이며 실제로 파일에서 생성된다는 보장은 없습니다. 누군가 웹 서비스를 읽음으로써 InputStream을 만들거나 String을 InputStream으로 변환했다면 이것을 파일에 연결할 방법이 없습니다. 따라서 할 수있는 유일한 일은 실제로 스트림의 데이터를 임시 파일에 쓰고 (예 : File.createTempFile 메서드 사용)이 파일을 메서드에 공급하는 것입니다.
File#createTempFile()
이것이 최선의 선택입니다.
File#deleteOnExit()
JVM이 종료 될 때 JVM이 자동으로 파일을 삭제하도록하는를 참조하십시오 . 물론 파일이 더 이상 필요하지 않고 더 이상 사용되지 않는다는 것을 알게되면 임시 파일을 수동으로 즉시 삭제하는 것이 가장 좋습니다. 그러나 불완전한 세상에서는 때때로 불완전한 해결책이 필요합니다.