前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >为什么文件占用空间跟文件大小不一样

为什么文件占用空间跟文件大小不一样

作者头像
johnhuster的分享
发布2022-03-28 20:31:39
发布2022-03-28 20:31:39
8.4K00
代码可运行
举报
文章被收录于专栏:johnhusterjohnhuster
运行总次数:0
代码可运行

本文拿windows系统举例,先看几张图:

图1 文件大小比占用空间小

图2 文件大小跟占用空间大小一致

图3 文件大小比占用空间大(而且相差较大)

上面3张图展示了文件大小与占用空间的大小几种情况,前两种场景是比较常见的情况,之所以有时文件大小会比占用空间小时因为簇大小的限制,簇代表了可以分配用来保存文件的最小磁盘空间量,笔者存放sparse.txt文件所在区簇的大小为4096字节,图1中文件大小为4096字节(可以使用chkdsk命令查看),所以5K的文件需要2个簇来存储,如下图所示:

图2所示文件大小为5M,5M正好是4096的整数倍,所以文件大小跟占用空间大小一样大。

下面重点说下第三种情况,这里涉及到稀疏文件问题,对于不支持稀疏文件的系统就不会出现这种情况,看个例子:

代码语言:javascript
代码运行次数:0
运行
复制
/**
     * 常规文件可能会有很多不必要的空间浪费
     * @throws IOException
     */
    @Test
    public void normalFile() throws IOException {
        File file = new File("d:/tmp/sparse.txt");
        Path path = file.toPath();
        FileChannel ch = FileChannel.open(path, StandardOpenOption.CREATE,StandardOpenOption.WRITE);
        ch.position(5*1024*1024L);
        ch.write(ByteBuffer.wrap("hello world".getBytes("utf-8")));
        ch.close();

    }

    /**
     * 稀疏文件模式
     * @throws IOException
     */
    @Test
    public void sparseFile() throws IOException {
        File file = new File("d:/tmp/sparse.txt");
        Path path = file.toPath();
        FileChannel ch = FileChannel.open(path, StandardOpenOption.SPARSE,StandardOpenOption.CREATE_NEW,StandardOpenOption.WRITE);
        ch.position(5*1024*1024L);
        ch.write(ByteBuffer.wrap("hello world".getBytes("utf-8")));
        ch.close();
    }

PS:

1、StandardOpenOption.SPARSE要跟StandardOpenOption.CREATE_NEW模式配合使用,不能跟StandardOpenOption.CREATE模式配合,文件占用空间大小将不会按照稀疏文件的方式处理

2、感兴趣的可以试下StandardOpenOption.SPARSE要跟StandardOpenOption.CREATE配合的情况,注意测试前要删除测试用到的文件

参考文章:

1、https://product.pconline.com.cn/itbk/software/dnyw/1703/8961027.html

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020/04/02 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档