Code example for CharsetDecoder

Methods: decodemaxCharsPerByteonMalformedInputonUnmappableCharacterreset

0
 
    @SuppressWarnings("ObjectToString") 
    public static String decodeString(ByteBuffer src, Charset charset)
    { 
        CharsetDecoder decoder = getDecoder(charset);
        CharBuffer dst = CharBuffer.allocate((int) ((double) src.remaining() * decoder.maxCharsPerByte()));
        try { 
            CoderResult cr = decoder.decode(src, dst, true);
            if (!cr.isUnderflow()) {
                cr.throwException();
            } 
            cr = decoder.flush(dst);
            if (!cr.isUnderflow()) {
                cr.throwException();
            } 
        } 
        catch (CharacterCodingException x) {
            throw new IllegalStateException(x);
        } 
        return dst.flip().toString();
    } 
 
    private static final ThreadLocal<Map<Charset, CharsetDecoder>> decoders = new ThreadLocal<Map<Charset, CharsetDecoder>>()
    { 
        @Override 
        protected Map<Charset, CharsetDecoder> initialValue() 
        { 
            return new IdentityHashMap<Charset, CharsetDecoder>(); 
        } 
    }; 
 
    /** 
     * Returns a cached thread-local {@link java.nio.charset.CharsetDecoder} for the specified <tt>charset</tt>. 
     */ 
    private static CharsetDecoder getDecoder(Charset charset)
    { 
        checkNotNull(charset, "charset is null");
 
        Map<Charset, CharsetDecoder> map = decoders.get();
        CharsetDecoder d = map.get(charset);
        if (d != null) {
            d.reset();
            d.onMalformedInput(CodingErrorAction.REPLACE);
            d.onUnmappableCharacter(CodingErrorAction.REPLACE);
            return d;
        } 
 
        d = charset.newDecoder();
        d.onMalformedInput(CodingErrorAction.REPLACE);
        d.onUnmappableCharacter(CodingErrorAction.REPLACE);
        map.put(charset, d);
        return d;
    } 
}