سؤال

وأنا محاولة للحصول على تيار من الأحداث XML عبر قناة جافا NIO. أنا جديدة على حد سواء NIO وستاكس التوزيع، لذلك يمكن أن يكون من السهل جدا تطل شيء:)

لقد أدى بحثي لي أن العديد من SAX وتطبيقات ستاكس، ولكن يبدو انهم جميعا للعمل على InputStreams وInputSources - وليس القنوات NIO. وكانت أقرب المحاولتين لقد جعلت للحصول على InputStream من القناة وإنشاء PipedInputStream:

// method 1
PipedOutputStream out = new PipedOutputStream();
InputStream in = new PipedInputStream(out);
PrintWriter writer = new PrintWriter(out);

//method 2
InputStream in = channel.socket().getInputStream()
//method 3
IputStream in = Channels.newInputStream(channel);

وتليها:

XMLStreamReader xmlStreamReader = XMLInputFactory.newInstance()
        .createXMLStreamReader(in);
//...

عند استخدام رمز أعلاه مع أسلوب 1، فإنه يمنع على خط createXMLStreamReader. عندما يتم استخدام أساليب 2/3، على الفور رمي IllegalBlockingModeException (أنا لا أفهم لماذا). ربما هناك حاجة إلى نهج جديد؟

وهدفي هو أن يكون الخادم غير مؤمن اختيار => قبول البيانات حرف من عميل => تحليل لأحداث XML باستخدام ترميز معينة => توجيه هذا الكائن الحدث إلى موضوع آخر لمعالجة => والعودة إلى اختيار.

وهكذا أنا تطل على شيء ما، أم أن هناك طريقة أفضل والتي يمكن استخدامها؟ إذا كان الأمر كذلك ماذا؟

وشكرا!

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

المحلول

هل أنت متأكد أنك بحاجة إلى استخدام NIO؟ قد لا تقدم فوائد النسبية متوقعا في الأصل:

وبول Tyma: قتل أسطورة من فضلك. NIO هو لا أسرع من IO

وبول Tyma: خوادم الكتابة جافا متعددة مؤشرات الترابط - ماذا يكون العمر هو الجديدة

ومكدس تظهر فيها داخل createXMLStreamReader () فإنه يتم حظر يمكن أن تساعد، لكنها ربما يتصرف كما تم تصميمها. إذا تم تصميمه للعمل ضد InputStreams التي دائما إما (1) إعطاء المبلغ المتوقع من البيانات؛ (2) الغاية؛ أو (3) كتلة، فإنه لن تتصرف تلقائيا بطريقة (عادة ما تكون أكثر تعقيدا وجليل) التي يمكن أن يعود بعد قراءة أي كمية المدخلات غير مكتملة، من دون الكثير من إعادة صياغة عميقة.

نصائح أخرى

ولقد بدأت أيضا نظروا حولهم، وأيضا لاستخدام الخادم XMPP. لقد نظروا حولهم ويبدو أن ليس هناك سوى تطبيق واحد الذي يتعهد بدعم بظاهرة: آلتو HTTP: // الويكي. fasterxml.com/AaltoHome

ولكن يبدو أنها قد صدر يصل إلى الإصدار 0.9.5، مارس 2009. لذلك، وأنا لست متأكدا من مدى الحفاظ عليه هو، ولكن هذا قد يكون نقطة انطلاق جيدة. ما لم تتمكن من إقناع مشروع أكبر (ربما Woodstox)، لإعادة صياغة بعض الطبقات الداخلية من أجل دعم NIO.

وتحتاج إلى استخدام فئة java.nio.channels.Channels فائدة.

ReadableByteChannel ch = //...
InputStream in = Channels.newInputStream(ch);

وقد تحتاج لتكوين قناة مأخذ أن يكون الحجب.

SelectableChannel ch = //...
ch.configureBlocking(true);

وهذا يعني أنك لن تكون قادرة على القيام غير مؤمن I / O.

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