Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java:如何实时正确计算文件大小_Java_File - Fatal编程技术网

Java:如何实时正确计算文件大小

Java:如何实时正确计算文件大小,java,file,Java,File,我正在用Java编程。我想定期计算特定文件夹中所有文件的大小。这个周期不是恒定的,而且非常短。我的代码如下: //get Index Size index_byte_size = 0; File index = new File(indexPath); String[] files = index.list(); File f = null; for(int i=0; i < files.length; i++) { f = new File(index, files[i]);

我正在用Java编程。我想定期计算特定文件夹中所有文件的大小。这个周期不是恒定的,而且非常短。我的代码如下:

//get Index Size
index_byte_size = 0;
File index = new File(indexPath);
String[] files = index.list();
File f = null;
for(int i=0; i < files.length; i++) {
    f = new File(index, files[i]);
    index_byte_size += f.length();
}
正如您所看到的,文件大小只是增加,然后保持不变,然后增加。。。。我不知道发生了什么,我猜操作系统也发生了一些事情。我的操作系统是Windows7


[背景]

我想用Lucene做一个实验,看看它的索引能力,特别是它的索引大小和索引效率

我有很多小的文本文件(每个2-10米大小)。我想看看Lucene一个接一个地索引它们需要多长时间,索引会有多大。所以我写了这个程序

我不想在索引更改时收到通知(因为它们当然会更改)。我只是想在很短的时间内知道它们有多长,有多大



有人知道为什么吗?如何以实时的方式正确计算大小?

应用程序通常会缓冲输出,而只将数据按块推出

我怀疑这里的情况并非如此。相反,我怀疑Lucene正在使用内存映射文件。当您增长内存映射文件时,它会随着您的每次分配而增长。由于分配是昂贵的,但分配比您需要的更多的内存的成本相当便宜(因为它使用虚拟内存,并且只在您触摸它时使用主内存和磁盘),因此最有效的方法是分配大的块,然后惰性地填充它们。(例如,我使用64位JVM一次分配128 MB)

File.length为您提供文件的范围,而不是实际使用了多少甚至使用了多少磁盘空间。您可以看到在unix上和Java 7中的某些工具上使用了
du
的磁盘空间(我只找到了用于文件系统根的空间,而不是文件)

即使如此,这也会告诉你有多少页面被触摸过。要准确地知道使用了多少,唯一的方法是读取文件,如果在读取文件时修改了文件,则这种方法的准确性有限


编辑:在Windows 7上,空间似乎立即被保留,因此无法创建大于文件系统大小的稀疏文件(在ext4文件系统上可以这样做)

是否也要包含子文件夹?是否确实需要定期查看文件夹?你知道吗?你期望会发生什么?任何写入这些文件/目录的东西都可能会大量写入。或者,它可以在其他地方创建文件(例如,在临时目录中),然后在完成后将其移动。@dystroy,将您的评论作为答案发布,以便我可以向您投票。^^您对此问题提供了很好的解释。:)但是除了“du”之外,我还有别的办法吗?我现在在Windows 7中:(您可以获得windows的du,但我非常确定这不会给您磁盘上使用的空间(它也使用扩展数据块)。当我增加周期时,这种现象就会消失。这表明您所说的可能是事实。:)您必须读取该文件以确定已使用了多少空间。我怀疑文件的结尾会充满零。可以向后读取,查找第一个非零块。就文件系统而言,您看到的大小似乎是为文件保留的大小。
IndexSize(byte) Time(ms)
0   297
0   802
0   1293
0   1710
7769547 2952
7769547 4330
7769547 4431
7769547 4785
7769547 4901
7769547 5213
7769547 5279
7769547 5446
7769547 5660
7769547 5861
7769547 6155
24041054    8763
24041054    9203
24041054    10439
24041054    10820
24041054    11685
36708630    13662
36708630    14309
36708630    16065
36708630    16192
36708630    16374
36708630    16691
36708630    16899
...