2

使用する API に基づいて、引数を持つメソッドを呼び出すInputStreamパラメーター (のインスタンス) を持つメソッドを実装する必要があります。FileInputStreamFile

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

Fileでは、私が持っているのが だけの場合、どうすればそれを提供できFileInputStreamますか? FileChannelaまたは a FileDescriptor( の両方FIS) が正確に何であり、どのように機能するのかわかりません。

これは不可能であり、ファイルシステムに (一時) ファイルを実際に書き込む必要があると思います。そうでない場合、代わりに FileChannel または FileDescriptor を使用してメモリ内にファイルを作成できる場合、またはRandomAccessFile(?) のようなものを使用してファイルを作成できる場合は、方法を知りたいです...

読み取り可能なオブジェクトを構築するには、それFileがディスク上のどこかに存在する必要がありますか? 私はこれが奇妙だと思う...

4

2 に答える 2

2

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

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

私の推薦はあなたのデザインを再考することです。

于 2012-01-25T08:56:30.463 に答える
0

もちろん、API をバイパスして、(JDK と SecurityManager によっては) 常に機能するとは限らないと仮定して、リフレクションを使用できます。

/**
 * 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;
}
于 2014-03-03T08:37:27.990 に答える