15

JavaのInputStreamからファイルパス/名前を取得するにはどうすればよいですか?

4

3 に答える 3

12

不可能です。(Java APIのFileInputStreamからではありません)。コンストラクターは、FileInputStreamこの情報をどのフィールドにも格納しません。

public FileInputStream(File file) throws FileNotFoundException {
    String name = (file != null ? file.getPath() : null);
    SecurityManager security = System.getSecurityManager();
    if (security != null) {
        security.checkRead(name);
    }
        if (name == null) {
            throw new NullPointerException();
        }
    fd = new FileDescriptor();
    open(name);
    }
于 2010-03-23T17:06:41.433 に答える
10

InputStreamがファイルまたはパスではなかった可能性があるため、できません。InputStreamその場でデータを生成する独自の実装ができます

于 2010-03-23T17:04:10.540 に答える
4

2つの重要なオブジェクト指向設計の原則により、抽象化とカプセル化という、求めていることを実行できなくなります。

  • 抽象化は、特定のコンテキストでの使用に必要な詳細のみを持つ一般的な概念を定義するプロセスです(詳細はこちら)。この状況では、抽象化はです。これは、バイトのソースに関係なく、InputStreamバイトを提供できる一般的なインターフェイスです。の抽象化には、ファイルパスの概念はありません。これは、の特定の実装にのみ関連します。InputStreamInputStream
  • カプセル化は、クラスの実装の詳細をそのクラスのコンシューマー/ユーザーから隠すプロセスです。この特定の状況でFileInputStreamは、読み取り元のファイルの詳細をカプセル化します。これは、InputStreamその情報が使用法に関連していないためです。pathインスタンスフィールドはカプセル化されているため、クラスのユーザーは使用できません。

そうは言っても、いくつかの重要な制限を受け入れる意思がある場合は、変数にアクセスすることができます。path基本的に、要点はInputStream、が実際にのインスタンスであるかどうかを確認し、そうである場合は、リフレクションを使用してインスタンスフィールドFileInputStreamを読み取ることができるということです。pathこのアクセスの詳細は、Javaドキュメントやオンラインで簡単に見つけることがjava.lang.Classでき、ほとんどのコンテキストで一般的には良いことではないため、省略します。質問は理由についてのコンテキストを提供しないので、これ以上合理的なアプローチを提供することは困難です。

于 2016-04-22T20:08:10.250 に答える