当前位置: 首页 > 面试题库 >

Java:将字符串与ByteBuffer相互转换以及相关问题

扈瑞
2023-03-14
问题内容

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

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对象每次转换完成时间。我需要同步这些方法吗?在字符串和ByteBuffer之间进行转换的更好方法?谢谢!


问题答案:

查看CharsetEncoderCharsetDecoderAPI描述-
您应该按照 特定的方法调用顺序进行操作, 以避免出现此问题。例如,对于CharsetEncoder

  1. 通过reset方法重置编码器,除非以前未使用过;
  2. encode只要可能有其他输入可用,就调用该方法零次或多次,并false为endOfInput自变量传递并填充输入缓冲区,并在两次调用之间刷新输出缓冲区;
  3. encode最后一次调用该方法,传递true给endOfInput参数。然后
  4. 调用该flush方法,以便编码器可以将任何内部状态刷新到输出缓冲区。

顺便说一句,这是我在NIO上使用的相同方法,尽管我的一些同事在知道仅使用ASCII的情况下将每个char直接转换为一个字节,我想这可能更快。



 类似资料:
  • 问题内容: 这是将ByteBuffer转换为String的正确方法吗? 我问的原因是,这看起来太简单了,而其他方法,例如Java:在ByteBuffer和ByteBuffer之间来回转换字符串以及相关的问题看起来却更加复杂。 问题答案: 编辑(2018): @xinyongCheng编辑的同级答案是一种更简单的方法,应该被接受。 如果您知道字节在平台的默认字符集中,则您的方法将是合理的。在您的示例

  • Python3 实例 以下代码用于实现ASCII码与字符相互转换: 实例(Python 3.0+)# Filename : test.py # author by : www.runoob.com # 用户输入字符 c = input("请输入一个字符: ") # 用户输入ASCII码,并将输入的数字转为整型 a = int(input("请输入一个ASCII码: ")) print( c + "

  • 本文向大家介绍Java Base64位编码与String字符串的相互转换,Base64与Bitmap的相互转换实例代码,包括了Java Base64位编码与String字符串的相互转换,Base64与Bitmap的相互转换实例代码的使用技巧和注意事项,需要的朋友参考一下 首先是网上大神给的类 然后是我经过2次封装的类,注释很清楚,拿过去直接用就行 以上所述是小编给大家介绍的Java Base64位

  • 本文向大家介绍js数组与字符串的相互转换方法,包括了js数组与字符串的相互转换方法的使用技巧和注意事项,需要的朋友参考一下 熟悉js的朋友很多都遇到过js的数组与字符串相互转换的情况,本文就此作一简单介绍,示例如下: 一、数组转字符串 需要将数组元素用某个字符连接成字符串,示例代码如下: 二、字符串转数组 实现方法为将字符串按某个字符切割成若干个字符串,并以数组形式返回,示例代码如下:

  • 本文向大家介绍JS中对象与字符串的互相转换详解,包括了JS中对象与字符串的互相转换详解的使用技巧和注意事项,需要的朋友参考一下 在使用 JSON2.JS 文件的 JSON.parse(data) 方法时候,碰到了问题: throw new SyntaxError('JSON.parse'); 查询资料,大概意思如下: JSON.parse方法在遇到不可解析的字符串时,会抛出SyntaxError异

  • 本文向大家介绍Java日期时间以及日期相互转换,包括了Java日期时间以及日期相互转换的使用技巧和注意事项,需要的朋友参考一下 Java日期时间,以及相互转化,供大家参考,具体内容如下 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持呐喊教程。