سؤال

ما هي أفضل طريقة لإخراج أنبوب من java.io.OutputStream إلى سلسلة في جافا؟

ويقول لدي الأسلوب:

  writeToStream(Object o, OutputStream out)

والذي يكتب بيانات معينة من الكائن إلى تيار معين. ومع ذلك، أريد أن أحصل على هذا الإخراج إلى سلسلة بسهولة ممكن.

وأنا النظر في كتابة فئة مثل هذا (غير مجربة):

class StringOutputStream extends OutputStream {

  StringBuilder mBuf;

  public void write(int byte) throws IOException {
    mBuf.append((char) byte);
  }

  public String getString() {
    return mBuf.toString();
  }
}

ولكن هناك طريقة أفضل؟ أريد فقط لتشغيل اختبار!

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

المحلول

وأود أن استخدام ByteArrayOutputStream. وعلى النهاية يمكنك الاتصال على:

new String( baos.toByteArray(), codepage );

وأو أفضل

baos.toString( codepage );

لمنشئ سلسلة من codepage يمكن أن يكون سلسلة أو مثيل <لأ href = "http://docs.oracle.com/javase/7/docs/api/java/nio/charset/Charset.html" يختلط = "noreferrer"> java.nio.charset.Charset . قيمة ممكنة هي java.nio.charset .StandardCharsets.UTF_8 .

ووtoString طريقة تقبل سوى سلسلة كمعلمة codepage (الوقوف جافا 8).

نصائح أخرى

وأنا أحب مكتبة أباتشي العموم IO. نلقي نظرة على نسخته من <لأ href = "https://commons.apache.org/proper/commons-io/javadocs/api-2.5/org/apache/commons/io/output/ByteArrayOutputStream.html" يختلط = "نوفولو noreferrer"> ByteArrayOutputStream ، التي لديها طريقة toString(String enc) وكذلك toByteArray(). باستخدام مكونات القائمة وموثوق بها مثل مشروع العموم يتيح الشفرة يكون أصغر وأسهل لتوسيع وإعادة توظيفها.

وهذا عمل جيد

    OutputStream output = new OutputStream()
    {
        private StringBuilder string = new StringBuilder();
        @Override
        public void write(int b) throws IOException {
            this.string.append((char) b );
        }

        //Netbeans IDE automatically overrides this toString()
        public String toString(){
            return this.string.toString();
        }
    };

واستدعاء الأسلوب = >> marshaller.marshal( (Object) toWrite , (OutputStream) output);

وبعد ذلك لطباعة سلسلة أو الحصول عليه فقط مرجع "الناتج" تيار نفسها على سبيل المثال، لطباعة سلسلة من وحدة التحكم = >> System.out.println(output);

ومعلوماتك: دعوتي طريقة marshaller.marshal(Object,Outputstream) هو للعمل مع XML. لا يهم في هذا الموضوع.

وهذا هو الإسراف غاية لاستخدام productional، هل هناك طريقة الكثير من التحويل وكانت فضفاضة قليلا. هذا تم ترميز فقط لأثبت لك أنه من الممكن تماما لخلق OuputStream العرف وإخراج السلسلة. لكن اذهبوا طريقة Horcrux7 وكل شيء جيد مع مجرد مكالمتين الأسلوب.

والعالم يعيش في يوم آخر ....

وهنا ما انتهى به:

Obj.writeToStream(toWrite, os);
try {
    String out = new String(os.toByteArray(), "UTF-8");
    assertTrue(out.contains("testString"));
} catch (UnsupportedEncondingException e) {
    fail("Caught exception: " + e.getMessage());
}

وأين نظام التشغيل هو ByteArrayOutputStream.

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