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的空间
有关于如何计算磁盘上文件大小的帮助吗
(我无法将数据写入磁盘,然后读取实际大小。这会降低性能。相反,我需要根据存储在内存中的数据值计算磁盘上数据的大小。)
# 1 楼答案
假设您不介意浪费一些内存,您可以先将其全部写入
ByteArrayOutputStream
,然后获取大小# 2 楼答案
你不应该使用
ObjectOutputStream
。一个ObjectOutputStream
可以为您自动序列化一个复杂的对象图-但这似乎不是您的需求之一。作为序列化的一部分,ObjectOutputStream
写入一些流头信息(这是您在开始时发现的4个字节),并且还跟踪以前写入的对象,以便它可以写入特殊的标记值,而不是再次写入整个对象相反,只需使用^{} 。它提供与您所需相同的功能:
这里不会有任何意外(前提是您知道UTF编码字符串将结束多少字节),并且您可以通过算术计算出确切的文件大小
(如果您处理的字符串不仅仅等同于一个字符一个字节,那么可以首先使用字符集编码器将字符串呈现到字节数组)