leftBytes

文字から指定したバイト数の文字を切り出す。
マルチバイト文字の途中のバイトでは切らない。

System.out.println(leftBytes("あいうえお", 3));
=> "あ"

public static String leftBytes(String text, int bytes) {
    // file.encodingというプロパティは環境によっては使えない可能性がある。
    // System#getProperties()のjavadocにあるシステムプロパティの一覧には記載がないのだ。
    // ただ、InputStreamReaderのデフォルトコンストラクタはこれを使ってエンコードを決めているのでそれに倣った。
    // sunの実装vmであれば問題ないはず。
    return leftBytes(text, bytes, System.getProperty("file.encoding"));
}

public static String leftBytes(String text, int bytes, String charset) {
    CharBuffer src = CharBuffer.wrap(text.toCharArray());
    Charset.forName(charset).newEncoder().encode(src, ByteBuffer.allocate(bytes), true);
    return src.flip().toString();
}

いろいろぐぐってみると下記のようなコードを見かけるが、flush()の必然性がわからない。
ステップ実行で処理を追ってみても何もしてない気がするが・・・

CharsetEncoder encoder = Charset.forName(charset).newEncoder();
ByteBuffer buffer = ByteBuffer.allocate(bytes);
CoderResult result = encoder.encode(src, buffer, true);
if (result.isUnderFlow()) {
    encoder.flush(buffer);
}
return src.flip().toString();