public static void write(ICharsetCodec cc, CharBuffer cb, IUnitChain unitChain) { final CharsetEncoder encoder = cc.getEncoder(); try { IUnit unit = Util.lastUnit(unitChain); ByteBuffer bb = unit.getByteBufferForWrite(); boolean flush = false; encoder.reset(); for (; ; ) { CoderResult cr = flush ? encoder.flush(bb) : encoder.encode(cb, bb, true); unit.size(bb.position() - unit.start()); if (cr.isOverflow()) { unit = Util.appendNewUnit(unitChain); bb = unit.getByteBufferForWrite(); continue; } if (!cr.isUnderflow()) cr.throwException(); if (flush) break; else flush = true; } } catch (CharacterCodingException e) { throw new RuntimeException(e); } finally { cc.releaseEncoder(encoder); } }