printf() وظيفة في جافا جنبا إلى جنب مع لا أستطيع أو شيء من هذا القبيل
سؤال
أنا في حيرة قليلا هنا.
وأود أن تفعل شيئا من هذا القبيل:
- خلق نوع من المخزن المؤقت أستطيع أن أكتب في
- مسح المخزن المؤقت
- استخدام printf () الدالة عدة مرات إلى إلحاق الكثير من الأشياء في المخزن المؤقت استنادا إلى بعض حسابات معقدة أريد فقط أن تفعل مرة واحدة
- استخدام محتويات المخزن المؤقت وطباعته عدة
PrintStream
الكائنات - كرر الخطوات من 2-4 حسب الضرورة
على سبيل المثال:
SuperBuffer sb = new SuperBuffer();
/* SuperBuffer is not a real class, so I don't know what to use here */
PrintStream[] streams = new PrintStream[N];
/* ... initialize this array to several streams ... */
while (!done)
{
sb.clear();
sb.printf("something %d something %d something %d",
value1, value2, value3);
if (some_complicated_condition())
sb.printf("something else %d something else %d", value4, value5);
/* ... more printfs to sb ... */
for (PrintStream ps : streams)
ps.println(sb.getBuffer());
}
يبدو لف PrintWriter حول StringWriter سوف أفعل ما أريد من أجل sb
الكائن أعلاه ، إلا انه لا clear()
الأسلوب.أعتقد أنني يمكن أن يخلق جديد PrintWriter و StringWriter كائن في كل مرة خلال الحلقة ، ولكن يبدو أن مثل الألم.(في بلدي رمز حقيقي أفعل هذا في عدة أماكن ، ليس فقط مرة واحدة في حلقة واحدة...)
لقد استخدمت أيضا java.nio.CharBuffer
وغيرها من NIO مخازن كثيرا, و يبدو نهجا واعدا ، ولكن لست متأكدا كيف يمكن أن التفاف عليها مع كائن من شأنها أن تعطي لي printf()
وظائف.
أي نصيحة ؟
المحلول
آه:أعتقد أنني قد حصلت عليه.على Formatter
فئة لديها format()
الأسلوب الذي تحب printf()
, و أنها يمكن بناؤها إلى التفاف حول أي نوع من الكائن الذي ينفذ Appendable
. CharBuffer
تنفذ Appendable
, وأنا يمكن أن clear()
أو قراءة محتويات CharBuffer
حسب الضرورة.
نصائح أخرى
لماذا هذا الألم إلى خلق جديد العازلة في الحلقة ؟ هذا ما جمع القمامة هناك.ستكون هناك حاجة إلى أن توزيع جديد تحت الأغطية في واضحة() على أي حال.
إذا كنت تريد حقا أن تنفيذ SuperBuffer ، فإنه لن يكون من الصعب على الإطلاق.مجرد إنشاء مجموعة فرعية من OutputStream واضحة (وظيفة) ، ثم لف PrintStream حول ذلك.هل يمكن استخدام لا أستطيع في السوبر العازلة إذا أردت.
النظر في إنشاء فئة فرعية ، TeeOutputStream ، OutputStream (أو الكاتب) الذي يحمل مجموعة من الجداول المندوبين لهم.ثم التفاف تيار الخاصة بك مع PrintStream (أو PrintWriter) فقط اتصل printf() على ذلك.لا حاجة temp العازلة أو أي شيء:
PrintStream[] streams = new PrintStream[N]; // any output streams really
PrintStream ps = new PrintStream(new TeeOutputStream(streams));
while (!done)
{
ps.printf("something %d something %d something %d",
value1, value2, value3);
if (some_complicated_condition())
ps.printf("something else %d something else %d", value4, value5);
ps.println();
}