2012-01-25 7 views
2

File 인수를 사용하여 메서드를 호출하는 InputStream 매개 변수 (인스턴스가 FileInputStream)를 사용하여 메서드를 구현하려면 사용하는 API를 기반으로해야합니다.FileInputStream의 원본 파일을 가져 오는 방법

implementedMethod(InputStream is){ 
    FileInputStream fis = (FileInputStream)is; //always works 
    File f = (???) ????(???).???; 
    calledMethod(f); 
} 

그래서 내가 어떻게 내가 가진 모두가 FileInputStreamFile 것을 제공합니까? FileChannel 또는 FileDescriptor (둘 다 FIS)이 정확히 작동하는 방식을 이해하지 못합니다.

이 작업을 수행 할 수 없으며 실제로 파일 시스템에 (임시) 파일을 작성해야합니다. 그렇지 않다면 FileChannel 또는 FileDescriptor 대신 메모리에 내 파일을 만들거나 RandomAccessFile (?)과 같은 내용을 알고 싶습니다. 어떻게해야합니까?

읽을 수있는 구조로 구성되어 있습니까? File 개체에서 필요합니다. 디스크의 어딘가에 존재 하는가? 이 이상한 찾으십시오 ...

+0

왜 당신이 원하는 것이 그렇게하려는? 그것은 하위 클래스에서 슈퍼 클래스를 호출하는 것과 비슷합니다. 아마도 문제를 올바르게 모듈화하지 않았습니까? – Flavius

+0

FileInputStream이 필요한 경우, 형식 매개 변수 유형을'FileInputStream'으로 변경하십시오. 'File' 변경이 필요하다면 스트림을 파일로 만들고 구성하십시오. –

답변

2

내가 아는 한, FileInputStream에서 파일 이름을 얻을 수있는 방법은 없습니다.

우리 모두 알고 있듯이 스트림은 예를 들어 소켓을 나타내는 파일 설명자로 구성되었을 수 있습니다.

내 생각에 디자인을 다시 생각해 보는 것이 좋습니다.

+0

글쎄, 내가 2 API를 연결할 필요가있다, 나는 변압기가 필요 그렇게 할 수없는 재 설계에 대해. 나는 시스템 프로세스에서 파일을 쓰는 것을 우회하는 어떤 방법을 기대하고 있었다. 그것은 피할 수없는 것처럼 보입니다. Btw 어떻게 소켓 FileInputStream 생성 할 수 있습니다? 더 중요한 것은 "읽을 수있는 File 객체를 구성하면 디스크의 어딘가에 존재해야합니까? – sinekonata

0

당신은 당연히 항상 (JDK와 보안 관리자)에 따라 작동하지 않습니다 가정하고 API를 우회 할 수 있습니다, 사용 반사 :

/** 
* Retrieves the {@link File} associated to given {@link FileInputStream}, if possible. 
* @param inputStream the input stream. 
* @return the file. 
*/ 
@Nullable 
public File retrieveFile(@NotNull final FileInputStream inputStream) 
{ 
    @Nullable final File result; 

    @Nullable String path = null; 

    try 
    { 
     @Nullable final Field field = 
      inputStream.getClass().getDeclaredField("path"); 
     field.setAccessible(true); 
     path = (String) field.get(inputStream); 
    } 
    catch (@NotNull final Throwable noFieldOrNoRights) 
    { 
    } 

    if (path == null) 
    { 
     result = null; 
    } 
    else 
    { 
     result = new File(path); 
    } 

    return result; 
} 
관련 문제