【问题标题】:Get file name from FileOutputStream从 FileOutputStream 获取文件名
【发布时间】:2011-06-23 05:46:14
【问题描述】:

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

【问题讨论】:

    标签: java io fileoutputstream


    【解决方案1】:

    看起来答案是否定的:
    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 也是如此。

    【讨论】:

    • @Stephen- 我阅读了文档,但只是想确认我没有遗漏任何内容。
    【解决方案2】:

    开箱即用的文件输入/输出流不提供此功能,但没有什么能阻止您编写自己的子类来存储文件(或文件名)并为其提供 getter。

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • EJP,你错了。有这样一个领域。我刚刚在 Java 1.8.0_112-b16 下对其进行了测试。完整代码在这里:
      • 导入 java.io.FileOutputStream;导入 java.lang.reflect.Field;公共类 FileOutputStreamTest { public static void main(String args[]) 抛出异常 { FileOutputStream outputStream = new FileOutputStream("./FileOutputStreamTest.java");字段 pathField = FileOutputStream.class.getDeclaredField("path"); pathField.setAccessible(true);字符串路径 = (String) pathField.get(outputStream); System.out.println("path=" + path); } }
      • 另外,这不是重点。你的反对票完全不合适。如果“路径”不存在,则会有另一个名称不同的字段会执行相同的操作。我的观点是可以使用反射来获取信息,但不建议这样做。
      • 好的,不在 JDK 1.6 或 .7 中。为什么会有另一个领域?它不需要构造函数之外的路径。 JDK 1.6 不需要它。
      • EJP,我相信你是对的。我检查了 1.7 中的代码,但它不存在。路径名是临时的,过去不需要持久化。从 1.8 开始,它存储在变量“path”中,但我还没有检查代码以找出为什么这样做。我有一半是正确的,我很高兴我们在 1.8 中获得了这个“奖励”,因为它帮助我调试了我的问题。感谢您的意见。
      【解决方案4】:

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

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

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

      【讨论】:

      • 是的,这在原则上和实践中都是可能的。在创建所有流之后,指向特定文件。只需返回它就可以了
      【解决方案5】:

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

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

      【讨论】:

      • 可能是因为 File(Out/In)putStream 在您持有文件时并不重要。如果该方法仅返回一个 Stream,则您没有机会(直接使用 FileInputStream)检索底层文件或位置
      猜你喜欢
      • 2011-04-08
      • 2010-10-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-17
      • 2012-09-19
      • 2021-06-20
      相关资源
      最近更新 更多