例如,我将使用什么语法来获取表示字符串的字节数,并将它们与表示保存该字符串的ArrayList的字节数进行比较?
我正在使用一个多代理系统通过消息发送对象,我想要跟踪每条消息占用了多少空间。只要方法与物体的实际尺寸成比例,它就不一定是死气沉沉的准确的。例如,长度为4的字符串向量将报告为小于长度为5的字符串向量。
发布于 2010-10-14 22:38:43
可以使用ObjectOutputStream和ByteArrayOutputStream将对象转换为字节数组。
public static int sizeof(Object obj) throws IOException {
ByteArrayOutputStream byteOutputStream = new ByteArrayOutputStream();
ObjectOutputStream objectOutputStream = new ObjectOutputStream(byteOutputStream);
objectOutputStream.writeObject(obj);
objectOutputStream.flush();
objectOutputStream.close();
return byteOutputStream.toByteArray().length;
}我刚测试过这个。您要计算的对象的大小需要实现Serializable (这意味着您可能必须将每个对象标记为这样简单地得到它的大小。可能不可取)。我编写了一个快速而肮脏的程序来测试这一点:
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.io.Serializable;
public class Sizeof {
public static class Person implements Serializable {
private String name;
private String age;
public Person(String name, String age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
}
public static void main(String[] args) {
Person p1 = new Person("Alby", "20");
Person p2 = new Person("VeryLongName", "100");
String s1 = "This is it";
String s2 = "This";
try {
System.out.println("p1 " + sizeof(p1));
System.out.println("p2 " + sizeof(p2));
System.out.println("s1 " + sizeof(s1));
System.out.println("s2 " + sizeof(s2));
}
catch(Exception e) {
e.printStackTrace();
}
}
public static int sizeof(Object obj) throws IOException {
ByteArrayOutputStream byteOutputStream = new ByteArrayOutputStream();
ObjectOutputStream objectOutputStream = new ObjectOutputStream(byteOutputStream);
objectOutputStream.writeObject(obj);
objectOutputStream.flush();
objectOutputStream.close();
return byteOutputStream.toByteArray().length;
}
}这给了我:
p1 85
p2 94
s1 17
s2 11编辑
Stephen的回答强调了这种方法的一些注意事项。
发布于 2014-05-06 20:54:36
在调查一个超过memcache大小的服务器错误时,我需要准确地检查每个memcache的写入。为了避免大对象的大字节数组的开销,我将OutputStream扩展为一个计数器:
public class CheckSerializedSize extends OutputStream {
/** Serialize obj and count the bytes */
public static long getSerializedSize(Serializable obj) {
try {
CheckSerializedSize counter = new CheckSerializedSize();
ObjectOutputStream objectOutputStream = new ObjectOutputStream(counter);
objectOutputStream.writeObject(obj);
objectOutputStream.close();
return counter.getNBytes();
} catch (Exception e) {
// Serialization failed
return -1;
}
}
private long nBytes = 0;
private CheckSerializedSize() {}
@Override
public void write(int b) throws IOException {
++nBytes;
}
@Override
public void write(byte[] b, int off, int len) throws IOException {
nBytes += len;
}
public long getNBytes() {
return nBytes;
}
}发布于 2010-10-14 22:39:09
您可以将每个对象序列化为数组,并比较每个数组的长度。这不是很准确,在一般情况下,但往往给出一个很好的近似。
看看ObjectOutputStream (可以用来序列化对象并将其转换为bytes)和ByteArrayOutputStream (可以用来保存序列化的字节)。
https://stackoverflow.com/questions/3938122
复制相似问题