Если Вы рады использовать классы Apache, Вы могли бы использовать org.apache.commons.text.RandomStringGenerator
(текст свободного городского населения).
Пример:
RandomStringGenerator randomStringGenerator =
new RandomStringGenerator.Builder()
.withinRange('0', 'z')
.filteredBy(CharacterPredicates.LETTERS, CharacterPredicates.DIGITS)
.build();
randomStringGenerator.generate(12); // toUpperCase() if you want
, Так как Ленг свободного городского населения 3.6, RandomStringUtils
удерживается от использования.
Ваш метод - практически единственный способ сделать это. Вы можете найти внешнюю библиотеку, которая выполняет ее полностью или частично, но по сути она будет делать то же самое.
Однако в вашем коде есть одна вещь, которая представляет собой потенциальную проблему: при вызове new String (array )
, вы используете кодировку платформы по умолчанию для преобразования байтов в символы. Кодировка платформы различается в зависимости от операционной системы и настроек локали - ее использование почти всегда является ожидаемой ошибкой. Это зависит от того, откуда вы получаете эти байты, но их кодировка должна быть где-то указана, передана в качестве аргумента методу и использована для преобразования (с помощью конструктора String со вторым параметром).
import org.apache.commons.lang.ArrayUtils;
...
Byte[] bytes = new Byte[l.size()];
l.toArray(bytes);
byte[] b = ArrayUtils.toPrimitive(bytes);
без какой-либо дополнительной библиотеки (например, apache commons) ваш метод в порядке
Вы могли бы использовать java.nio и придумать что-то вроде этого
public static String byteListToString(List<Byte> l, Charset cs)
throws IOException
{
final int CBUF_SIZE = 8;
final int BBUF_SIZE = 8;
CharBuffer cbuf = CharBuffer.allocate(CBUF_SIZE);
char[] chArr = cbuf.array();
ByteBuffer bbuf = ByteBuffer.allocate(BBUF_SIZE);
CharsetDecoder dec = cs.newDecoder();
StringWriter sw = new StringWriter((int)(l.size() * dec.averageCharsPerByte()));
Iterator<Byte> itInput = l.iterator();
int bytesRemaining = l.size();
boolean finished = false;
while (! finished)
{
// work out how much data we are likely to be able to read
final int bPos = bbuf.position();
final int bLim = bbuf.limit();
int bSize = bLim-bPos;
bSize = Math.min(bSize, bytesRemaining);
while ((--bSize >= 0) && itInput.hasNext())
{
bbuf.put(itInput.next().byteValue());
--bytesRemaining;
}
bbuf.flip();
final int cStartPos = cbuf.position();
CoderResult cr = dec.decode(bbuf, cbuf, (bytesRemaining <= 0));
if (cr.isError()) cr.throwException();
bbuf.compact();
finished = (bytesRemaining <= 0) && (cr == CoderResult.UNDERFLOW);
final int cEndPos = cbuf.position();
final int cSize = cEndPos - cStartPos;
sw.write(chArr, cStartPos, cSize);
cbuf.clear();
}
return sw.toString();
}
, но я действительно не думаю, что рекомендовал бы что-то настолько простое.
Незначительный параметр:
if (l == null || l.isEmpty() ) {
return "" ;
}
, чтобы избежать создания пустых строк для пустых списков.
Одним из вариантов может быть использование StringBuilder:
public static String byteListToString(List<Byte> l) {
if (l == null) {
return "" ;
}
StringBuilder sb = new StringBuilder(l.size());
for (Byte current : l) {
sb.append((char)current);
}
return sb.toString();
}
Или, если вам нужно преобразование символов
public static String byteListToString(List<Byte> l) {
if (l == null) {
return "" ;
}
ByteArrayOutputStream bout = new ByteArrayOutputStream(l.size());
for (Byte current : l) {
bout.write(current);
}
return bout.toString("UTF-8");
}
Если вы агрегируете байты, попробуйте сначала ByteArrayOutputStream вместо Список байтов. Примечание. Не упустите исключение UnsupportedEncodingException - вам нужно где-нибудь попытаться его отловить.
Обратите внимание на класс BitConverter , я думаю, он делает то, что вы хотите. Используйте его в сочетании с методом List.toArray ().