2012-01-25 55 views
2

我需要基於我使用的API來實現一個參數爲InputStream的參數(實例爲FileInputStream),該參數將調用帶有File參數的方法。我該如何檢索FileInputStream的原始文件

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

那麼,如何提供File當所有我已經是一個FileInputStream?我不明白什麼是FileChannelFileDescriptor(均在FIS)是什麼,他們是如何工作的。

我猜這不能完成,我將不得不在文件系統上寫一個(臨時)文件。如果沒有,如果我可以在內存中創建我的文件,而不是FileChannel或FileDescriptor,或者甚至使用RandomAccessFile(?)我想知道如何...

是否構建可讀的File對象需要它存在於磁盤上的某個地方?我發現這個奇怪的...

+0

爲什麼你要想做的事是什麼?這就像是從子類中調用超類,這是不好的做法。也許你沒有正確模塊化你的問題? – Flavius

+0

如果您期望FileInputStream,爲什麼不將形式參數類型更改爲'FileInputStream'。如果你需要一個'File'來改變它自己的文件和構造流。 –

回答

2

據我所知,沒有辦法從FileInputStream獲得文件名。

對於我們所知道的,流可能是從一個文件描述符構成的,例如表示一個套接字。

我的建議是重新考慮你的設計。

+0

以及重新設計我不能,因爲我說我有2個API連接,我需要一個變壓器做到這一點。我希望有某種方法可以繞過在系統進程中編寫文件。看起來它是無法避免的。順便說一句套接字如何生成FileInputStream? 更重要的是,「構建一個可讀的File對象是否需要它存在於磁盤上某處?我發現這很奇怪......」 – sinekonata

0

你當然也可以繞過API,並假設它並不總是可行的(取決於JDK和安全管理器),使用反射:

/** 
* 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; 
} 
相關問題