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.