我有一个字符数组,一次最多可容纳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个长字节然后我需要删除左侧数组元素)
答案 0 :(得分:3)
从缓冲区中的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()
返回已将{1}}读入的字节数。只有那么多字节从缓冲区复制到bytesRead
。
答案 1 :(得分:1)
这样的事情也应该起作用:
public String readBufferUpdate() throws IOException {
char[] buffer =new char[50000];
is.read(buffer);
return new String(ArrayUtils.removeElements(buffer, ''));
}
答案 2 :(得分:1)
我建议将数组转换为字符串,并使用replaceAll和trim函数删除空元素。
String bufferString = new String(buffer).trim().replaceAll(" ", "");
这不需要任何其他库。
答案 3 :(得分:0)
StringWriter writer = new StringWriter();
IOUtils.copy(inputStream, writer, encoding);
String theString = writer.toString();
OR
String theString = IOUtils.toString(inputStream, "UTF-8");
答案 4 :(得分:-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上实例化一个类型