目前Java获取文件大小的方法有两种:

1、通过file的length()方法获取;

2、通过流式方法获取;

通过流式方法又有两种,分别是旧的java.io.*中FileInputStream的available()方法和新的java..nio.*中的FileChannel

下面依次介绍这几种方法:

首先选择一个文件并查看这个文件在windows中显示的大小,为了测试准确性,我这里选取了一个大文件(超过2GB)

查看这个文件在windows中显示的大小:

使用在线转换工具将其转换成字节:

可以看出这个文件的实际大小是3265574912Byte,下面通过代码来获取文件大小,并进行比较:

一、通过length方法:

1、创建一个文件:

1 File file = new File("E:\\全部软件\\软件压缩包\\Windows7_W64_SP1_ent.iso");

2、获取文件大小:

    /*** 获取文件长度* @param file*/public static void getFileSize1(File file) { if (file.exists() && file.isFile()) { String fileName = file.getName(); System.out.println("文件"+fileName+"的大小是:"+file.length()); } }

3、查看结果:

可见,使用length方法获取的文件大小与windows中显示的大小一致!

二、通过file.io.*中的流式方法获取

1、创建一个文件

依旧使用上面的文件

File file = new File("E:\\全部软件\\软件压缩包\\Windows7_W64_SP1_ent.iso");

2、使用available方法获取:

/*** 根据java.io.*的流获取文件大小* @param file*/public static void getFileSize2(File file){ FileInputStream fis = null; try { if(file.exists() && file.isFile()){ String fileName = file.getName(); fis = new FileInputStream(file); System.out.println("文件"+fileName+"的大小是:"+fis.available()+"\n"); } } catch (Exception e) { e.printStackTrace(); }finally{ if(null!=fis){ try { fis.close(); } catch (IOException e) { e.printStackTrace(); } } } }

3、查看结果:

通过这种方法获取的文件大小是2147483647,很明显,这是int类型所能表示的最大值2^31-1,究其原因是因为文件的大小超过了int所能表示的最大值!!!

file.length()方法返回的类型:

available()方法返回的类型:

三、通过file.nio.*中的FileChannel工具来获取文件大小:

1、创建一个文件

依旧使用相同的大文件:

File file1 = new File("E:\\全部软件\\软件程序\\httpwatch.exe");

2、使用FileChannel获取文件大小:

    /*** 根据java.nio.*的流获取文件大小* @param file*/public static void getFileSize3(File file){ FileChannel fc = null; try { if(file.exists() && file.isFile()){ String fileName = file.getName(); FileInputStream fis = new FileInputStream(file); fc = fis.getChannel(); System.out.println("文件"+fileName+"的大小是:"+fc.size()+"\n"); } } catch (Exception e) { e.printStackTrace(); }finally{ if(null!=fc){ try { fc.close(); } catch (IOException e) { e.printStackTrace(); } } } }

3、查看结果:

可见通过这种方法获取的文件大小和第一种一样,都能获取文件实际大小。

四、使用小文件测试以上三种方法:

以上情况中文件大小超过了available()返回类型int的最大值,下面使用一个没有超过int最大值的文件测试,来验证通过这三种方法获取的大小是否和windows中显示的一致:

1、获取文件,查看其在windows中的大小:

2、将该文件单位转成Byte:

可见该文件总共有28147712个字节。

3、查看通过三种方法获取的结果:

根据结果得知,三种方法获取的大小一致,只是跟文件的实际大小有一些误差!!

本以为是文件类型的原因,于是又试了大小差不多的不同类型文件,结果发现绝大多数情况下只有300M以上的文件才能获取最准确的文件大小,300M以下的都会有一定的误差!

参考了http://blog.csdn.net/chaijunkun/article/details/22387305这篇文章,但是里面没测试300M以下的文件。

下面是我使用不同大小的文件进行的测试,通过文件在windows中显示的大小、转化成单位Byte后与java获取的方式对比,并计算出误差值:

总结java获取文件大小:

1、三种方法获取小文件(300M以下)时结果一致,但是与windows显示的值有一定误差;

2、获取大文件时,为避免文件长度大于方法返回值类型的最大值,尽量使用length或FileChannel方法获取;

如果看到这篇文章的你对此文有质疑,欢迎提出疑问~

最美好的时光里,不要一直是一个lowser!

转载于:https://www.cnblogs.com/firstdream/p/8710762.html

java获取文件大小的方法相关推荐

  1. java中测长度的方法,java获取文件大小的几种方法

    目前java获取文件大小的方法有两种: 1.通过file的length()方法获取: 2.通过流式方法获取: 通过流式方法又有两种,分别是旧的java.io.*中fileinputstream的ava ...

  2. java 获取文件的大小kb_java获取文件大小的方法

    java获取文件大小的方法 目前Java获取文件大小的方法有两种: 1.通过file的length()方法获取: 2.通过流式方法获取: 通过流式方法又有两种,分别是旧的java.io.*中FileI ...

  3. java获取文件大小_Java实现获取文件大小的几种方法

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 目前Java获取文件大小的方法有两种: 1.通过file的length()方法获取: 2.通过流式方法获取: 通过流式方法又有两种,分别是旧的java.i ...

  4. java获取文件大小_Java中获取文件大小的详解及实例代码

    Java 获取文件大小 今天写代码时需要实现获取文件大小的功能,目前有两种实现方法,一种是使用File的length()方法:另外一种是使用FileInputStream的available()方法, ...

  5. java获取文件大小_Java获取文件大小

    java获取文件大小 Today we will look into different ways to get file size in Java. 今天,我们将研究使用Java获取文件大小的不同方 ...

  6. Java 获取文件大小

    Java 获取文件大小 本文介绍几种方法获取文件大小,分别是java io 和 nio 以及第三方库实现. 标准的java io 首先开始一个简单实例计算文件大小,使用File.lenght()方法: ...

  7. php study 直接显示代码_PHP获取文件大小的方法详解(附视频)

    本篇文章主要给大家介绍PHP获取文件大小以及封装获取正常大小的具体方法. 对于初入门的PHP新手来说,PHP获取文件大小这个功能实现,或许有一定的难度.但是相信新手小白们在看过本篇文章介绍后,一定能轻 ...

  8. php js获取文件大小,js+ajax实现获取文件大小的方法_javascript技巧

    本文实例讲述了js+ajax实现获取文件大小的方法.分享给大家供大家参考,具体如下: 顾名思义,通过JS和Ajax来获取上传文件的大小,在上传之前可以有个判断,对上传的文件有所控制,因为js控制文件大 ...

  9. linux java获取路径_linux中java获取路径的方法

    linux中java获取路径的方法 发布时间:2020-05-06 11:11:26 来源:亿速云 阅读:700 作者:小新 今天小编给大家分享的是linux中java获取路径的方法,相信很多人都不太 ...

最新文章

  1. Centos 7.2搭建HTTP服务,并进行相关配置
  2. Windows Server 2008 R2 做开发需要开启那些角色和组件
  3. iOS开发系列--无限循环的图片浏览器
  4. 特征层次分析、视觉特征语义探索(微调+预训练)
  5. Java Optional学习笔记
  6. DRBD+keepalived+LAMP+discuz
  7. jQeury 批量删除
  8. 大龄开发者究竟该何去何从?2019年Python全栈工程师,都是开发人员改怎么转向高收入?
  9. 函数除颤/节流提高性能 + 原生实现滚动时到视口时展现
  10. Spark Streaming实例
  11. Python编程之输出素数
  12. Android开发学习总结——appcompat_v7项目说明
  13. 计算机的桌面图标设置在哪里,电脑小图标怎么设置在哪里
  14. 用c语言找最大素数,C语言实现寻找大素数
  15. 桌面版linux装哪个版本好用,linux桌面版哪个版本好用?
  16. 循环链表解决约瑟夫问题
  17. 查看硬盘序列号的方法 和查看设备序列号的方法
  18. 中国文学通史之各个阶段介绍
  19. 共建“医疗合规科技实验室”,美创科技实力护航医疗数据安全
  20. 局部最优点+鞍点+学习率的调节

热门文章

  1. android 广播 更新ui,详解Android UI更新的几种方法
  2. BZOJ 4698 Sdoi2008 Sandy的卡片
  3. Java中IO的快速复习(代码+注释)
  4. jpress-项目升级
  5. oracle11g回闪,oracle11gdroptable后闪回-Oracle
  6. Ceph 故障排查笔记 | 万字经验总结
  7. 〖Python自动化办公篇⑤〗- 文件自动化管理 - 清理重复的文件与批量修改文件名
  8. 阿里云对象存储(oos)
  9. 多条ADSL线路合并叠加效果测试,多WAN口聚合
  10. Spine的默认材质Spine/Skeleton有毛边问题