如何从FileOutputStream
或 FileInputStream
中获取文件名?
如何从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
没有任何公共方法返回构造流时使用的File
或String
。
编辑:对于FileInputStream
也是一样的。
这个功能不是由开箱即用的文件Input/Output-Stream提供的,但你可以编写自己的子类来存储文件(或文件名),并提供一个getter方法。
我建议为此实现一些FileNameAware
接口,因为I/O Streams通常使用InputStream
/OutputStream
抽象类引用,以避免将应用程序与特定实现耦合。
可能,通过反射实现:Tom G 的回答是正确的,即没有 API 可以获取路径。但是,如果你像我一样被困在一个无法更改且无法通过其他方式获取文件名的框架中,你可以使用反射来获取路径(在我的情况下,我需要用于调试目的)。
Field pathField = FileOutputStream.class.getDeclaredField("path");
pathField.setAccessible(true);
String path = (String) pathField.get(outputStream);
显然,FileOutputStream的实现可能随着时间而改变,导致此代码失效。另外,上面的代码片段中我省略了异常处理以清晰明了。
在1.6和1.7中不可用,已确认1.8中可用。
我的回答有点晚。在编写代码时,我遇到了同样的问题。
为了解决这个问题,我使用了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());