从FileOutputStream获取文件名

时间:2011-02-08 06:07:57

标签: java io fileoutputstream

有没有办法从FileOutputStreamFileInputStream获取文件名?

5 个答案:

答案 0 :(得分:31)

看起来答案是否定的:
<删除> 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

答案 1 :(得分:14)

现成的文件输入/输出流不提供此功能,但没有什么能阻止您编写自己的存储File(或fileName)的子类并为其提供getter。 / p>

我建议为此实现一些FileNameAware接口,因为I / O Streams通常使用InputStream / OutputStream抽象类引用,以避免将应用程序与特定实现耦合。

答案 2 :(得分:12)

可能,有反射: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确认可用。

答案 3 :(得分:2)

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

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

  • 几乎没有理由将代码声明为流对象的引用类为 file 流。 IO代码可以使用InputStream或OutputStteam。实际上,应该,作为接口编程的一部分,并且能够对IO代码进行廉价的单元测试(通过使用简单的字节数组流作为模拟对象)。
  • 您是否希望在某些日志消息中使用文件名?如果是这样,那表明您尝试在程序层次结构中将文件IO错误记录得太低。也许您正在捕获IOExceptions&#34;早期&#34;而不是让它们传播到程序的更高部分,这些部分知道IO是文件IO并且知道文件的名称。

答案 4 :(得分:-2)

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

为了解决这个问题,我使用FileOutputStream(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());