从FileOutputStream获取文件名
有没有办法从FileOutputStream
或FileInputStream
获取文件名?
看起来答案是否定的: 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
没有公共方法返回构造stream时使用的File
或String
。
编辑:同样的FileInputStream
。
此function不是由开箱即用的File-Input / Output-Stream提供的,但是没有任何东西阻止您编写自己的存储File(或fileName)的子类并为其提供getter。
我build议为此实现一些FileNameAware
接口),因为I / O Streams通常被InputStream
/ OutputStream
抽象类引用,以避免将应用程序与特定的实现耦合。
可能的,反思 :汤姆G答案是正确的,即没有API来获取path。 但是,如果你像我这样的框架卡住,你不能改变,不能通过任何其他的意思得到的文件名,你可以使用reflection来获取path(在我的情况下,我需要为debugging目的)。
Field pathField = FileOutputStream.class.getDeclaredField("path"); pathField.setAccessible(true); String path = (String) pathField.get(outputStream);
显然,FileOutpuStream的实现可能会随着时间的推移而改变,这个代码可能会被破坏。 另外,为了清楚起见,我省略了上面片段中的例外处理。
原则上这是不可能的。 问题的假设是每个文件inputstream都与一个名称相关联的文件相关联。 后一种假设对于POSIX系统是错误的。 对于POSIX系统,一个文件可以有任意数量的名字(硬链接),包括零。 对于临时文件,零名称的情况相当普遍,以确保tgat程序退出时临时文件已被删除。
我的答案有点晚了。 编写代码时遇到同样的问题。
为了解决这个问题,我使用了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());