0

我正在逐字节读取数据。当我确定我有完整的消息时,我需要将它作为字符串传递给另一个函数。有些消息可能非常大,但大小经常变化。大家觉得哪种实现最有效:

public test class
{
   char[] buffer = new char[MAX_SIZE_7200];
   int bufferIndex = 0;
   void parseData(ArrayList<Byte> msg, length)
   {
       while (!msg.isEmpty())
       {
          buffer[bufferIndex++] = (char) msg.remove(0);
          if (isfullmessage)
          {
             parseData(new String(buffer, 0, bufferIndex);
             bufferIndex = 0;  //restart and continue parsing data
          }
       }
   }
 }

或者:

public test class
{
   List<Character> buffer = new ArrayList<Character>();
   int bufferIndex = 0;
   void parseData(ArrayList<Byte> msg, length)
   {
       while (!msg.isEmpty())
       {
          buffer.add((char) msg.remove(0));
          if (isfullmessage)
          {
              StringBuilder builder = new StringBuilder(buffer.size());
              for (Character ch: buffer)
              {
                  builder.append(ch);
              }
              parseData(builder.toString());
              buffer.clear();
          }
       }
   }
 }  

或者:

public test class
    {
       StringBuilder buffer = new StringBuilder();
       int bufferIndex = 0;
       void parseData(ArrayList<Byte> msg, length)
       {
           while (!msg.isEmpty())
           {
              buffer.append((char) msg.remove(0));
              if (isfullmessage)
              {                  
                  parseData(builder.toString());
                  buffer.clear();  //some stringbuilder clear function
              }
           }
       }
     }  

还是有更有效的方法。请注意,我的变量在函数范围之外保存了我完成的消息,因为我可能会处理不包含完整消息的数据,并且可能需要多次执行函数来获取完整消息并对其进行处理。

4

3 回答 3

9

使用StringBuilder。它支持一次添加一个字符,根据需要扩展容量,并且可以重置以进行重用。

于 2012-12-12T18:58:53.563 回答
0

我认为这取决于您的消息的平均长度。对于更“完整”的消息,char 将是更好的选择,因为它的元素类型

对于稀疏的情况,列表模板会更好,因为内存消耗会更低,尽管有对象表示的开销

于 2012-12-12T19:00:27.680 回答
0

您通过在循环中删除此 ArrayList 的第一个元素来迭代 ArrayList msg 的元素。ArrayList 将其所有元素存储在一个数组中。删除第一个元素很慢,因为需要复制数组中的所有元素(第一个元素除外)。

因此,最大的开销可能不是在数组中设置字符或将字符附加到 StringBuilder,但最大的开销可能是对 msg.remove(0) 的重复调用。

您可以使用以下方法解决此问题:

int index = 0;
while (index < msg.length()) {
    buffer[bufferIndex++] = (char) msg.get(index);
    index++;
    // etc.
}
于 2012-12-15T11:05:26.227 回答