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

1

配列を文字列に変換し、replaceAll および trim 関数を使用して空の要素を削除することをお勧めします。

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

これには追加のライブラリは必要ありません。

于 2013-03-14T10:08:09.710 に答える
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 に答える
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 に答える