是否有更快的方法将数据转换为字节然后再转换为原始形式?

时间:2012-04-17 16:12:31

标签: 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
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(" ",""));
}

这是非常丑陋的,让我感到恼火的是,经过几周(或一夜的大量饮酒),我可能无法迅速解决这个问题。性能方面,代码并不算太糟糕,我认为replace是代码中最重的部分(如果我记得它只占整体执行的15%)。

我四处询问并发现Gson能够做到更清洁,但现在性能已经超过了我的循环的40%(它的Gson本身就是这样做的):

    Gson gson = new Gson();
    int[] sub = { 0, 59, 16 };
    Object[] values = { 0, 43.0, sub };
    String output = gson.toJson(values); // => [0, 43.0,[0,59,16]]

    Object[] deserialized = gson.fromJson(output, Object[].class);
    System.out.println(deserialized[0]);
    System.out.println(deserialized[1]);
    System.out.println(deserialized[2]);

所以我想知道是否有更快的方法来获得相同的结果?我正在尝试这个question中的一些建议但是有一种更快的方法来做到这一点,而不依赖于任何外部库我的需求很简单(如果没有,那么有一个快速的)?因为有人建议Gson,我看了Json解析器,但这是我应该寻找的还是有其他类型的库来做这个?

编辑:我正在将其转换为字符串,因为我认为我需要这样做才能将其发送为getBytes(),是否还有其他格式可以更快地使用getBytes()?< / p>

2 个答案:

答案 0 :(得分:3)

您可以使用DataOutputStream,例如

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

如果您想要更加极端,可以使用循环使用的ByteBuffers甚至直接使用ByteBuffers并使用本机字节排序。等

答案 1 :(得分:1)

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

http://docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/io/ByteStreams.html#toByteArray(java.io.InputStream

只为toByteArray()

这个库是值得的