Как эффективно преобразовать байтовый массив в строку - PullRequest
9 голосов
/ 29 декабря 2010

У меня есть байтовый массив из 151 байта, который обычно является записью. Запись должна быть вставлена ​​в базу данных оракула.В 151 байте диапазона массива от 0 до 1 - идентификатор записи, от 2 до 3 - ссылочный идентификатор, от 4 до 9 - значение даты.Следующие данные в байтовом массиве являются значениями даты.я хочу преобразовать его в строку

byte[] b= {48,48,49,48,48,52};  // when converted to string it becomes 10042. 

new String(b);  // current approach

Есть ли способ эффективно преобразовать массив байтов некоторого диапазона (Arrays.copyOfRange(b,0,5)) в строку.

Ответы [ 5 ]

15 голосов
/ 29 декабря 2010
new String(b, 0 ,5);

Ну и дела, кто бы мог догадаться?Все, кто потрудился взглянуть на API doc , вот кто.

1 голос
/ 07 сентября 2017

Ни один из ответов здесь не учитывает, что вы, возможно, не используете ASCII. При преобразовании байтов в строку всегда следует учитывать кодировку.

new String(bytes, offset, length, charset);
1 голос
/ 29 декабря 2010

Если вам нужно создать строку для каждого региона в записи, я бы предложил подход с подстрокой:

byte[] wholeRecord = {0,1,2 .. all record goes here .. 151}
String wholeString = new String(wholeRecord);
String id = wholeString.substring(0,1);
String refId = wholeString.substring(1,3);
...

Фактические смещения могут отличаться в зависимости от кодировки строки.

Преимущество этого подхода заключается в том, что байтовый массив копируется только один раз.Последующие вызовы substring() не будут создавать копии, а будут просто ссылаться на первую копию со смещением.Таким образом, вы можете сэкономить память и время копирования массивов.

1 голос
/ 29 декабря 2010

Используйте конструктор String(bytes[] bytes, int offset, int length): http://download.oracle.com/javase/1.5.0/docs/api/java/lang/String.html#String(byte[], int, int)

new String(b, 0, 5);
0 голосов
/ 29 декабря 2010

и тут фантастический способ (не эффективный):)

    byte[] b = { 48, 48, 49, 48, 48, 52 };
    ByteArrayInputStream bais = new ByteArrayInputStream(b);

    BufferedReader buf = new BufferedReader(new InputStreamReader(bais));

    String s = buf.readLine();
    System.out.println(s);
...