46

FileOutputStreamまたは からファイル名を取得する方法はありますFileInputStreamか?

4

5 に答える 5

35

答えはノーのようです:
http://download.oracle.com/javase/1.4.2/docs/api/java/io/FileOutputStream.html
http://docs.oracle.com/javase/7/docs/api/index.html?java/io/FileOutputStream.html

Fileまたはを返すパブリック メソッドはなくString、ストリームの構築に使用されます。

編集:についても同じことが言えFileInputStreamます。

于 2011-02-08T06:12:39.833 に答える
16

この機能は、すぐに使用できる File-Input/Output-Stream では提供されませんが、File (または fileName) を格納し、getter を提供する独自のサブクラスを作成することを妨げるものは何もありません。

これには何らかのインターフェースを実装することをお勧めしFileNameAwareます)。I/O ストリームは通常、アプリケーションが特定の実装と結合するのを避けるためにInputStream/OutputStream抽象クラスで参照されるためです。

于 2011-02-08T06:31:45.720 に答える
15

可能、リフレクションあり: Tom G 答えは正しいです。つまり、パスを取得するための API がありません。ただし、私のようにフレームワークを変更できず、他の方法でファイル名を取得できない場合は、リフレクションを使用してパスを取得できます (私の場合、デバッグ目的で必要でした)。

Field pathField = FileOutputStream.class.getDeclaredField("path");
pathField.setAccessible(true);
String path = (String) pathField.get(outputStream);

明らかに、FileOutpuStream の実装は時間の経過とともに変更される可能性があり、このコードは壊れる可能性があります。また、わかりやすくするために、上記のスニペットでは例外の処理を省略しました。

1.6 と 1.7 では利用できません 。1.8 で利用できることを確認しました。

于 2015-11-06T17:35:58.327 に答える
3

これは原理的にも不可能です。質問の前提は、各ファイル入力ストリームが 1 つの名前を持つ 1 つのファイルに関連付けられていることです。POSIX システムの場合、後者の仮定は間違っています。POSIX システムの場合、ファイルにはゼロを含む任意の数の名前 (ハード リンク) を付けることができます。プログラムの終了時に一時ファイルが確実に削除されるようにするために、一時ファイルの名前がゼロの場合は非常に一般的です。

私はたくさんのファイル IO コードを書いてきましたが、この機能は必要ありませんでした。あなたがそれを求めているということは、設計上の欠陥があることを示唆しています。つまり、XY 問題があります。

  • コードで、ストリーム オブジェクトへの参照のクラスをファイルストリームとして宣言する理由はほとんどありません。IO コードは、InputStream または OutputStteam を使用できます。実際、インターフェイスへのプログラミングの一部として、また IO コードの安価なユニット テストを有効にする必要があります (単純なバイト配列ストリームをモック オブジェクトとして使用できるようにすることにより)
  • おそらく、いくつかのログ メッセージでファイル名を使用することを望んでいますか? もしそうなら、それはあなたがファイル IO エラーをログに記録しようとしていることがプログラム階層の低すぎることを示唆しています。おそらく、IO がファイル IO であり、ファイルの名前を認識しているプログラムの上位部分に IOException を伝播させるのではなく、IOException をキャッチしすぎている可能性があります。
于 2016-11-20T09:26:12.220 に答える