我正在寻找将int
数组转换为byte
数组的最有效方法,反之亦然。
我想在文件中写入大量int
数组和字符串,以便有效地阅读它们。我认为节省空间和减少阅读时间的最佳方法是将它们存储为byte
。 我是对的吗?
我阅读了以下链接,但还有更好的方法吗?
答案 0 :(得分:4)
整数到字节
我认为没有比直接移位字节/位更好或更有效的方法。
您可能需要遍历您链接的question中提到的toBytes(..)方法:
byte[] toBytes(int i)
{
byte[] result = new byte[4];
result[0] = (byte) (i >> 24);
result[1] = (byte) (i >> 16);
result[2] = (byte) (i >> 8);
result[3] = (byte) (i /*>> 0*/);
return result;
}
像这样:
for (int i = 0; i < integers.length; i++)
{
bytes[i] = toBytes(integers[i]);
}
字节到整数
对于整数字节,您可以进行简单的乘法和添加,这可能是最快的。类似的东西:
for (int i = 0; i < integers.length; i++)
{
integers[i] = ((int) (bytes[i] << 24)) + ((int) (bytes[i+1] << 16)) + ((int) (bytes[i + 2] << 8)) + ((int) (bytes[i + 3]));
}
另见
答案 1 :(得分:2)
关于效率,要写入和读取的文件的大小将决定使用哪种方法。您可能只需要运行一些定时测试,看看哪种方法最适合您正在做的事情。
另一个选项(对于较小的文件)是使用Files.readAllBytes()和Files.write()。
答案 2 :(得分:2)
在Java中,byte
是8位,而int
是32位。
要将每个int
转换为单个byte
而不丢失数据,您需要确保所有数字都在-128到127之间(包括
如果他们 在这个范围内,那么你应该将它们作为字节存储在第一位(如果这不可能,有办法进行转换已经讨论过了。)
如果它们不在此范围内,那么您根本不应将它们转换为字节,因为它会强制您的数字进入范围,因此您将丢失大量数据。
或者,你可以使用short
,因为它是16位(给你的范围是-32,768到32,767)。
但是,如果您无法确保您的号码在这些范围内,那么您需要使用int
。
注意:您可以将每个int
存储为4 byte
s或2 short
s,但每个数字仍为32位,因此您和#39;这样做不会获得任何空间效率。
答案 3 :(得分:1)
Java提供了一个API,可以更有效地为您完成这项工作。看看http://docs.oracle.com/javase/7/docs/api/java/io/DataOutputStream.html。此外,如果您不想使用其他应用程序打开文件,另一种有效的解决方案是使用http://docs.oracle.com/javase/7/docs/api/java/io/ObjectOutputStream.html来序列化整个对象,而无需手动转换。
另外,请检查以下答案:Fastest way to write an array of integers to a file in Java?