CharsetEncoder

public static void main(String args) throws Exception {

  Charset charset = Charset.forName("Shift_JIS");
  CharsetEncoder encoder = charset.newEncoder().onMalformedInput(CodingErrorAction.REPORT);

  char input = new char[]{
    'a',
    'あ',
    0xff0d,
    0xff0d,
    'あ',
    'い',
  };
  CharBuffer in = CharBuffer.wrap(input);

  int n = (int)(in.remaining() * encoder.averageBytesPerChar());
  ByteBuffer out = ByteBuffer.allocate(n);
  if (n == 0) {
    return ;
  }
  int unmappable = 0;
  encoder.reset();
  for (;;) {
    CoderResult cr;
    if (in.hasRemaining()) {
      cr = encoder.encode(in, out, true);
    } else {
      cr = encoder.flush(out);
    }
    if (cr.isUnderflow()) {
      break;
    }
    if (cr.isOverflow()) {
      n *= 2;
      ByteBuffer o = ByteBuffer.allocate(n);
      out.flip();
      o.put(out);
      out = o;
      continue;
    }
    if (cr.isUnmappable()) {
      in.position(in.position() + 1);
      unmappable++;
      continue ;
    }
  }
  System.out.println(out.position() + unmappable * 2);
  out.flip();
  System.out.println(TextFilters.byteArrayToHex(out.array()));
  System.out.println(out.position());
  System.out.println(unmappable);
}