2011-11-02 26 views
25

我在尋找神奇的Java類,這將讓我做這樣的事情:如何將數據一次寫入兩個java.io.OutputStream對象?

ByteArrayOutputStream byteStream = new ByteArrayOutputStream(); 
FileOutputStream fileStream = new FileOutputStream(new File("/tmp/somefile")); 

MultiOutputStream outStream = new MultiOutputStream(byteStream, fileStream); 

outStream.write("Hello world".getBytes()); 

基本上,我想teeOutputStream S IN的Java。有任何想法嗎?

謝謝!

回答

2

滾你自己的,這基本上是微不足道的。使用ArrayList<OutputStream>或現在流行的任何流行存儲您想要的所有流,並寫入write方法循環所有這些,寫入到每個。

+14

I/O中的任何事情都不是微不足道的。即使它起初看起來如此。 –

+0

這並沒有真正回答如何同時寫入所有人的問題。 – Ataraxia

+0

@ZettaSuro「寫入寫入方法以遍歷所有這些寫入方法,寫入每個寫入方法。」你真的需要我爲你寫出for循環嗎? – Kevin

14

只需滾動你自己的。根本沒有任何魔法。使用Apache's TeeOutputStream你基本上會使用下面的代碼。當然,使用Apache Commons I/O庫,您可以利用其他類,但有時很高興實際上爲自己寫點東西。 :)

public final class TeeOutputStream extends OutputStream { 

    private final OutputStream out; 
    private final OutputStream tee; 

    public TeeOutputStream(OutputStream out, OutputStream tee) { 
    if (out == null) 
     throw new NullPointerException(); 
    else if (tee == null) 
     throw new NullPointerException(); 

    this.out = out; 
    this.tee = tee; 
    } 

    @Override 
    public void write(int b) throws IOException { 
    out.write(b); 
    tee.write(b); 
    } 

    @Override 
    public void write(byte[] b) throws IOException { 
    out.write(b); 
    tee.write(b); 
    } 

    @Override 
    public void write(byte[] b, int off, int len) throws IOException { 
    out.write(b, off, len); 
    tee.write(b, off, len); 
    } 

    @Override 
    public void flush() throws IOException { 
    out.flush(); 
    tee.flush(); 
    } 

    @Override 
    public void close() throws IOException { 
    out.close(); 
    tee.close(); 
    } 
} 

測試與上面的類具有以下

public static void main(String[] args) throws IOException { 
    TeeOutputStream out = new TeeOutputStream(System.out, System.out); 
    out.write("Hello world!".getBytes()); 
    out.flush(); 
    out.close(); 
} 

將打印Hello World!Hello World!

(注:覆蓋close()可以使用一些保健壽」 :)

+0

寫入應該同步。 –

+0

你可以簡化它。讓它擴展'FilterOutputStream';用super(out)構造它;擺脫'out'成員;並將所有'out.'引用改爲'super.'引用。 – EJP

+0

@Dave取決於用例。 EJP我更喜歡這種方式,但那也可以。 –

0
final ByteArrayOutputStream byteStream = new ByteArrayOutputStream(); 
final FileOutputStream fileStream = new FileOutputStream(new File("/tmp/somefile")); 
OutputStream outStream = new OutputStream() { 

    public void write(int b) throws IOException { 
     byteStream.write(b); 
     fileStream.write(b); 
    } 
}; 
outStream.write("Hello world".getBytes()); 
3

剛剛發現這個線程東陽我不得不面對同樣的問題。 如果有人希望看到我的解決方案(java7代碼):

package Core; 
import java.io.IOException; 
import java.io.OutputStream; 
import java.util.Iterator; 
import java.util.LinkedList; 
import java.util.List; 

public class MultiOutputStream extends OutputStream { 

private List<OutputStream> out; 

public MultiOutputStream(List<OutputStream> outStreams) { 

    this.out = new LinkedList<OutputStream>(); 

    for (Iterator<OutputStream> i = outStreams.iterator(); i.hasNext();) { 
     OutputStream outputStream = (OutputStream) i.next(); 

     if(outputStream == null){ 
      throw new NullPointerException(); 
     } 
     this.out.add(outputStream); 
    } 
} 

@Override 
public void write(int arg0) throws IOException { 

    for (Iterator<OutputStream> i = out.iterator(); i.hasNext();) { 
     OutputStream var = (OutputStream) i.next(); 

     var.write(arg0); 
    } 
} 

@Override 
public void write(byte[] b) throws IOException{ 

    for (Iterator<OutputStream> i = out.iterator(); i.hasNext();) { 
     OutputStream var = (OutputStream) i.next(); 

     var.write(b); 
    } 
} 

@Override 
public void write(byte[] b, int off, int len) throws IOException{ 

    for (Iterator<OutputStream> i = out.iterator(); i.hasNext();) { 
     OutputStream var = (OutputStream) i.next(); 

     var.write(b, off, len); 
    } 
} 

@Override 
public void close() throws IOException{ 

    for (Iterator<OutputStream> i = out.iterator(); i.hasNext();) { 
     OutputStream var = (OutputStream) i.next(); 

     var.close(); 
    } 
} 

@Override 
public void flush() throws IOException{ 

    for (Iterator<OutputStream> i = out.iterator(); i.hasNext();) { 
     OutputStream var = (OutputStream) i.next(); 

     var.flush(); 
    } 
} 

} 

做工精細,到目前爲止,僅僅測試了一些基本操作,例如從System.out Stream和2個PrintStreams設置一個MultiOutputStream,每個寫入一個單獨的日誌。 我用

System.setOut(multiOutputStream); 

寫信給我的終端屏幕和兩個木頭,工作沒有任何問題。

+0

我試着用你的代碼,但是它給了我一個編譯錯誤 - 類型System中的方法setOut(PrintStream)不適用於參數(MultiOutputStream) – Raj

相關問題