2010-12-29 3 views
8

У меня есть байтовый массив из 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)) в строку.

+0

Какого черта? Просто создайте для каждого поля столбец в вашей таблице ** с ** фиксированным размером. –

+0

@Martjin У меня есть файл, который имеет 527890 байт, и я должен прочитать кусок 2048 байт, который имеет 13 записей, каждая запись - 151 байт, и нам нужно извлечь диапазоны и сохранить в столбцах таблицы.) –

ответ

12
new String(b, 0 ,5); 

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

+0

new String (b, 0, b.length); – Rekin

+0

@Rekin: no, Suresh специально не хочет использовать весь массив байтов. Если бы он это сделал, это было бы намного проще: 'new String (b)' –

+0

@Micheal, мой плохой. Ты прав. – Rekin

1

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

new String(b, 0, 5); 
0

и здесь фантастический способ (не эффективно) :)

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); 
1

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

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() не будут создавать копии, но будут просто ссылаться на первую копию с смещениями. Таким образом, вы можете сохранить время копирования памяти и массива.

+0

спасибо. но u сказал, что смещение будет другим. как сделать это динамически в зависимости от смещения. –

1

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

new String(bytes, offset, length, charset); 
+1

Это правильный ответ. (Но, даже хуже, чем ASCII, другая перегрузка использует кодировку _default_, которая время от времени меняется от пользователя к пользователю, система к системе.) –

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