2011-09-30 75 views
5

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

+4

你甚至明白你在这里要求什么吗?你是什​​么意思“转换”?他们根本上是相反的事情;一个是阅读,另一个是写作。你是否试图在你的'FileOutputStream'中读取你正在写入的文件? –

+1

你到底想做什么? FileOutputStream写入文件,FileInputStream读取文件。我看不出前者如何转化为后者。 –

+0

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

回答

14

这可以帮助你:

http://ostermiller.org/convert_java_outputstream_inputstream.html

本文提到的3种可能性:

  • 写完整的输出入一个字节数组,然后再
  • 使用管道
  • 阅读使用圆形字节缓冲区(该页面上托管的库的一部分)


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

与Apache下议院IO简单的解决办法是:

IOUtils.copyLarge(InputStream, OutputStream) 

,或者如果你只是想要复制文件:

FileUtils.copyFile(inFile,outFile); 

如果你不想使用Apache Commons IO,这里是wha t时的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; 
} 
+1

链接已损坏,但您仍然可以在此处找到原始答案: https://web.archive.org/web /20110929161214/http://ostermiller.org/convert_java_outputstream_inputstream.html – GregT

1

如果你可以使用给出@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) 
+0

我无法看到这是如何“将FileOutputStream转换为FileInputStream”。 –

+0

其实我的例子是相反的(输入到输出),所以我删除它。如果它仍然相关,我可以将其删除以供参考。 – Thomas

+0

@Mark:这是真的,我只是假设他想读一个到另一个 – Kris

2

如果您的意思是希望能够在写入内容(无需刷新到磁盘)之后读取内容,请使用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

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

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

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

+3

我认为他可以使用FileOutputStream.getFD()来获取FileDescriptor;比围绕它建立一个FileInputStream。不知道您是否可以同时从相同的FileDescriptor读取和写入。 –

+0

@ S.L.Barth:好的一点,我已经仔细研究过,但是错过了'FileInputStream'具有带'FileDescriptor'的构造函数的事实。 –