2

我有一个字符数组,一次最多可以容纳 50000 个字符。该数组的内容来自套接字连接。但是,不能保证此字符缓冲区不会有任何空元素。然后我需要将此字符数组转换为字符串(例如 new String(buffer);)。我的问题是,每当我从套接字收到一个不是 50000 长的缓冲区时,如何从这个 char 数组或这个字符串中删除剩余的或空的元素?如果没有,您建议的最有效方法是什么?

/这是当前的实现/

private BufferedReader is;

//Other code    

public String readBufferUpdate() throws IOException {
    char[] buffer =new char[50000];
    is.read(buffer);
    return new String(buffer);
}

////// 这是一个使用 ByteArrayOutputStream 的实现

public String readAuth() throws IOException {
        int s;
        ByteArrayOutputStream bao = new ByteArrayOutputStream();
        while ((s = is.read()) != -1) {
            bao.write(s);
            if (!is.ready())
                break;
        }
        if (s == -1) {
            return null;
        }
        String result = bao.toString();
        return result;
    }

当我需要读取大量数据时,此实现非常慢。

- - - - - - - - -编辑

(例如,服务器向我发送数据,但它可能并不总是 50000 长字节,而是 32822 长字节,那么我需要删除剩余的数组元素)

4

5 回答 5

4

从缓冲区中读取的正确方法InputStream如下。

public String readBufferUpdate() throws IOException {
    char[] buffer =new char[50000];
    int bytesRead = is.read(buffer, 0, buffer.length);
    return new String(buffer, 0, bytesRead);
}

在这里,您is.read()返回已读入的字节数bytesRead。只有那么多字节从缓冲区复制到String.

于 2013-03-14T10:28:03.463 回答
1

类似的东西也应该起作用:

public String readBufferUpdate() throws IOException {
  char[] buffer =new char[50000];
  is.read(buffer);

  return new String(ArrayUtils.removeElements(buffer, ''));
}

此处的文档:http: //commons.apache.org/proper/commons-lang/javadocs/api-3.1/org/apache/commons/lang3/ArrayUtils.html#removeElements(char[], char...)

于 2013-03-14T10:06:45.503 回答
1

我建议将数组转换为字符串并使用 replaceAll 和 trim 函数删除空元素。

String bufferString = new String(buffer).trim().replaceAll(" ", "");

这不需要任何额外的库。

于 2013-03-14T10:08:09.710 回答
0
StringWriter writer = new StringWriter();
IOUtils.copy(inputStream, writer, encoding);
String theString = writer.toString();

或者

String theString = IOUtils.toString(inputStream, "UTF-8");
于 2013-03-14T09:57:35.400 回答
-1

改用数组列表!这将允许您删除数组元素,而标准数组包没有这样做的“简单”方法。

ArrayList buffer = new ArrayList (50000)

buffer.add(x)

buffer.remove(x)

http://docs.oracle.com/javase/6/docs/api/java/util/ArrayList.html

注意:在 ArrayList 上实例化一个类型

于 2013-03-14T10:00:47.177 回答