【发布时间】:2011-06-23 05:46:14
【问题描述】:
有没有办法从FileOutputStream 或FileInputStream 获取文件名?
【问题讨论】:
标签: java io fileoutputstream
有没有办法从FileOutputStream 或FileInputStream 获取文件名?
【问题讨论】:
标签: java io fileoutputstream
看起来答案是否定的: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 也是如此。
【讨论】:
开箱即用的文件输入/输出流不提供此功能,但没有什么能阻止您编写自己的子类来存储文件(或文件名)并为其提供 getter。
我建议为此实现一些 FileNameAware 接口),因为 I/O 流通常使用 InputStream / OutputStream 抽象类来引用,以避免将您的应用程序与特定实现耦合。
【讨论】:
可能,有反射:Tom G 的答案是正确的,即没有 API 可以获取路径。但是,如果您像我一样被一个框架卡住,您无法更改并且无法通过任何其他方式获取文件名,您可以使用反射来获取路径(在我的情况下,我需要它来进行调试)。
Field pathField = FileOutputStream.class.getDeclaredField("path");
pathField.setAccessible(true);
String path = (String) pathField.get(outputStream);
显然,FileOutpuStream 的实现可能会随着时间而改变,并且此代码可能会中断。另外,为了清楚起见,我在上面的 sn-p 中省略了对异常的处理。
在 1.6 和 1.7 中不可用在 1.8 中确认可用。
【讨论】:
这是不可能的,即使在原则上也是如此。该问题的假设是每个文件输入流都与一个具有一个名称的文件相关联。对于 POSIX 系统,后一种假设是错误的。对于 POSIX 系统,文件可以有任意数量的名称(硬链接),包括零。零名称的情况在临时文件中很常见,以确保在程序退出时删除临时文件。
我写了很多文件 IO 代码,从来不需要这个功能。你要求它表明你有一个设计缺陷。也就是说,你有一个 XY 问题。
【讨论】:
我的回答来的有点晚。我在编写一些代码时遇到了同样的问题。
为了解决这个问题,我使用了FileOutputStream(File file) 而不是FileOutputStream(String location),因为这样我就可以使用file.getAbsolutePath()。请参阅下面的示例 sn-p。
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());
【讨论】: