首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Java:字符串与ByteBuffer之间的相互转换以及相关问题

Java:字符串与ByteBuffer之间的相互转换以及相关问题
EN

Stack Overflow用户
提问于 2009-08-09 22:20:19
回答 1查看 152.6K关注 0票数 87

我将Java NIO用于套接字连接,并且我的协议是基于文本的,因此我需要能够在将字符串写入SocketChannel之前将其转换为ByteBuffers,并将传入的ByteBuffers转换回String。目前,我使用的是以下代码:

代码语言:javascript
复制
public static Charset charset = Charset.forName("UTF-8");
public static CharsetEncoder encoder = charset.newEncoder();
public static CharsetDecoder decoder = charset.newDecoder();

public static ByteBuffer str_to_bb(String msg){
  try{
    return encoder.encode(CharBuffer.wrap(msg));
  }catch(Exception e){e.printStackTrace();}
  return null;
}

public static String bb_to_str(ByteBuffer buffer){
  String data = "";
  try{
    int old_position = buffer.position();
    data = decoder.decode(buffer).toString();
    // reset buffer's position to its original so it is not altered:
    buffer.position(old_position);  
  }catch (Exception e){
    e.printStackTrace();
    return "";
  }
  return data;
}

这在大多数情况下都是有效的,但我怀疑这是否是完成此转换的每个方向的首选(或最简单)方法,或者是否有其他方法可以尝试。偶尔,看起来是随机的,对encode()decode()的调用会抛出一个java.lang.IllegalStateException: Current state = FLUSHED, new state = CODING_END异常,或者类似的异常,即使我在每次转换时都使用一个新的ByteBuffer对象。我需要同步这些方法吗?有没有更好的方法在字符串和ByteBuffers之间进行转换?谢谢!

EN

回答 1

Stack Overflow用户

发布于 2015-06-16 06:45:04

除非情况有所改变,否则你最好选择

代码语言:javascript
复制
public static ByteBuffer str_to_bb(String msg, Charset charset){
    return ByteBuffer.wrap(msg.getBytes(charset));
}

public static String bb_to_str(ByteBuffer buffer, Charset charset){
    byte[] bytes;
    if(buffer.hasArray()) {
        bytes = buffer.array();
    } else {
        bytes = new byte[buffer.remaining()];
        buffer.get(bytes);
    }
    return new String(bytes, charset);
}

通常,buffer.hasArray()要么总是真,要么总是假,这取决于您的用例。在实践中,除非你真的希望它在任何情况下都能工作,否则优化掉你不需要的分支是安全的。

票数 44
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1252468

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档