سؤال

هل هناك مصطلح أكثر إيجازًا/قياسيًا (على سبيل المثال، طريقة JDK) لـ "توصيل" مدخلات إلى مخرجات في Java أكثر من ما يلي؟

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 وشكل أنبوبًا (يفضل أن لا يزيد عن استدعاء أسلوب واحد أو اثنين).سأقبل الإجابات حيث in و out هي InputStream و OutputStream (ويفضل أن يكون ذلك مع التحويل من/إلى Reader/Writer).لن أقبل الإجابات حيثما in أو out هو فئة فرعية ل Reader/InputStream أو Writer/OutputStrem.

هل كانت مفيدة؟

المحلول

IOUtils من مشروع Apache Commons لديه عدد من الأساليب النافعة أن تفعل بالضبط ما تحتاجه.

IOUtils.copy(in, out) سيتم تنفيذ نسخة مخزنة من كافة المدخلات إلى الإخراج.إذا كان هناك أكثر من مكان واحد في قاعدة التعليمات البرمجية الخاصة بك، فهذا يتطلب Stream أو Reader/Writer المعالجة، قد يكون استخدام IOUtils فكرة جيدة.

نصائح أخرى

نلقي نظرة على java.io.PipedInputStream و PipedOutputStream, ، أو قارئ الأنابيب/كاتب الأنابيب من نفس الحزمة.

من وثائق PipedInputStream :

يجب أن يكون تيار الإدخال عبر الأنابيب متصلاً بتدفق الإخراج عبر الأنابيب؛ثم يوفر دفق الإدخال عبر الأنابيب أي بايت من البيانات يتم كتابتها إلى دفق الإخراج عبر الأنابيب.عادةً، تتم قراءة البيانات من كائن PipedInputStream بواسطة مؤشر ترابط واحد وتتم كتابة البيانات إلى PipedOutputStream المقابل بواسطة مؤشر ترابط آخر.لا يوصى بمحاولة استخدام كلا الكائنين من مؤشر ترابط واحد، حيث قد يؤدي ذلك إلى توقف مؤشر الترابط.يحتوي تدفق الإدخال عبر الأنابيب على مخزن مؤقت، يفصل عمليات القراءة عن عمليات الكتابة، ضمن الحدود.يُقال إن الأنبوب مكسور إذا لم يعد الخيط الذي كان يوفر بايتات البيانات إلى دفق الإخراج المتصل عبر الأنابيب موجودًا.

التحسين الوحيد المتاح هو من خلال FileChannels في NIO API: يقرأ, يكتب.يمكن لـ JVM تحسين هذه المكالمة لنقل البيانات من ملف إلى قناة الوجهة دون الحاجة أولاً إلى نقل البيانات إلى مساحة kernel.يرى هذا المقال للتفاصيل.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top