2013-03-14 2 views
2

У меня есть массив символов, который может содержать максимум 50000 символов за раз. Содержимое этого массива происходит через соединения сокетов. Однако не гарантируется, что этот буфер символов не будет иметь никаких пустых элементов. Затем мне нужно преобразовать этот массив символов в String (например, новый String (buffer);). Мой вопрос: всякий раз, когда я получаю буфер из сокета длиной не 50000, как вы удаляете оставшиеся или пустые элементы из этого массива символов или этой строки? Если нет, то какой самый эффективный способ вы бы предложили?Удаление всех пустых элементов из массива символов

/Вот текущая реализация/

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

Почему вы читаете его в массиве, читаете его прямо в строке? –

+0

Я не могу использовать для этого функцию .readLine(). Мне нужно использовать is.read() и назначить содержимое массиву – 2013-03-14 09:56:57

ответ

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() возвращает количество байт, которые были считаны в bytesRead. Только то, что многие байты копируются из буфера в String.

+0

спасибо, это то, что я искал. – 2013-03-14 20:27:24

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

ИЛИ

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

использовать список массивов вместо этого! Это позволит удалить элементы массива, тогда как стандартный пакет массивов не имеет «простого» способа сделать это.

ArrayList buffer = new ArrayList (50000)

buffer.add(x)

buffer.remove(x)

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

Примечание: экземпляр типа на ArrayList

1

Я бы предложил преобразовать массив в строку и использовать функции replaceAll и trim, чтобы удалить пустые элементы.

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

Это не требует дополнительных библиотек.

+0

Использование метода replaceAll делает метод trim избыточным, кстати. –

Смежные вопросы