【问题标题】:FileOutputStream into FileInputStreamFileOutputStream 转换为 FileInputStream
【发布时间】:2025-12-08 03:20:26
【问题描述】:

将 FileOutputStream 转换为 FileInputStream 的最简单方法是什么(一段代码会很棒)?

【问题讨论】:

  • 你明白你在这里要求什么吗?你是什​​么意思“转换”?它们是根本相反的东西。一个用于阅读,另一个用于写作。您是否尝试在 FileOutputStream 中读取您正在写入的文件?
  • 你到底想做什么? FileOutputStream 写入文件,FileInputStream 读取文件。我看不出如何将前者转换为后者。
  • 我收到一个 FileOutputStream。我想要的是阅读它。
  • @Pen:试试这个:((FileInputStream)yourFileOutputStream),这就是答案
  • @lok​​i2302 Hrhr,这是一种看待它的方式,也会提供异常性能;)

标签: java file-io


【解决方案1】:

这可能会对您有所帮助:

http://ostermiller.org/convert_java_outputstream_inputstream.html

本文提到了3种可能性:

  • 将完整的输出写入字节数组,然后再次读取
  • 使用管道
  • 使用循环字节缓冲区(该页面上托管的库的一部分)


仅供参考,反过来做(输入到输出):

使用 Apache Commons IO 的简单解决方案是:

IOUtils.copyLarge(InputStream, OutputStream)

或者如果你只是想复制一个文件:

FileUtils.copyFile(inFile,outFile);

如果您不想使用 Apache Commons IO,下面是 copyLarge 方法的作用:

public static long copyLarge(InputStream input, OutputStream output) throws IOException 
{
  byte[] buffer = new byte[4096];
  long count = 0L;
  int n = 0;
  while (-1 != (n = input.read(buffer))) {
   output.write(buffer, 0, n);
   count += n;
  }
  return count;
}

【讨论】:

【解决方案2】:

我收到一个 FileOutputStream。我想要的是阅读它。

您当然无法阅读OutputStream。我想你的意思是你想从FileOutputStream 写入的文件中读取。我认为你也做不到。 FileOutputStream 似乎没有保留对正在写入的文件的引用。

您需要做的是发现File 或路径(String)被传递到FileOutputStream 并使用相同的FileString 创建一个新的FileInputStream

【讨论】:

  • 我认为他可以使用 FileOutputStream.getFD() 来获取 FileDescriptor;而不是围绕它构建一个 FileInputStream 。不确定您是否可以同时从同一个 FileDescriptor 读取和写入。
  • @S.L.Barth:好点子,我实际上已经研究过了,但错过了 FileInputStream 有一个接受 FileDescriptor 的构造函数的事实。
【解决方案3】:

如果您的意思是希望在写入后能够读取内容(无需刷新到磁盘),请使用 ByteArrayOutputStream 和 ByteArrayInputStream。完成对 ByteArrayOutputStream 的写入后,您可以获取底层字节数据并使用 ByteArrayInputStream 将其读回。

ByteArrayOutputStream outStream = new ByteArrayOutputStream();
// do any output onto outStream you need
ByteArrayInputStream inStream = new ByteArrayInputStream(outStream.toByteArray());
// you can read back the output with inStream now

如果你想要一个缓冲区(生产者/消费者类型问题),请查看 java 的 nio 包提供的缓冲区。

【讨论】:

    【解决方案4】:

    如果你可以使用@Thomas给出的例子,否则你可以这样做:

    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.io.InputStream;
    import java.io.OutputStream;
    
    public class FileInputOutputExample {
      public static void main(String[] args) throws Exception {
    
        InputStream is = new FileInputStream("in.txt");
        OutputStream os = new FileOutputStream("out.txt");
        int c;
        while ((c = is.read()) != -1) {
          System.out.print((char) c);
          os.write(c);
        }
        is.close();
        os.close();
    
      }
    }
    

    来自 java2s.com 的示例

    编辑:

    由于@Thomas 删除了他的答案,我将添加 Commons IO 方法以供参考:

    IOUtils.copy(InputStream is, OutputStream os)
    

    【讨论】:

    • 我看不出这是如何“将FileOutputStream 转换为FileInputStream”。
    • 其实我的例子是相反的(输入到输出),所以我删除了它。如果它仍然相关,我可以取消删除它以供参考。
    • @Mark:没错,我只是假设他想把一个读到另一个
    • 我更喜欢 Commons IO 现在删除的答案。它缺乏正确的资源处理(try-finally)并且进行无缓冲的单字节复制。
    • @Philip: 我也是