2008-09-24 13 views
9

क्या जावा में आउटपुट में इनपुट के लिए "पाइपिंग" इनपुट के लिए एक और संक्षिप्त/मानक मुहावरे (उदा।, एक जेडीके विधि) है?"पाइपिंग" के लिए जावा मुहावरे

 
public void pipe(Reader in, Writer out) { 
    CharBuffer buf = CharBuffer.allocate(DEFAULT_BUFFER_SIZE); 
    while(in.read(buf) >= 0) { 
     out.append(buf.flip()); 
     buf.clear(); 
    } 
} 

[संपादित करें] कृपया ध्यान दें Reader और Writerदिया जाता है। सही उत्तर दिखाएगा कि in और out कैसे लें और एक पाइप बनाएं (अधिमानतः 1 या 2 विधि कॉल के साथ)। मैं उत्तर स्वीकार करूंगा जहां in और outInputStream और OutputStream हैं (अधिमानतः/से Reader/Writer से रूपांतरण के साथ)। मैं उन उत्तरों को स्वीकार नहीं करूंगा जहां in या outउप-वर्गReader/InputStream या Writer/OutputStrem है।

+0

संभवतः डुप्लिकेट [एक आउटपुटस्ट्रीम में जावा इनपुटस्ट्रीम की सामग्री लिखने का आसान तरीका] (http://stackoverflow.com/questions/43157/easy-way-to-write-contents-of-a-java-inputstream -to-a-outputstream) –

उत्तर

10

अपाचे कॉमन्स प्रोजेक्ट से utilily methods है जो आपको वही करता है जो आपको चाहिए।

IOUtils.copy(in, out) आउटपुट में सभी इनपुट की एक बफरर्ड प्रतिलिपि करेगा। यदि आपके कोडबेस में एक से अधिक स्थान हैं जिसके लिए Stream या Reader/Writer हैंडलिंग की आवश्यकता है, IOUtils का उपयोग करना एक अच्छा विचार हो सकता है।

+0

वाह। अपाचे कॉमन्स वास्तव में एक प्रभावशाली प्रोजेक्ट है। इससे पहले कि मैं उन्हें नोटिस करता हूं, वे मेरे सभी खुजली खरोंच करते हैं। –

+0

अपाचे कॉमन्स के लिए +1 –

1

उसी पैकेज से java.io.PipedInputStream और PipedOutputStream, या PipedReader/PipedWriter पर एक नज़र डालें।

PipedInputStream का प्रलेखन से:

एक पहुंचाया इनपुट धारा एक पाइप उत्पादन धारा से जोड़ा जाना चाहिए; पाइप इनपुट इनपुट तब पाइप आउटपुट स्ट्रीम में जो भी डेटा बाइट लिखे जाते हैं प्रदान करता है। आम तौर पर, डेटा को एक थ्रेड द्वारा एक PipedInputStream ऑब्जेक्ट से पढ़ा जाता है और डेटा किसी अन्य थ्रेड द्वारा संबंधित PipedOutputStream पर लिखा जाता है। एक ही थ्रेड से दोनों ऑब्जेक्ट्स का उपयोग करने का प्रयास करने की अनुशंसा नहीं की जाती है, क्योंकि यह थ्रेड को डेडलॉक कर सकता है। पाइप इनपुट इनपुट में एक बफर होता है, जो सीमाओं के भीतर, लिखने के संचालन से पढ़ने के संचालन को कम करता है। एक पाइप टूटा हुआ कहा जाता है यदि कनेक्टेड पाइप आउटपुट स्ट्रीम में डेटा बाइट प्रदान करने वाला थ्रेड अब ज़िंदा नहीं है।

+0

क्या किसी दिए गए इनपुटस्ट्रीम (या रीडर) से एक PipedInputStream बनाने का कोई तरीका है? –

+0

मेरा मानना ​​है कि आप "नया पाइपड इनपुटस्ट्रीम (theInputStreamInstance)" (यानी, "एक PipedInputStream के साथ रैप इनपुटस्ट्रीम) जैसे कुछ कर सकते हैं। –

+0

क्षमा करें, मैंने देखा से पहले उछाल। :(ऐसा लगता है कि मौजूदा स्ट्रीम लेने और इसे चालू करने का कोई तरीका नहीं है एक पाइपड स्ट्रीम में। एक PipedInputStream को एक PipedOutputStream से बंधना होगा। यदि आप चाहते हैं, तो आप केवल इनपुट इनपुट से बाइट्स को एक PipedOutputStream में स्थानांतरित कर सकते हैं जो एक PipedInputStream से जुड़ा हुआ है। –

1

उपलब्ध एकमात्र अनुकूलन एनआईओ एपीआई में फ़ाइलChannels के माध्यम से है: Reads, Writes। जेवीएम डेटा को कर्नेल स्पेस में स्थानांतरित करने के बिना किसी फ़ाइल से डेटा को किसी गंतव्य चैनल पर स्थानांतरित करने के लिए इस कॉल को अनुकूलित कर सकता है। विवरण के लिए this article देखें।

+0

मैं रीडर, राइटर, इनपुटस्ट्रीम से फ़ाइलChannel कैसे प्राप्त करूं , या आउटपुटस्ट्रीम? –

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