2011-11-02 18 views
25

मैं जादुई जावा वर्ग है कि मुझे कुछ इस तरह करने की अनुमति देगा के लिए देख रहा हूँ:दो 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 के लिए है। कोई विचार?

धन्यवाद!

उत्तर

2

अपना खुद का रोल करें, यह मूल रूप से मामूली है। ArrayList<OutputStream> या जो कुछ भी आप चाहते हैं उसे स्टोर करने के लिए आजकल जो कुछ भी लोकप्रिय है, उसे लिखें और write विधि उन सभी को लूप करने के लिए लिखें, प्रत्येक को लिखना।

+14

I/O में कुछ भी कभी तुच्छ नहीं है। भले ही ऐसा पहले ऐसा लगता है। –

+0

यह वास्तव में उन सभी को लिखने के सवाल का जवाब नहीं देता है। – Ataraxia

+0

@ZettaSuro "उन सभी पर लूप करने के लिए लेखन विधि लिखें, प्रत्येक को लिखना।" क्या आपको वास्तव में मेरे लिए 'लूप' लिखने की ज़रूरत है? – Kevin

14

बस अपना खुद का रोल करें। बिल्कुल कोई जादू नहीं है। Apache's TeeOutputStream का उपयोग करके आप मूल रूप से नीचे दिए गए कोड का उपयोग करेंगे। बेशक अपाचे कॉमन्स 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() यद्यपि कुछ देखभाल इस्तेमाल कर सकते हैं ':) beacause मैं एक ही समस्या का सामना करना पड़ा

+0

लिखना सिंक्रनाइज़ किया जाना चाहिए। –

+0

आप इसे सरल बना सकते हैं। इसे 'फ़िल्टरऑटपुटस्ट्रीम' बढ़ाएं; इसे 'सुपर (आउट)' के साथ बनाएं; 'आउट' सदस्य से छुटकारा पाएं; और 'सुपर' संदर्भों के सभी 'आउट' संदर्भों को बदलें। – EJP

+0

@ डेव उपयोग के मामले पर निर्भर करता है। ईजेपी मुझे यह बेहतर पसंद है, लेकिन यह भी काम करेगा। –

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 स्ट्रीम से एक मल्टीऑटपुटस्ट्रीम स्थापित करना और प्रत्येक प्रिंट को एक अलग लॉग में प्रिंट करना। मैं

System.setOut(multiOutputStream); 

इस्तेमाल किया मेरी टर्मिनल स्क्रीन और दो लॉग जो किसी भी समस्याओं के बिना काम करने के लिए लिखने के लिए।

+0

मैंने आपके कोड का उपयोग करने की कोशिश की, हालांकि यह मुझे संकलन त्रुटि दे रहा है - प्रकार सिस्टम में विधि सेटऑट (प्रिंटस्ट्रीम) तर्कों के लिए लागू नहीं है (मल्टीऑटपुटस्ट्रीम) – Raj

संबंधित मुद्दे