الحصول على OutputStream إلى سلسلة
سؤال
ما هي أفضل طريقة لإخراج أنبوب من 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
.