¿Es este un enfoque correcto para convertir ByteBuffer a String de esta manera,
String k = "abcd";
ByteBuffer b = ByteBuffer.wrap(k.getBytes());
String v = new String(b.array());
if(k.equals(v))
System.out.println("it worked");
else
System.out.println("did not work");
La razón por la que pregunto es que esto parece demasiado simple, mientras que otros enfoques como https://stackoverflow.com/questions/1252468/java-converting-string-to-and-from-bytebuffer-and-associated-problems parece más complejo.
EDIT (2018): La respuesta editada del hermano de @xinyongCheng es un enfoque más simple, y debería ser la respuesta aceptada.
Tu enfoque sería razonable si supieras que los bytes están en el conjunto de caracteres por defecto de la plataforma. En su ejemplo, esto es cierto porque k.getBytes()
devuelve los bytes en el conjunto de caracteres por defecto de la plataforma.
Más frecuentemente, querrá especificar la codificación. Sin embargo, hay una forma más sencilla de hacerlo que la pregunta que has enlazado. La API de cadenas proporciona métodos que convierten entre una cadena y una matriz de bytes[] en una codificación determinada. Estos métodos sugieren el uso de CharsetEncoder/CharsetDecoder *"cuando se requiere más control sobre el proceso de decodificación [encoding].".
Para obtener los bytes de una Cadena en una codificación particular, puedes usar un método hermano getBytes():
byte[] bytes = k.getBytes( StandardCharsets.UTF_8 );
Para poner los bytes con una codificación particular en una Cadena, puedes usar un constructor de Cadena diferente:
String v = new String( bytes, StandardCharsets.UTF_8 );
Tenga en cuenta que ByteBuffer.array()
es una operación opcional. Si has construido tu ByteBuffer con un array, puedes usar ese array directamente. De lo contrario, si quieres estar seguro, utiliza ByteBuffer.get(byte[] dst, int offset, int length)
para obtener bytes del buffer en un array de bytes.
Sólo quería señalar que no es seguro asumir que ByteBuffer.array() siempre funcionará.
byte[] bytes;
if(buffer.hasArray()) {
bytes = buffer.array();
} else {
bytes = new byte[buffer.remaining()];
buffer.get(bytes);
}
String v = new String(bytes, charset);
Normalmente buffer.hasArray() siempre será verdadero o falso dependiendo de tu caso de uso. En la práctica, a no ser que realmente quieras que funcione en cualquier circunstancia, es seguro optimizar la rama que no necesitas. Pero el resto de las respuestas pueden no funcionar con un ByteBuffer que haya sido creado mediante ByteBuffer.allocateDirect().