Java中获取文件大小的正确方法
本文出处:http://blog.csdn.net/djy1992/article/details/51146837,转载请注明。由于本人不定期会整理相关博文,会对相应内容作出完善。因此强烈建议在原始出处查看此文。
今天写代码时需要实现获取文件大小的功能,目前有两种实现方法,一种是使用File的length()方法;另外一种是使用FileInputStream的available()方法,当InputStream未进行read操作时,available()的大小应该是等于文件大小的。但是在处理大文件时,后者会发生问题。我们来看一下:
在例子中,我使用了CentOS 6.5 的安装镜像文件,主要是考虑到这个文件足够大(大于2GB)。
1.使用File的length()方法
- public static void main(String[] args) {
- File f= new File("D:\\CentOS-6.5-x86_64-bin-DVD1.iso");
- if (f.exists() && f.isFile()){
- logger.info(f.length());
- }else{
- logger.info("file doesn't exist or is not a file");
- }
- }
我们看一下输出结果:
- 4467982336
结果是4.16GB,与Windows上显示的结果一致。
接下来我们看一下通过FileInputStream来获取的文件大小:
- public static void main(String[] args) {
- FileInputStream fis= null;
- try{
- File f= new File("D:\\CentOS-6.5-x86_64-bin-DVD1.iso");
- fis= new FileInputStream(f);
- logger.info(fis.available());
- }catch(Exception e){
- logger.error(e);
- } finally{
- if (null!=fis){
- try {
- fis.close();
- } catch (IOException e) {
- logger.error(e);
- }
- }
- }
- }
下面是运行结果:
- 2147483647
这个结果是不是很眼熟?它是Integer.MAX_VALUE,也就是有符号整型能表示的最大数值。
那么换算成熟悉的单位,这种方式获取的文件大小是多大呢?
约等于2GB,这显然不是正确的结果。
究其原因,File的length()方法返回的类型为long,long型能表示的正数最大值为:9223372036854775807,折算成最大能支持的文件大小为:8954730132868714 EB字节,这个量级将在人类IT发展史上受用很多很多年,而FileInputStream的avaliable()方法返回值是int,在之前也介绍了最大的表示范围,所能支持的最大文件大小为:1.99GB,而这个量级我们现在很容易就达到了。
2014年3月31日补充:
针对流式方法读取大文件大小也不是不可行,只是不能再使用传统的java.io.*下的包了,这里要用到java.nio.*下的新工具——FileChannel。下面我们来看下示例代码:
- public static void main(String[] args) {
- FileChannel fc= null;
- try {
- File f= new File("D:\\CentOS-6.5-x86_64-bin-DVD1.iso");
- if (f.exists() && f.isFile()){
- FileInputStream fis= new FileInputStream(f);
- fc= fis.getChannel();
- logger.info(fc.size());
- }else{
- logger.info("file doesn't exist or is not a file");
- }
- } catch (FileNotFoundException e) {
- logger.error(e);
- } catch (IOException e) {
- logger.error(e);
- } finally {
- if (null!=fc)){
- try{
- fc.close();
- }catch(IOException e){
- logger.error(e);
- }
- }
- }
- }
使用FileChannel后得到的结果与第一种情况吻合,准确地描述了文件的准确大小。
这里也同样提醒各位技术同仁,涉及到大文件读取的时候,对int类型的数据一定要留个心,以免出现隐藏的bug,定位起来很困难。
Java中获取文件大小的正确方法的更多相关文章
- Java获取文件大小的正确方法(转)
Java中获取文件大小的正确方法 2014-03-28 14:03 64507人阅读 评论(9) 收藏 举报 分类: Java笔记(36) 研究成果(42) 版权声明:本文为博主原创文章,未经博 ...
- JAVA中获取键盘输入的方法总结
Java程序开发过程中,需要从键盘获取输入值是常有的事,但Java它偏偏就没有像c语言给我们提供的scanf(),C++给我们提供的cin()获取键盘输入值的现成函数!下面介绍三种解决方法: 方法一: ...
- JAVA中获取工程路径的方法
在jsp和class文件中调用的相对路径不同.在jsp里,根目录是WebRoot 在class文件中,根目录是WebRoot/WEB-INF/classes 当然你也可以用System.getProp ...
- Java中获取资源文件的方法总结
这里总结3中方法获取资源文件的 ServletContext Class ClassLoader 文件的位置 1. ServletContext public void doGet(HttpServl ...
- Java中获取MongoDB连接的方法
首先是所需jar包,Maven中的配置如下: <dependency> <groupId>org.mongodb</groupId> <artifactId& ...
- Java中获取路径的各种方法
1. java文件中获得路径 Thread.currentThread().getContextClassLoader().getResource("") //获得资源文件(.cl ...
- JAVA中获取文件MD5值的四种方法
JAVA中获取文件MD5值的四种方法其实都很类似,因为核心都是通过JAVA自带的MessageDigest类来实现.获取文件MD5值主要分为三个步骤,第一步获取文件的byte信息,第二步通过Messa ...
- Java中获取键盘输入值的三种方法
Java中获取键盘输入值的三种方法 Java程序开发过程中,需要从键盘获取输入值是常有的事,但Java它偏偏就没有像c语言给我们提供的scanf(),C++给我们提供的cin()获取键盘输入值 ...
- java中获取日期和时间的方法总结
1.获取当前时间,和某个时间进行比较.此时主要拿long型的时间值. 方法如下: 要使用 java.util.Date .获取当前时间的代码如下 Date date = new Date(); da ...
随机推荐
- 关于jsp页面加载时报错500的问题
先说一下,问题的发生,个人做了个小系统,成品以后运行了几次,没有问题,结果最后一次测试时,发现登陆页面报错了: 账号密码输入正确,经过后台登陆后,按理说是应该进入登陆成功后的jsp页面,然而结果却是: ...
- 1114innodb的统计信息对optimizer成本预估影响实例 CARDINALITY
转自 https://www.cnblogs.com/olinux/p/5140615.html 转自 https://yq.aliyun.com/articles/174906?spm=5176 ...
- [LeetCode] Closest Leaf in a Binary Tree 二叉树中最近的叶结点
Given a binary tree where every node has a unique value, and a target key k, find the value of the n ...
- 前端监控系统(二)JS错误日志收集篇
前端监控系统 目前已经上线,欢迎使用! 服务器搭建好了,可以着手开发了. 其实前端需要分析的数据有很多,包括,PVUV, 接口请求统计,耗时统计,JS错误统计,用户使用设备统计,用户地域分布,页面用户 ...
- js eval函数写一个简单的计算器
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...
- 【luogu P4005 清华集训2017】小Y和地铁
题目描述 小 Y 是一个爱好旅行的 OIer.一天,她来到了一个新的城市.由于不熟悉那里的交通系统,她选择了坐地铁. 她发现每条地铁线路可以看成平面上的一条曲线,不同线路的交点处一定会设有 换乘站 . ...
- Codeforces Round#409/VK-Cup 2017 Round2
来自FallDream的博客,未经允许,请勿转载,谢谢. 和ditoly组队打VK-Cup,起了个名字叫Vegetable Chicken(意思显然),然后昨天我做AB他切C 很不幸的是.....我写 ...
- 微信小程序-参数传递与事件处理
前言 开发过程中经常会遇到从一个页面携带数据到另一个页面的情况,所以需要知道以下信息,什么是事件?有哪些传递方式?如果传递数组呢?如果传递对象呢? 一.事件 什么是事件 事件是视图层到逻辑层的通讯方式 ...
- Vue2学习(1)
学习Vue2的computed 属性和 watcher 主要将computed 和methods和watcher作比较,对其各自的相关优缺点作了介绍. computed 属性会基于它所依赖的数据进行缓 ...
- SQL 收缩数据库日志的几种办法 (2005与2008 略有区别)
在SQL Server 2000/2005中可以快速压缩日志log文件,通过SQL, 方法一: ---DBTEST 为数据库名,顺序最好别乱.注意:要先截断再清空,最后收缩! backup log D ...