get Char Sequence from ByteBuffer - Java java.nio

Java examples for java.nio:ByteBuffer Char

Description

get Char Sequence from ByteBuffer

Demo Code

/*//from  w ww  . j  ava  2  s  .  c  om
 * Copyright (C) 2008-2010 Wayne Meissner
 *
 * This file is part of the JNR project.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *    http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
//package com.java2s;
import java.nio.ByteBuffer;

import java.nio.charset.*;

public class Main {
    public static CharSequence getCharSequence(ByteBuffer buf,
            Charset charset) {
        final ByteBuffer buffer = buf.slice();
        // Find the NUL terminator and limit to that, so the
        // StringBuffer/StringBuilder does not have superfluous NUL chars
        int end = indexOf(buffer, (byte) 0);
        if (end < 0) {
            end = buffer.limit();
        }
        buffer.position(0).limit(end);
        return charset.decode(buffer);
    }

    public static CharSequence getCharSequence(final ByteBuffer buf,
            final CharsetDecoder decoder) {
        final ByteBuffer buffer = buf.slice();
        // Find the NUL terminator and limit to that, so the
        // StringBuffer/StringBuilder does not have superfluous NUL chars
        int end = indexOf(buffer, (byte) 0);
        if (end < 0) {
            end = buffer.limit();
        }
        buffer.position(0).limit(end);
        try {
            return decoder.reset()
                    .onMalformedInput(CodingErrorAction.REPLACE)
                    .onUnmappableCharacter(CodingErrorAction.REPLACE)
                    .decode(buffer);
        } catch (CharacterCodingException ex) {
            throw new Error("Illegal character data in native string", ex);
        }
    }

    public static ByteBuffer slice(final ByteBuffer buffer,
            final int position) {
        final ByteBuffer tmp = buffer.duplicate();
        tmp.position(position);
        return tmp.slice();
    }

    public static ByteBuffer slice(final ByteBuffer buffer,
            final int position, final int size) {
        final ByteBuffer tmp = buffer.duplicate();
        tmp.position(position).limit(position + size);
        return tmp.slice();
    }

    public static int indexOf(ByteBuffer buf, byte value) {
        if (buf.hasArray()) {
            byte[] array = buf.array();
            int begin = buf.arrayOffset() + buf.position();
            int end = buf.arrayOffset() + buf.limit();
            for (int offset = 0; offset < end && offset > -1; ++offset) {
                if (array[begin + offset] == value) {
                    return offset;
                }
            }
        } else {
            int begin = buf.position();
            for (int offset = 0; offset < buf.limit(); ++offset) {
                if (buf.get(begin + offset) == value) {
                    return offset;
                }
            }
        }
        return -1;
    }

    public static int indexOf(ByteBuffer buf, int offset, byte value) {
        if (buf.hasArray()) {
            byte[] array = buf.array();
            int begin = buf.arrayOffset() + buf.position() + offset;
            int end = buf.arrayOffset() + buf.limit();
            for (int idx = 0; idx < end && idx > -1; ++idx) {
                if (array[begin + idx] == value) {
                    return idx;
                }
            }
        } else {
            int begin = buf.position();
            for (int idx = 0; idx < buf.limit(); ++idx) {
                if (buf.get(begin + idx) == value) {
                    return idx;
                }
            }
        }
        return -1;
    }
}

Related Tutorials