FileOutputStream转换为FileInputStream

9
什么是将FileOutputStream转换为FileInputStream的最简单方法(提供一段代码)?

4
你明白你在这里要求什么吗?你所说的“转换”是什么意思?它们本质上是相反的东西;一个是为了阅读,另一个是为了写作。你是想在FileOutputStream中读取你正在写入的文件吗? - Mark Peters
1
你想做什么?FileOutputStream 用于向文件写入数据,而 FileInputStream 则用于从文件读取数据。我看不出前者如何转换为后者。 - JB Nizet
我收到了一个FileOutputStream。我想要的是读取它。 - Pen
1
@Pen:试试这个:((FileInputStream)yourFileOutputStream),那应该就是答案了。 - Andrey Agibalov
2
@loki2302 哈哈,那是一种看待问题的方式,也会带来非常好的性能 ;) - Philipp Reichart
显示剩余2条评论
5个回答

17

这可能会对您有所帮助:

http://ostermiller.org/convert_java_outputstream_inputstream.html

该文章提到了三种可能性:

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


仅供参考,以相反的方式进行(从输入到输出):

使用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
链接已经失效,但您仍然可以在此处找到原始答案:https://web.archive.org/web/20110929161214/http://ostermiller.org/convert_java_outputstream_inputstream.html - GregT

4
我收到了一个FileOutputStream,我想要读取它。你当然不能从OutputStream中读取。我认为你的意思是想从被FileOutputStream写入的文件中读取。但我认为你也无法这样做,因为FileOutputStream似乎没有保留对正在写入的文件的引用。你需要做的是找出传递给FileOutputStream的File或路径(一个String),并使用相同的File或String创建一个新的FileInputStream。

3
我认为他可以使用FileOutputStream.getFD()来获取文件描述符,然后在其上构建FileInputStream。不确定是否可以同时从同一文件描述符读取和写入。 - S.L. Barth
@S.L.Barth:说得好,我确实研究过,但是错过了 FileInputStream 有一个接受 FileDescriptor 的构造函数的事实。 - Mark Peters

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包提供的缓冲区。

0

如果您能使用 @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)

1
我看不出这是如何将“FileOutputStream”转换为“FileInputStream”的。 - Mark Peters
实际上我的例子是相反的(输入到输出),所以我已经删除了它。如果它仍然相关,我可以将其恢复以供参考。 - Thomas
@Mark:没错,我只是假设他想把一个读入另一个。 - Kris
我更喜欢使用Commons IO的已删除答案,因为它具有正确的资源处理(try-finally),并且执行未缓冲的单字节复制。 - Philipp Reichart
@Philip:我也是 :),由于“Thomas”删除了他的答案,所以我在我的下面添加了这种方式。 - Kris

0
你需要的是一个RandomAccessFile。它具有FileInputStream和FileOutputStream的基本方法。我知道,你可能没有得到这个。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接