2010-12-29 18 views
8

Mam tablicę bajtów z 151 bajtów, która jest zwykle rekordem, Rekord musi zostać wstawiony do bazy danych Oracle. W 151 bajtach zakresu tablic od 0 do 1 jest identyfikatorem rekordu, 2 do 3 jest identyfikatorem referencyjnym, 4 do 9 jest wartością daty. Następujące dane w tablicy bajtowej to wartość daty. chcę, aby przekonwertować go na ciągJak skutecznie przekonwertować tablicę bajtową na ciąg

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

new String(b); // current approach 

jest jakiś sposób, aby skutecznie przekonwertować tablicę bajtów pewnego zakresu (Arrays.copyOfRange(b,0,5)) do łańcucha.

+0

Co do cholery? Po prostu utwórz dla każdego pola kolumnę w tabeli ** o ** ustalonym rozmiarze. –

+0

@Martjin Mam plik, który ma 527890 bajtów i muszę przeczytać fragment 2048 bajtów, który ma 13 rekordów, każdy rekord ma 151 bajtów, i musimy wyodrębnić zakresy i przechowywać w kolumnach tabeli;) –

Odpowiedz

12
new String(b, 0 ,5); 

Ojej, kto mógł się domyślić? Każdy, kto zadał sobie trud, aby spojrzeć na API doc, to kto.

+0

nowy ciąg (b, 0, b.length); – Rekin

+0

@Rekin: nie, Suresh specjalnie NIE chce używać całej tablicy bajtów. Gdyby to zrobił, byłoby to o wiele prostsze: 'nowy ciąg (b)' –

+0

@Micheal, mój zły. Masz rację. – Rekin

1

pomocą konstruktora String(bytes[] bytes, int offset, int length): http://download.oracle.com/javase/1.5.0/docs/api/java/lang/String.html#String (bajt [], int int)

new String(b, 0, 5); 
0

i tutaj fantastyczny sposób (nie sprawny) :)

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

Jeśli trzeba utworzyć ciąg dla każdego regionu w rekordzie, chciałbym zaproponować podejście podciąg:

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

rzeczywiste przesunięcia mogą się różnić w zależności od kodowania ciągów znaków.

Zaletą tego podejścia jest to, że tablica bajtów jest kopiowana tylko raz. Kolejne wywołania do substring() nie będą tworzyć kopii, ale po prostu odwołają się do pierwszej kopii z przesunięciami. Możesz więc zaoszczędzić trochę czasu na kopiowanie pamięci i macierzy.

+0

dzięki. ale powiedziałeś, że offset będzie inny. jak to zrobić dynamicznie w zależności od przesunięcia. –

1

Żadna z tych odpowiedzi nie oznacza, że ​​możesz nie używać ASCII. Podczas konwersji bajtów na ciąg znaków zawsze powinieneś rozważyć zestaw znaków.

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

To jest właściwa odpowiedź. (Ale, co gorsza niż ASCII, to inne przeciążenie wykorzystuje kodowanie _default_, które zmienia się od czasu do czasu, od użytkownika do użytkownika, system do systemu.) –

Powiązane problemy