0

如果我保护一个数组并重新加载它,如果它未知,是否有可能获得它的大小?谢谢

4

6 回答 6

4

“未知”是什么意思?您可以使用长度字段获取任何 java 数组的长度。

int[] myArray = deserializeSomeArray();
int size = myArray.length;
于 2008-10-06T10:25:23.463 回答
1

听起来您正在序列化并将单个对象存储在数组中(在行间大量阅读之后)。使用 ObjectOutputStream 来存储数组本身。如果存储在数组中的对象是可序列化的,它们也会被存储。当您反序列化时,您将完整地恢复整个数组。

于 2008-10-06T12:43:14.667 回答
0

我认为您需要提供更多信息。你是如何保存数组的?使用对象输出流?

于 2008-10-06T11:00:45.933 回答
0

不,因为数组的长度只是分配的内存大小除以存储在其中的对象的大小,并且由于没有对象的大小为 0,因此您将始终具有适当的长度(可能为 0)

于 2008-10-06T11:03:58.143 回答
0

如果您使用 ObjectInputStream.readObject() 读取保存的数组,它将以适当的长度重新构成,您可以使用 array.length 读取大小。

于 2008-10-06T11:25:28.223 回答
0

试图在字里行间阅读......

如果您实际上是在读取数组,那么(与 C 不同)所有数组都知道它们的长度。Java 是一种安全语言,因此长度对于边界检查是必要的。

MyType[] things = (MyType[])in.readObject();
int len = things.length;

也许您的困难在于您正在进行自定义(反)序列化并且正在写出数组的各个元素(提示:不要 - 使用数组)。如果您需要捕获 OptionDataException 来检测封闭对象的自定义数据的结尾:

private static final MyType[] NOTHING = new MyType[0];

private transient MyType[] things = NOTHING;

private void writeObject(ObjectOutputStream out) throws IOException {
    out.defaultWriteObject(); // Do not forget this call!
    for (MyType thing : things) {
        out.writeObject(thing);
    }
}
private void readObject(
    ObjectInputStream in
) throws IOException, ClassNotFoundException {
    in.defaultReadObject(); // Do not forget this call!
    List<MyType> things = new ArrayList<MyType>();
    try {
        for (;;) {
            things.add((MyType)in.readObject();
        }
    } catch (OptionalDataException exc) {
        // Okay - end of custom data.
    }
    this.things = things.toArray(NOTHING);
}

如果你要做那种事情,最好在实际数据之前写出你要读取的对象数量作为 int。

于 2008-10-06T12:29:51.947 回答