有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java在使用ObjectOutputStream时估计磁盘上的文件大小

我正在尝试将空间数据从表写入文件。但在写入磁盘之前,我需要知道磁盘上数据的确切大小。例如,假设我正在使用以下代码写入磁盘:

    FileOutputStream fos = new FileOutputStream("t.tmp",false);
    ObjectOutputStream oos = new ObjectOutputStream(fos);
    oos.writeInt(gid);
    oos.writeUTF(fullname);
    oos.writeInt(d.shape.length);
    oos.write(d.shape);

    oos.close();
    fos.close();

我认为磁盘上的文件大小等于:

size= 4B {for gid, int} + fullname.getBytes.length() {string} + 4B {d.shape.length, int} + d.shape.length

但事实上,这与磁盘上的实际文件大小大不相同

我还注意到,即使使用ObjectOutputstream创建一个空文件,磁盘上也会有4B的空间

有关于如何计算磁盘上文件大小的帮助吗

(我无法将数据写入磁盘,然后读取实际大小。这会降低性能。相反,我需要根据存储在内存中的数据值计算磁盘上数据的大小。)


共 (2) 个答案

  1. # 1 楼答案

    假设您不介意浪费一些内存,您可以先将其全部写入ByteArrayOutputStream,然后获取大小

    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    ObjectOutputStream oos = new ObjectOutputStream(boas);
    oos.writeInt(gid);
    oos.writeUTF(fullname);
    oos.writeInt(d.shape.length);
    oos.write(d.shape);
    
    oos.close();
    boas.close();
    int size = boas.size();
    
  2. # 2 楼答案

    I am trying to write my spatial data from a table to a file. But I need to know the exact size of the data on disk before writing to disk.

    你不应该使用ObjectOutputStream。一个ObjectOutputStream可以为您自动序列化一个复杂的对象图-但这似乎不是您的需求之一。作为序列化的一部分,ObjectOutputStream写入一些流头信息(这是您在开始时发现的4个字节),并且还跟踪以前写入的对象,以便它可以写入特殊的标记值,而不是再次写入整个对象

    相反,只需使用^{}。它提供与您所需相同的功能:

    A data output stream lets an application write primitive Java data types to an output stream in a portable way. An application can then use a data input stream to read the data back in.

    FileOutputStream fos = new FileOutputStream("t.tmp",false);
    DataOutputStream dos = new DataOutputStream(fos);
    dos.writeInt(gid);                 // write 4 bytes
    dos.writeUTF(fullname);            // write 2 bytes of length, then variable length string (UTF encoded)
    dos.writeInt(d.shape.length);      // write 4 bytes
    dos.write(d.shape);                // write a variable length byte array
    
    dos.close();
    fos.close();
    

    这里不会有任何意外(前提是您知道UTF编码字符串将结束多少字节),并且您可以通过算术计算出确切的文件大小

    (如果您处理的字符串不仅仅等同于一个字符一个字节,那么可以首先使用字符集编码器将字符串呈现到字节数组)