printf() وظيفة في جافا جنبا إلى جنب مع لا أستطيع أو شيء من هذا القبيل

StackOverflow https://stackoverflow.com/questions/407026

  •  03-07-2019
  •  | 
  •  

سؤال

أنا في حيرة قليلا هنا.

وأود أن تفعل شيئا من هذا القبيل:

  1. خلق نوع من المخزن المؤقت أستطيع أن أكتب في
  2. مسح المخزن المؤقت
  3. استخدام printf () الدالة عدة مرات إلى إلحاق الكثير من الأشياء في المخزن المؤقت استنادا إلى بعض حسابات معقدة أريد فقط أن تفعل مرة واحدة
  4. استخدام محتويات المخزن المؤقت وطباعته عدة PrintStream الكائنات
  5. كرر الخطوات من 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();
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top