2011-07-20 10 views
17

Quiero almacenar una lista de dobles y de entradas para un ByteBuffer, que solicita un tamaño para asignar. Me gustaría escribir algo así como la sintaxis de CMejor práctica para obtener el tamaño de tipo de datos (sizeof) en Java

int size=numDouble*sizeof(double)+numInt*sizeof(int); 

pero no hay sizeof en Java. ¿Cuál es la mejor práctica para calcular el tamaño en byte? ¿Debo codificarlo?

+0

Sí que debería. – tskuzzy

+0

El [JLS] (http://java.sun.com/docs/books/jls/third_edition/html/typesValues.html#4.2) especifica el tamaño de los tipos primitivos exactamente. (pero no veo el tamaño de un booleano allí) – Atreys

Respuesta

37

(Si está utilizando Java 8 o más allá, asegúrese de buscar en @Frank Kusters' answer!)

Todas las envolturas primitivas tienen una constante de tamaño, que es en bits, no por bytes.

Así, en el ejemplo dado, sería:

int size=(numDouble*Double.SIZE+numInt*Integer.SIZE)/Byte.SIZE; 

O, si se quería evitar la división:

int size=numDouble*(Double.SIZE/Byte.SIZE)+numInt*(Integer.SIZE/Byte.SIZE); 

(Debido a que la división es de dos constantes, ya está hecho en tiempo de compilación.)

+1

Puse una [sugerencia de mejora] (http://code.google.com/p/guava-libraries/issues/detail?id=668&can=6&colspec=ID%20Type%20Status%20Milestone%20Summary) para que Guava haga esto un poco menos detallado. –

3

El tamaño en Java es siempre el mismo. Puede codificarlo pero solo necesita hacer esto porque está trabajando con bytes en ByteBuffer. Si usa double[] o DoubleBuffer, no los necesita.

+0

Con el foco en NIO.2 en JDK 7. Esta es la mejor práctica. – Sam

+1

No si está utilizando NIO para interactuar con otras API, como OpenGL, que aún requieren número de bytes (no números). – mlepage

+0

¿Cuál es el tamaño en java? – Joehot200

8

Escriba su propio método. En Java los tipos de datos son independientes de la plataforma siempre del mismo tamaño:

public static int sizeof(Class dataType) 
{ 
    if (dataType == null) throw new NullPointerException(); 

    if (dataType == int.class || dataType == Integer.class) return 4; 
    if (dataType == short.class || dataType == Short.class)  return 2; 
    if (dataType == byte.class || dataType == Byte.class)  return 1; 
    if (dataType == char.class || dataType == Character.class) return 2; 
    if (dataType == long.class || dataType == Long.class)  return 8; 
    if (dataType == float.class || dataType == Float.class)  return 4; 
    if (dataType == double.class || dataType == Double.class) return 8; 

    return 4; // 32-bit memory pointer... 
       // (I'm not sure how this works on a 64-bit OS) 
} 

Uso:

int size = numDouble * sizeof(double.class) + numInt * sizeof(int.class); 
+0

sugerencia: use 'switch case' para una mejor legibilidad, java 7 soporta cadenas en instrucciones de conmutación. – thoughtbot

+9

Creo que la legibilidad es excelente. Usar cadenas arruinaría el rendimiento. –

5

Una mejor solución podría ser la de no imitar la sintaxis de C y utilizar un ObjectOutputStream con un ByteArrayOutputStream anidada para generar un byte matriz que luego se puede escribir en su ByteBuffer.

0

también puede utilizar la biblioteca sizeof4j para obtener el sizeof el doble que sólo tiene SizeOf.doubleSize()

Cuestiones relacionadas