从字符数组中删除所有空元素

我有一个字符数组,一次最多可以容纳50000个字符。 此数组的内容来自套接字连接。 但是,不保证此字符缓冲区不会包含任何空元素。 然后我需要将此字符数组转换为String(例如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个长字节然后我需要删除左侧数组元素)

从缓冲区中的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字节bytesRead 。 只有那么多字节从缓冲区复制到String

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

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

这不需要任何其他库。

 StringWriter writer = new StringWriter(); IOUtils.copy(inputStream, writer, encoding); String theString = writer.toString(); 

要么

 String theString = IOUtils.toString(inputStream, "UTF-8"); 

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

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

Doc在这里: http : //commons.apache.org/proper/commons-lang/javadocs/api-3.1/org/apache/commons/lang3/ArrayUtils.html#removeElements(char [],char …)

改为使用数组列表! 这将允许您删除数组元素,而标准数组包没有“简单”的方法来执行此操作。

ArrayList buffer = new ArrayList(50000)

buffer.add(x)的

buffer.remove(x)的

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

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