InputStream을 가상 파일로 변환하는 방법


81

입력 변수 중 하나가 java.io.File 유형이 될 것으로 예상하는 메소드가 있지만 내가 얻는 것은 InputStream뿐입니다. 또한 메서드의 서명을 변경할 수 없습니다.

실제로 파일 시스템에 파일을 쓰지 않고 InputStream을 파일 유형으로 변환하려면 어떻게해야합니까?


내장 기능입니까? 아니면 사용자 정의 함수입니까?
Richard J. Ross III

2
@Richard : "메서드의 서명을 변경할 수 없습니다."
BalusC 2010

FileInputStream 대신 객체 가 정확히 필요한 이유는 무엇 입니까?
Poindexter

2
내가 사용하고있는 API가 File
Ram

나에게 보인다는 사람이 있다고는 대신에는 InputStream의 파일을 허용 깨진 API를 설계, 그리고 지금이 API 사용해야합니다
Mike76

답변:


121

이와 같은 것이 작동합니다. 단순성을 위해 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;
    }

}

8
createTempFile이 실제로 파일 시스템에서 볼 수있는 실제 파일을 작성하지 않습니까?
안드로이드 개발자

당신은 기술적으로 정확합니다. 위의 코드를 사용하면 임시 파일은 프로그램이 종료되거나 프로그램에 의해 삭제 될 때까지 존재합니다.
cobbzilla

deleteOnExit의 문서는 작업에 의존해서는 안된다고 말합니다 (실제로 아무것도하지 않는다고 생각합니다) : developer.android.com/reference/java/io/… . 또한 파일없이 오디오를 재생하는 방법을 알고 있다면 여기에 적어주세요 : stackoverflow.com/q/36552381/878126
안드로이드 개발자

4
일반적으로 응용 프로그램에서 임시 파일을 삭제하는 것이 합당 할 때 삭제하는 것을 선호합니다. 나는 deleteOnExit추가 온 전성 검사로 사용 하며, 무조건 의존하지 않습니다. 특정 상황 ( kill -9예 : JVM)에서 삭제를 수행하는 종료 후크가 호출되지 않는다는 것을 알고 있습니다.
cobbzilla

Android에서 이것을 사용하는 경우 implementation 'org.apache.directory.studio:org.apache.commons.io:2.4'gradle에 추가하십시오 .
LordParsley

30

당신은 할 수 없습니다. 입력 스트림은 데이터의 일반 스트림 일 뿐이며 실제로 파일에서 생성된다는 보장은 없습니다. 누군가 웹 서비스를 읽음으로써 InputStream을 만들거나 String을 InputStream으로 변환했다면 이것을 파일에 연결할 방법이 없습니다. 따라서 할 수있는 유일한 일은 실제로 스트림의 데이터를 임시 파일에 쓰고 (예 : File.createTempFile 메서드 사용)이 파일을 메서드에 공급하는 것입니다.


7
실제로 File#createTempFile()이것이 최선의 선택입니다.
BalusC 2010

7
또한 File#deleteOnExit()JVM이 종료 될 때 JVM이 자동으로 파일을 삭제하도록하는를 참조하십시오 . 물론 파일이 더 이상 필요하지 않고 더 이상 사용되지 않는다는 것을 알게되면 임시 파일을 수동으로 즉시 삭제하는 것이 가장 좋습니다. 그러나 불완전한 세상에서는 때때로 불완전한 해결책이 필요합니다.
Mike Clark
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.