2010-11-30 3 views
61

입력 변수 중 하나가 java.io.File 유형이 될 것으로 예상되는 방법이 있지만 실제로 얻는 것은 InputStream뿐입니다. 메소드의 서명을 변경할 수 없습니다. 파일 시스템에 실제로 파일을 쓰지 않고 InputStream을 File 유형으로 변환하려면 어떻게해야합니까?InputStream을 가상 파일로 변환하는 방법

+0

이것은 내장 기능입니까? 또는 사용자 정의 함수입니까? –

+2

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

+0

정확히 InputStream 대신에'File' 개체가 필요한 이유는 무엇입니까? – Poindexter

답변

98

이와 비슷한 기능이 작동합니다. 간단히하기 위해 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; 
    } 

} 
+6

createTempFile은 파일 시스템에서 볼 수있는 실제 파일을 실제로 작성하지 않습니까? –

+0

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

+0

deleteOnExit의 문서에서는 작업에 의존해서는 안된다고 말합니다. (실제로는 아무 것도하지 않는다고 생각합니다) : http://developer.android.com/reference/java/io/File.html#deleteOnExit(). 또한 파일을 재생하지 않고 오디오를 스트리밍하는 방법을 알고 있다면 여기에 대해 다음과 같이 작성하십시오. http://stackoverflow.com/q/36552381/878126 –

27

수 없습니다. 입력 스트림은 일] 적으로 일반적인 데이터 스트림이며 실제로 File에서 시작한다는 보증은 없습니다. 누군가가 웹 서비스 읽기에서 InputStream을 만들었거나 String을 InputStream으로 변환했다면이 파일을 파일에 연결할 수 없습니다. 따라서 실제로 스트림에서 임시 파일 (예 : File.createTempFile 메소드 사용)에 데이터를 쓰고이 파일을 메소드에 전달하면됩니다.

+6

사실 [[File # createTempFile()'] (http://download.oracle.com/javase/6/docs/api/java/io/File .html # createTempFile % 28java.lang.String, % 20java.lang.String % 29) 정말 최선의 방법입니다. – BalusC

+6

['File # deleteOnExit()'] (http://download.oracle.com/javase/6/docs/api/java/io/File.html#deleteOnExit%28%29)을 참조하십시오. JVM JVM이 종료 될 때 자동으로 파일을 삭제하려고 시도합니다. 물론 파일이 더 이상 필요 없으며 더 이상 사용되지 않는다는 것을 알게되면 수동으로 임시 파일을 즉시 삭제하는 것이 가장 좋습니다. 그러나 불완전한 세계에서는 때로는 불완전한 해결책이 필요합니다. –

관련 문제