2012-01-25 9 views
2

引数を持つメソッドを呼び出すInputStreamパラメータ(インスタンス:FileInputStream)を持つメソッドを実装するには、使用するAPIに基づいている必要があります。FileInputStreamの元のファイルを取得する方法

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

は、どのように私は私が持っているすべてのFileInputStreamときFileことを提供していますか? FileChannelまたはFileDescriptor(両方ともFIS)が正確にどのように動作するのか分かりません。

これはできないと私は実際に(一時)ファイルをファイルシステムに書き込まなければならないと思います。そうでない場合は、FileChannelやFileDescriptorの代わりにメモリ内にファイルを作成することができますか?RandomAccessFile(?ディスクのどこかに存在する?私はこの奇妙な発見...

+0

あなたがそれをやりたいしたいと思うのはなぜ?それはサブクラスからスーパークラスを呼び出すようなものですが、それは悪い習慣です。おそらくあなたは問題を正しくモジュール化していないでしょうか? – Flavius

+0

FileInputStreamが必要な場合は、仮パラメータの型を 'FileInputStream'に変更してみてください。 'File'を変更する必要がある場合は、ファイルを作成して自分でストリームを構築します。 –

答えて

2

私の知る限り、ファイル名を取得する方法はありませんFileInputStream

私たちが知っている限り、ストリームは、例えばソケットを表すファイル記述子から構築されている可能性があります。

あなたのデザインを再考することをおすすめします。

+0

よく再設計について私は接続する2つのAPIを持っていると言っていたので、私は変圧器が必要です。私はシステムプロセス上のファイルを書き込むことを回避する何らかの方法を望んでいました。それは避けることができないように見えます。 BtwソケットはどのようにしてFileInputStreamを生成できますか? さらに重要なことに、「読み込み可能なFileオブジェクトを構築するには、ディスク上のどこかに存在する必要がありますか? – sinekonata

0

あなたはもちろん、(JDKとのSecurityManagerに応じて)それは常に動作しませんと仮定すると、利用反射を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; 
} 
関連する問題