Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从字符数组中删除所有空元素_Java_Sockets - Fatal编程技术网

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

Java 从字符数组中删除所有空元素,java,sockets,Java,Sockets,我有一个一次最多可以容纳50000个字符的字符数组。此数组的内容通过套接字连接发送。但是,不能保证此字符缓冲区不会有任何空元素。然后我需要将这个字符数组转换成一个字符串(例如,新字符串(缓冲区);)。我的问题是,每当我从套接字接收到长度不超过50000的缓冲区时,如何从这个字符数组或字符串中删除剩余的或空的元素?如果没有,你建议的最有效的方法是什么 /下面是当前的实现/ //////这是一个使用ByteArrayOutputStream的实现 public String readAuth() t

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

/下面是当前的实现/

//////这是一个使用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长字节,然后我需要删除剩余的数组元素)


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

ArrayList缓冲区=新的ArrayList(50000)

buffer.add(x)

缓冲区。删除(x)


注意:在ArrayList上实例化一个类型,类似的方法也可以:

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

  return new String(ArrayUtils.removeElements(buffer, ''));
}
文件在此:

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

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

这不需要任何附加库。

从缓冲区中的
输入流
读取的正确方法如下

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
的字节数。只有这么多字节从缓冲区复制到
字符串

为什么要将其读入数组,直接读入字符串?我无法使用.readLine()函数实现此目的。我必须使用is.read()并将内容分配给数组。使用replaceAll方法会使trim方法多余。顺便说一句,它不会使trim方法多余-从replaceAll将从char[]内部移除的末端移除trim。
public String readBufferUpdate() throws IOException {
  char[] buffer =new char[50000];
  is.read(buffer);

  return new String(ArrayUtils.removeElements(buffer, ''));
}
String bufferString = new String(buffer).trim().replaceAll(" ", "");
public String readBufferUpdate() throws IOException {
    char[] buffer =new char[50000];
    int bytesRead = is.read(buffer, 0, buffer.length);
    return new String(buffer, 0, bytesRead);
}