Java中获取文件大小的正确方法

2023-05-16

本文出处:http://blog.csdn.net/chaijunkun/article/details/22387305,转载请注明。由于本人不定期会整理相关博文,会对相应内容作出完善。因此强烈建议在原始出处查看此文。


今天写代码时需要实现获取文件大小的功能,目前有两种实现方法,一种是使用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()){
			fc= new RandomAccessFile(f, "r").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,定位起来很困难。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java中获取文件大小的正确方法 的相关文章

  • Java中遍历所有文件

    我想让我的程序打印我计算机上所有文件的巨大列表 我的问题是 当我希望它打印位于我的计算机上的所有文件时 它仅打印第一个硬盘驱动器的第一个文件夹中的文件 有什么想法我在这里做错了什么吗 谢谢 这是我使用的代码 Main import java
  • 深入理解Java中的Volatile

    Java是否允许输出1 0 我已经对其进行了非常深入的测试 但无法获得该输出 我只得到1 1 or 0 0 or 0 1 public class Main private int x private volatile int g Exec
  • FOP apache - 支持希伯来字母

    过去几天我一直在调查 FOP apache 中对希伯来字母的支持 用于生成 PDF 文件的项目 我看到以前有一个问题 我不太明白是否解决了 如果有支持 有人可以向我展示 重定向到简单的示例 为我提供带有希伯来字母的 XSL FO 文件 当使
  • Android update 17 似乎与外部 Jars 不兼容

    我刚刚允许我的 Mac 对其 Java 安装进行更新 现在我的一些旧罐子 例如javax mail and apache commons httpclient 正在投掷 找不到类 运行时异常 意思是 它们编译得很好 但在运行时崩溃 出现如下
  • 为什么java.util.Collection不直接定义next()、hasNext()呢?

    If 收藏定义有下一个 代替迭代器 hasNext 我们可以更容易地编写循环 while collection hasNext 代替 Iterator it collection iterator While it hasNext 当然 我
  • 在jodatime中计算一个月的周数

    jodatime 可以计算一个月的周数吗 我需要这样的东西 月份 七月 第 27 年的一周 1 7 七月 第 28 年的一周 9 14 七月 第 29 年的一周 16 21 七月 第 30 年的一周 23 31 七月 月份 八月 第 31
  • 如何将背景图像设置到 JPanel 中的 JTextArea

    我想在JTextArea 我在谷歌上查找过 但没有结果 背景可能是一个标志 我也想知道如何设置背景的分辨率 我的包中只有一门课 我有一个 MySQL 连接器驱动程序作为参考库 我的工作台是 Eclipse 使用 Fat jar 插件导出 j
  • 在“Java Web 服务教程”之后找不到 taskdef 类 com.sun.tools.ws.ant.WsImport

    我在许多不同的地方看到了同样的问题 即使经过大量谷歌搜索 我也无法解决它 我想做的 更大的图景 是经历Java Web 服务教程 http download oracle com docs cd E17802 01 webservices
  • 请求的操作:声明您的广告 ID 权限

    今天我收到这封电子邮件 去年 7 月 我们宣布了广告政策变更 以帮助加强 安全和隐私 我们对使用的标识符添加了新的限制 针对儿童的应用程序 当用户选择删除他们的 广告 ID 以选择退出个性化广告 如果满足以下条件 开发人员将收到一串零而不是
  • MyBatis 遵循 JPA 吗?

    作为我的第一个 ORM 我已经使用 myBatis 几个月了 现在我正在尝试学习其他东西 例如 Hibernate JPA 起初很难理解 Hibernate 和 JPA 之间的区别 经过几分钟的研究 我明白 JPA 只是一个规范 Hiber
  • 升级到 Gradle 2.0 后:在根项目上找不到属性“Compile”

    为了避免在构建 Java 源代码时出现有关特殊字符的警告 我将此行放在我的gradle build在升级到 Gradle 2 0 之前运行良好 tasks withType Compile options encoding UTF 8 升级
  • 我在这个正则表达式中做错了什么?

    我正在做一个关于正则表达式的学校作业 我先解释一下 我必须编写一个正则表达式来检查 URL 我必须检查的条件是 URL 是 http s 还是 ftp s 域名是 nl 还是 edu 至少有一个第三级域名 但如果该域名以 万维网 必须有一个
  • 是否有更现代的面向对象版本的“让我们构建一个编译器”? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 有没有更现代的 也许是面向对象的 相当于 Jack Crenshaw 的 让我们构建一个编译器 http
  • Web 服务器上的身份验证和授权 ?

    我正在构建一个 Android 应用程序 它与 apache tomcat 上的 Web 服务器进行通信 Web 服务器采用 JAVA EE 构建 目前 为了进行身份验证和授权 我使用用户名 密码 为了管理会话 我使用令牌 因此 当用户登录
  • 使用 Maven 时如何在 Tomcat 7.0 中将上下文路径设置为根(“/”)

    我有一个maven项目 pom xml包含tomcat插件
  • Log4j 不打印完整的堆栈跟踪

    我检查了 SO 中的所有答案 但没有一个真正帮助我 我的 Log4j 属性文件 log4j rootLogger debug console file log4j appender console org apache log4j Cons
  • 在 OpenCV 中将 `BufferedImage` 转换为 `Mat`

    我怎样才能转换BufferedImage to a Mat in OpenCV 我正在使用 JAVA 包装器OpenCV not JavaCV 由于我是新手OpenCV我在理解如何做时遇到一些问题Mat works 我想做这样的事情 基于
  • 使用 Appengine 进行多线程处理

    既然Appengine不允许java多线程 那么我们如何将现有的多线程代码迁移到该平台呢 例如我有以下代码 Thread t new Thread public boolean alive true public void run whil
  • 我可以在Java中设置枚举起始值吗?

    我使用枚举来创建一些常量 enum ids OPEN CLOSE OPEN 值为零 但我希望它为 100 这可能吗 Java 枚举与 C 或 C 枚举不同 后者实际上只是整数的标签 Java 枚举的实现更像是类 它们甚至可以有多个属性 pu
  • 可选的比较器

    I have abstract class OptionalComparator

随机推荐

  • TCP/IP数据包结构详解

    关键词 TCP IP 数据包 结构 详解 网络 协议 一般来说 xff0c 网络编程我们只需要调用一些封装好的函数或者组件就能完成大部分的工作 xff0c 但是一些特殊的情况下 xff0c 就需要深入的理解 网络数据包的结构 xff0c 以
  • Ubuntu 网络配制方法(同事的blog,拿来备份.)

    etc network interfaces 打开后里面可设置DHCP或手动设置静态ip 前面auto eth0 xff0c 让网卡开机自动挂载 1 以DHCP方式配置网卡 编辑文件 etc network interfaces sudo
  • 内存池:简单的内存池的实现

    转载自 xff1a http blog sina com cn s blog 46ed82810100ch8h html 当频繁地用malloc申请内存 xff0c 然后再用free释放内存时 xff0c 会存在两个主要问题 第一个问题是频
  • 浅谈如何学习linux

    一 为什么要学linux 当然最重要是爱好和兴趣 xff01 如果你这种必要学 xff0c 或者根本不喜欢 xff0c 请不要浪费时间 xff0c 你学也学不好 xff01 二 起步 你应该为自己创造一个学习linux的环境 在电脑上装一个
  • 用PV操作 实现生产者-消费者问题(C++语言)

    作者 xff1a wwj 时间 xff1a 2012 4 12 功能 xff1a 实现生产者和消费者正常活动 题目内容 xff1a 生产者 消费者问题 xff0c 是指两组进程共享一个环形的缓冲区 一组进程被称为生产者 xff0c 另一组进
  • Java异常处理总结

    找到一个关于异常总结的很详细的文章 分享下 异常在我们编程中很重 xff0c 在适当的位置 xff0c 合理的处理或者抛出异常 xff0c 对程序来说至关重要 转 xff1a 异常处理是程序设计中一个非常重要的方面 xff0c 也是程序设计
  • HashMap,LinkedHashMap,TreeMap应用

    HashMap LinkedHashMap TreeMap应用简介 共同点 xff1a HashMap LinkedHashMap TreeMap都属于Map xff1b Map 主要用于存储键 key 值 value 对 xff0c 根据
  • 关于Java加密扩展的出口限制

    近日 xff0c 在Matrix Security版上 http www matrix org cn thread shtml topicId 61 39543 amp forumId 61 55 提出一个问题 xff0c 即他的程序不能正
  • win7 设置共享无线网络

    适用范围 xff1a 1 WIN7平台电脑 2 笔记本或带有WIFI模块的台式电脑 3 搜索不到win7新建的临时网络的M9 生成wifi网络属性 xff1a 1 WLAN是802 11g标准 2 带宽为54Mbps 开启windows 7
  • Installing newer GCC versions in Ubuntu

    Installing newer GCC versions in Ubuntu It is often useful to have installed never versions of the compiler in our syste
  • VirtualBox网络配置

    VirtualBox提供了三种联网方式 xff0c 在这里介绍前两种方式 xff08 NAT和HostInterface xff09 的配置方法 xff0c 第三种联网方式属于利用主机上的所有的虚拟机构建一个虚拟网络的方法 xff0c 较简
  • SSL/TLS安全:Schannel中WinShock漏洞及解决办法

    Schannel 是最新被发现存在 SSL TLS 安全问题的加密库 xff0c 在过去一年中 SSL TLS 协议出于各种错误的塬因占据着新闻头条 苹果的 SecureTransport OpenSSL GnuTLS 和 Mozilla
  • tomcat 报错:Error occurred during initialization of VM

    Error occurred during initialization of VM Unable to load native library Can 39 t find dependent libraries 这个是由于java的lib
  • oracle的declare声明语法

    declare cc integer begin pkg elevator ref sp elevator ref add i id 61 gt 351 i code 61 gt 39 Testregist 39 i asset 61 gt
  • 输入用户名和密码登入到服务器,却显示指定的网络密码不正确,输入了好几次都是这样,这是怎么回事? 用户名和密码没问题 ,一直用的好好地今天就不行了...

    指定的网络密码不正确 修改一下组策略就可以了 运行 组策略编辑器 gpedit msc 打开计算机配置 windows设置 安全设置 本地策略 安全选项中的 xff1a 网络安全 xff1a LAN管理器身份验证级别 xff0c 默认是 没
  • git创建仓库,并提交代码(第一次创建并提交)

    一直想学GIT xff0c 一直不曾学会 主要是GUI界面的很少 xff0c 命令行大多记不住 今天尝试提交代码 xff0c 按GIT上给的方法 xff0c 没料到既然提交成功了 于是把它记下来 xff0c 方便以后学习 代码是学习用的 x
  • 贪吃蛇 AI 的实现 snake AI

    1 首先看下这个非常在微博上很火的贪吃蛇gif 这次我们尝试用代码来模拟下 xff0c 说不定上面这个图就是计算机搞的 2 讲贪吃蛇AI之前 xff0c 我们先看下贪吃蛇移动的特点 物理上给人的感觉是整个贪吃蛇往右移了一步 xff0c 在贪
  • CDF 累积分布函数(cumulative distribution function)

    论文中经常出现CDF曲线 xff0c 什么是CDF呢 xff1f 其实很简单 累积分布函数 xff08 cumulative distribution function xff09 定义 xff1a 对 连续函数 xff0c 所有小于等于a
  • Unity3D游戏开发之仿仙剑奇侠传一2D游戏 (一)

    今天要和大家分享的是基于Unity3D开发2D游戏 xff0c 博主一直钟爱于国产武侠RPG xff0c 这个我在开始写Unity3D游戏开发系列文章的时候就已经说过了 xff0c 所以我们今天要做的就是利用Unity3D来实现在2D游戏中
  • Java中获取文件大小的正确方法

    本文出处 xff1a http blog csdn net chaijunkun article details 22387305 xff0c 转载请注明 由于本人不定期会整理相关博文 xff0c 会对相应内容作出完善 因此强烈建议在原始出