Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-apps-script/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 有没有更快的方法将数据转换为字节,然后再转换回原始形式?_Java - Fatal编程技术网

Java 有没有更快的方法将数据转换为字节,然后再转换回原始形式?

Java 有没有更快的方法将数据转换为字节,然后再转换回原始形式?,java,Java,我使用的队列服务只将消息作为字节,因此我需要将数据快速转换为该格式,然后在从队列接收工作时将其恢复为原始格式。我的数据格式是INT、DOUBLE和INT[],下面是我最初的做法 //to convert to string String[] message = { Integer.toString(number), String.valueOf(double), Arrays.toString(my_list) }; message.asString; //to convert back Str

我使用的队列服务只将消息作为字节,因此我需要将数据快速转换为该格式,然后在从队列接收工作时将其恢复为原始格式。我的数据格式是INT、DOUBLE和INT[],下面是我最初的做法

//to convert to string
String[] message = { Integer.toString(number), String.valueOf(double), Arrays.toString(my_list) };
message.asString;
//to convert back
String message_without_brackets = message.replace("[", "" ).replace("]", "");
String[] temp_message = message_without_brackets.split(","); 

int interger = Integer.valueOf(temp_message[0]);
double double = Double.valueOf(temp_message[1]);
int[] my_list = new int[temp_message.length-2]; //-2 because the first two entries are other data

for (int i = 2; i < temp_message.length; i++) {
    my_list[i-2] = Integer.parseInt(temp_message[i].replace(" ",""));
}
因此,我想知道是否有更快的方法来获得相同的结果?我正在尝试本文中的一些建议,但是否有更快的方法来做到这一点而不依赖于任何外部库,因为我的需求非常简单(如果没有,那么是否有更快的方法)?因为有人建议使用Gson,所以我研究了Json解析器,但这是我应该寻找的还是有其他类型的库可以做到这一点


编辑:我正在将其转换为字符串,因为我认为我需要这样做才能将其作为
getBytes()
发送,是否有其他格式比我在上使用
getBytes()
更快?

您可以使用类似

ByteArrayOutputStream baos = new ByteArrayOutputStream();
DataOutputStream dos = new DataOutputStream(baos);

int i = 0;
double d = 43.0;
int[] sub = { 0, 59, 16 };

dos.writeInt(i);
dos.writeDouble(d);
dos.write(sub.length);
for (int j : sub)
    dos.writeInt(j);

byte[] bytes = baos.toByteArray();

如果您想变得更极端,可以使用循环字节缓冲区,甚至直接字节缓冲区,并使用本机字节排序。等等。

你看过番石榴吗?我一直使用它来处理字节流

)


这个库是值得的,因为toByteArray()

您可能有一个类,它可以保存int、double和int[],并对其进行序列化/反序列化。有很多更快的方法可以做到这一点。你拿绳子干什么?i、 e.为什么需要它们,因为最快的方法是根本不使用它们。@PeterLawrey队列服务器(据我所知)要求数据以
getBytes()的形式发送。
我想我需要将其转换为字符串才能做到这一点。@assylias我的类中有一个方法可以执行此操作,但是我正在尝试找出最快的方法。如果你想要字节,为什么不创建一个
byte[]
?理想情况下,您可以直接写入字节[]写入的任何位置(跳过对字节[]的需要),非常感谢Peter,但我如何将其转换回(我可以使用此逻辑发送到队列,但当事情返回时,我需要将其转换回原始格式以进行处理)?使用ByteArrayInputStream包装字节[]和一个DataInputStream来包装它。然后在我使用writeXxx()的地方使用readInt/Double。明白了,它适用于int和Double,但是我怎样才能得到int[]呢?我试着做另一个readInt,得到了一些数字,但这和我在列表中的不一样。有办法得到列表吗?我找到了!我没有使用DataOutputStream,而是使用ObjectOutputStream,除列表外,其他所有操作都是相同的,我将其作为对象编写(没有执行for循环)。似乎有效,我将测试性能。顺便说一句,我从来没有感谢你Peter推荐了你的工具包,我终于花了钱买了它,它真的很好。我学到了很多东西,并以新的方式思考我的代码。对于您的建议和您在我学习java过程中的帮助,我感激不尽。谢谢如果必须通过Serializable,ObjectOutputStream是一个不错的选择。然而,它相对复杂且效率低下。e、 g它可以使用10倍多的字节,并需要10倍或更长的时间。
ByteArrayOutputStream baos = new ByteArrayOutputStream();
DataOutputStream dos = new DataOutputStream(baos);

int i = 0;
double d = 43.0;
int[] sub = { 0, 59, 16 };

dos.writeInt(i);
dos.writeDouble(d);
dos.write(sub.length);
for (int j : sub)
    dos.writeInt(j);

byte[] bytes = baos.toByteArray();