java为什么文件大小与操作系统不同

java为什么文件大小与操作系统不同,java,Java,我从网站下载文件并检查大小(如果我在操作系统中以字节为单位检查大小,则相同) 然后我也尝试通过其他方式检查存储的文件(NIO): 结果与操作系统的大小不同。为什么?二进制前缀: Windows在千字节(2^10)中使用1024字节,而Linux在千字节中使用1000字节。它以MB、GB等单位传播。在关闭流之前检查文件大小。在关闭流之后,您将获得与操作系统相同的大小 connection.connect(); int sizeBefore = connection.getCon

我从网站下载文件并检查大小(如果我在操作系统中以字节为单位检查大小,则相同)

然后我也尝试通过其他方式检查存储的文件(NIO):

结果与操作系统的大小不同。为什么?

二进制前缀:


Windows在千字节(2^10)中使用1024字节,而Linux在千字节中使用1000字节。它以MB、GB等单位传播。

在关闭流之前检查文件大小。在关闭流之后,您将获得与操作系统相同的大小

    connection.connect();
    int sizeBefore =  connection.getContentLength();
    BufferedInputStream bufferedInputStream = new BufferedInputStream(connection.getInputStream());
    File destFile = new File (destFileName);
    BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(
            new FileOutputStream(destFile));
    while ((i = bufferedInputStream.read()) != -1) {
        bufferedOutputStream.write(i);
    }
    bufferedOutputStream.flush();
    bufferedInputStream.close();
    long sizeAfter = destFile.length();
    if (sizeAfter==sizeBefore) {
        log.info("Downloaded correct");                
    }
台词

    long sizeAfter = destFile.length(); 
    bufferedOutputStream.flush();
    bufferedInputStream.close();
应该是

    bufferedOutputStream.close(); // Close the file. Flushes too.
    bufferedInputStream.close();
    long sizeAfter = destFile.length(); // Check its size on disk.
特别是BufferedOutputStream只有在完全填满时才会写入其缓冲区。
最后一个缓冲区通常是在
close()
调用
flush()

如何下载的?getContentLength更大吗?这可能意味着应该检查下载代码。使用FTP时,可能会发生CR/CRLF转换。Content Length()较大,我可能误解了,但在关闭已写入的文件后,您会选择文件大小吗?由于编写的代码不足,我想查看编写代码。我已编辑,您现在可以查看代码。听起来不错,但仅在报告大小时相关,而不是以字节为单位,没有任何前缀。这里是这样吗?我并没有问操作系统中计算大小的差异。
    long sizeAfter = destFile.length(); 
    bufferedOutputStream.flush();
    bufferedInputStream.close();
    bufferedOutputStream.close(); // Close the file. Flushes too.
    bufferedInputStream.close();
    long sizeAfter = destFile.length(); // Check its size on disk.