web-dev-qa-db-ja.com

FileOutputStreamからファイル名を取得する

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

41
Ebbu Abraham

答えはノーです:
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を返すパブリックメソッドはありません。

EDIT:FileInputStreamについても同様です。

31
Tom G

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

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

14
Costi Ciudatu

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

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

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

1.6および1.7では使用不可 1.8では使用可能です。

12
Hans Deragon

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

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

  • コードがストリームオブジェクトへの参照のクラスをfileストリームとして宣言する理由はほとんどありません。 IOコードはInputStreamまたはOutputStteamを使用できます。実際、インターフェイスへのプログラミングの一部として、should IOコードの簡単な単体テストを有効にする(モックオブジェクトとして単純なバイト配列ストリームの使用を有効にすることにより)。
  • おそらく、いくつかのログメッセージでファイル名を使用することを望んでいますか?もしそうなら、ファイルのIOプログラム階層の低すぎるエラーをログに記録しようとしていることを示唆します。おそらく、プログラムの上位部分に伝搬させるのではなく、IOExceptionsを「早く」キャッチしている可能性があります、IOはファイルIOであり、ファイルの名前を知っています。
2
Raedwald