2012-07-12 73 views
0
private void readIncomingMessage() { 
    try { 
     StringBuilder builder = new StringBuilder(); 
     InputStream is = socket.getInputStream(); 
     int length = 1024; 
     byte[] array = new byte[length]; 
     int n = 0; 

     while ((n = is.read(array, n, 100)) != -1) { 
      builder.append(new String(array)); 

      if (checkIfComplete(builder.toString())) { 
       buildListItems(builder.toString(), null); 
       builder = new StringBuilder(); 
      } 
     } 

    } catch (IOException e) { 
     Log.e("TCPclient", "Something went wrong while reading the socket"); 
    } 
} 

嗨,,并添加到StringBuilder的

我想读每100个字节块流,这些字节转换为字符串,比看看是否有适合的字符串一定的条件。

但是,当我调试时,我看到该构建器的计数为3072.
而且我看到一个像(text,,,,,,,text,,,,,,text)
我该如何将文本添加到stringbuilder中?

THX :)

private void readIncomingMessage() { 
    try { 
     StringBuilder builder = new StringBuilder(); 
     InputStream is = socket.getInputStream(); 
     int length = 100; 
     byte[] array = new byte[length]; 
     int n = 0; 

     while ((n = is.read(array, 0, length)) != -1) { 
      builder.append(new String(array, 0, n)); 

      if (checkIfComplete(builder.toString())) { 
       buildListItems(builder.toString(), null); 
       builder = new StringBuilder(); 
      } 
     } 

    } catch (IOException e) { 
     Log.e("TCPclient", "Something went wrong while reading the socket"); 
    } 
} 

该解决方案并获得成功对我来说。 此解决方案的任何缺点?

+0

这并不一定是连续的100个字节的任何特定块将成功地转化为'String'的情况下... – 2012-07-12 15:04:12

回答

2

2个问题:

  1. 你需要转换的字节字符串时使用'n'值。具体来说,使用此String构造函数String(byte[] bytes, int offset, int length)
  2. 将字节转换为任意边界上的字符串时(如您所做的那样),可能会损坏多字节字符。如果'is'和从中读取字符,你最好把InputStreamReader放在最上面。
1

欲了解更多信息,请阅读文档read(byte[], int, int)new String(byte[])new String(byte[], int, int)

ň将持有读取最后一次读操作的字节数 - 而不是数读取的字节。如果您只想一次读取多达100个字节,则不需要1024字节的数组,而是100个字节。从字节数组创建字符串时,它会使用整个数组(即使只有一半可以通过读取来填充),除非您告诉它要使用的数组的哪一部分。像这样的东西应该工作,但仍有改进,你可以做:

private void readIncomingMessage() { 
    try { 
    StringBuilder builder = new StringBuilder(); 
    InputStream is = socket.getInputStream(); 
    int length = 100; 
    byte[] array = new byte[length]; 
    int pos = 0; 
    int n = 0; 

    while (pos != length && ((n = is.read(array, pos, length-pos)) != -1)) { 
     builder.append(new String(array, pos, n)); 
     pos += n; 
     if (checkIfComplete(builder.toString())) { 
      buildListItems(builder.toString(), null); 
      builder = new StringBuilder(); 
      pos = 0; 
     } 
    } 

} catch (IOException e) { 
    Log.e("TCPclient", "Something went wrong while reading the socket"); 
} 

}

+0

当然,也有多字节字符。您可能想使用'InputStreamReader#read(char [],int,int)'代替。 – 2012-07-12 15:15:36

相关问题