46

有没有办法从 aFileOutputStream或 from获取文件名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

没有公共方法可以返回FileString用于构造流。

编辑:同样适用于FileInputStream.

于 2011-02-08T06:12:39.833 回答
16

开箱即用的 File-Input/Output-Stream 不提供此功能,但没有什么能阻止您编写自己的子类来存储文件(或文件名)并为其提供 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

这是不可能的,即使在原则上也是如此。该问题的假设是每个文件输入流都与一个具有同一个名称的文件相关联。对于 POSIX 系统,后一种假设是错误的。对于 POSIX 系统,文件可以有任意数量的名称(硬链接),包括零。对于临时文件,零名称的情况很常见,以确保在程序退出时删除临时文件。

我写了很多文件 IO 代码,从来不需要这个功能。你要求它表明你有一个设计缺陷。也就是说,你有一个 XY 问题。

  • 代码几乎没有理由将流对象的引用类声明为文件流。IO 代码可以使用 InputStream 或 OutputStteam。事实上,它应该作为接口编程的一部分,并启用对您的 IO 代码的廉价单元测试(通过使用简单的字节数组流作为模拟对象)。
  • 您是否希望在某些日志消息中使用文件名?如果是这样,这表明您正在尝试在程序层次结构中记录文件 IO 错误太低。也许您“过早”地捕获 IOExceptions,而不是让它们传播到程序的更高部分,它们知道 IO 是文件 IO 并且知道文件的名称。
于 2016-11-20T09:26:12.220 回答
1

我的回答来的有点晚。我在编写一些代码时遇到了同样的问题。

为了解决这个问题,我使用了 aFileOutputStream(File file)而不是FileOutputStream(String location)因为我可以这样做file.getAbsolutePath(). 请参阅下面的示例片段。

String location = "some.relative.path.txt";
File file = new File(location);
FileOutputStream f = new FileOutputStream(file);
String question = "<h3>"+header+"</h3>";
String finalSource = HTMLWrapper.HTML_START+question +htmlContent;
f.write(finalSource.getBytes());
f.flush();
f.close();
System.out.println("The report is now available at"+file.getAbsolutePath());
于 2014-02-28T08:06:25.430 回答