2010-12-29 30 views
8

Tengo una matriz de bytes de 151 bytes, que normalmente es un registro, el registro debe insertarse en una base de datos de Oracle. En 151 bytes del rango de matriz de 0 a 1 hay una identificación de registro, de 2 a 3 es una identificación de referencia, de 4 a 9 es un valor de fecha. La siguiente información en una matriz de bytes es un valor de fecha. quiero convertirlo a cadenaCómo convertir eficientemente la matriz de bytes a la cadena

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

new String(b); // current approach 

¿hay alguna manera de convertir de manera eficiente el conjunto de bytes de un rango (Arrays.copyOfRange(b,0,5)) a cadena.

+0

¿Qué demonios? Simplemente cree para cada campo una columna en su tabla ** con ** tamaño fijo. –

+0

@Martjin tengo un archivo que tiene 527890 bytes y tengo que leer el fragmento de 2048 bytes que tiene 13 registros, cada registro es 151 bytes, y tenemos que extraer los rangos y almacenar en las columnas de la tabla;) –

Respuesta

12
new String(b, 0 ,5); 

Gee, ¿quién podría haberlo adivinado? Todos los que se molestaron en mirar el API doc, eso es quién.

+0

nueva Cadena (b, 0, b.length); – Rekin

+0

@Rekin: no, Suresh específicamente NO quiere usar todo el conjunto de bytes. Si lo hiciera, sería mucho más simple: 'new String (b)' –

+0

@Micheal, mi mal. Tienes razón. – Rekin

1

Utilice la String(bytes[] bytes, int offset, int length) constructor: http://download.oracle.com/javase/1.5.0/docs/api/java/lang/String.html#String (byte [], int, int)

new String(b, 0, 5); 
0

y aquí manera fantástica (no eficiente) :)

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

Si necesita crear una cadena para cada región en el registro, sugeriría un enfoque subcadena:

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

El los desplazamientos reales pueden ser diferentes dependiendo de la codificación de cadena.

La ventaja de este enfoque es que la matriz de bytes solo se copia una vez. Las llamadas posteriores al substring() no crearán copias, sino que simplemente harán referencia a la primera copia con desplazamientos. Para que pueda guardar algo de memoria y tiempo de copia de matriz.

+0

gracias. pero dijiste que la compensación sería diferente. cómo hacer eso dinámicamente dependiendo de la compensación. –

1

Ninguna de las respuestas aquí considera que es posible que no esté utilizando ASCII. Al convertir bytes en una cadena, siempre debe considerar el juego de caracteres.

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

Esta es la respuesta correcta. (Pero, incluso peor que ASCII, esa otra sobrecarga usa la codificación _default_, que varía de vez en cuando, usuario a usuario, sistema a sistema). –

Cuestiones relacionadas