setsize - Las mejores prácticas para obtener el tamaño del tipo de datos(tamaño de) en Java
setsize java para que sirve (6)
Quiero almacenar una lista de dobles e ints en un ByteBuffer, que solicita un tamaño para asignar. Me gustaría escribir algo como la sintaxis de C
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 bytes? ¿Debería codificarlo?
(Si estás usando Java 8 o más, ¡asegúrate de ver la respuesta de @Frank Kusters !)
Todos los envoltorios primitivos tienen una constante SIZE, que está en bits, no en bytes.
Así que en el ejemplo dado, sería:
int size=(numDouble*Double.SIZE+numInt*Integer.SIZE) / Byte.SIZE;
O, si querías 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, se realiza en tiempo de compilación).
Desde Java 8, todas las clases de envoltura de tipos primitivos (excepto Boolean
) tienen un campo BYTES
. Así que en tu caso:
int size = numDouble * Double.BYTES + numInt * Integer.BYTES;
Documentación: http://docs.oracle.com/javase/8/docs/api/java/lang/Integer.html
El tamaño en Java es siempre el mismo. Puede codificarlo pero solo necesita hacer esto porque está trabajando con bytes en un ByteBuffer. Si usa double[]
o DoubleBuffer
no necesita estos.
Escribe tu 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);
También puede usar la biblioteca sizeof4j para obtener el tamaño del doble que solo necesita SizeOf.doubleSize()
Una solución mejor podría ser no emular la sintaxis de C y usar un ObjectOutputStream con un ByteArrayOutputStream anidado para generar una matriz de bytes que luego se puede escribir en su ByteBuffer.