目前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!

java获取文件大小的方法的更多相关文章

  1. PHP获取文件大小的方法详解

    对于初入门的PHP新手来说,PHP获取文件大小这个功能实现,或许有一定的难度.但是相信新手小白们在看过本篇文章介绍后,一定能轻松掌握PHP获取文件大小的重要知识! 下面我们通过具体的代码示例,为大家详 ...

  2. java获取调用当前方法的方法名和行数

    java获取调用当前方法的方法名和行数String className = Thread.currentThread().getStackTrace()[2].getClassName();//调用的 ...

  3. Java 获取当前路径的方法总结

    Java 获取当前路径的方法总结 1.利用System.getProperty()函数获取当前路径: System.out.println(System.getProperty("user. ...

  4. Java获取文件大小的正确方法(转)

    Java中获取文件大小的正确方法 2014-03-28 14:03 64507人阅读 评论(9) 收藏 举报  分类: Java笔记(36)  研究成果(42)  版权声明:本文为博主原创文章,未经博 ...

  5. java获取文件大小

    1.使用File的length()方法获取.这个方法获取的字节数,由于返回的是Long类型所以能返回的最大值是Long.MAX_VALUE File file = new File( "D: ...

  6. java获取时间戳的方法

    JAVA 获取当前月的初始时间的时间戳 public static long getMonthFirstDay() { Calendar calendar = Calendar.getInstance ...

  7. 【MFC】获取文件大小的方法

    [转载]原文地址:http://blog.csdn.net/coderwu/article/details/5652056 MFC 下可以通过 CFileStatus 获取文件大小. ULONGLON ...

  8. Java获取路径的方法分析详解(Application/Web)

    1.利用System.getProperty()函数获取当前路径: System.getProperty("user.dir");//user.dir用户当前的工作目录,输出:D: ...

  9. java获取当前路径的方法

    1.System.getProperty("user.dir") 函数获取当前路径 // 获取当前路径方式1 System.out.println(System.getProper ...

随机推荐

  1. HTTP协议浅谈

    一.介绍: http 即 超文本传送协议  (Hypertext transfer protocol) 是通过因特网传送万维网文档的数据传送协议.今天普遍使用的一个版本——HTTP 1.1. HTTP ...

  2. Table '.\gts\eventdata#P#p0' is marked as crashed and last (automatic?) repair failed

    修复数据表操 MYSQL数据表出现问题,提示:Error: Table './db_name/table_name' is marked as crashed and last (automatic? ...

  3. ruby gems列表

    https://github.com/shageman/cobradeps

  4. PHP之string之str_word_count()函数使用

    str_word_count (PHP 4 >= 4.3.0, PHP 5, PHP 7) str_word_count - Return information about words use ...

  5. [作业] Python入门基础---购物车小程序

    1.购物车小程序: 1.1用户输入工资取60% 1.2打印输出商品菜单 1.3由用户输入数字选择 #__author:Mifen #date: 2018/11/27 # 购物车程序 #把工资作为账户的 ...

  6. 使用 DL4J 训练中文词向量

    目录 使用 DL4J 训练中文词向量 1 预处理 2 训练 3 调用 附录 - maven 依赖 使用 DL4J 训练中文词向量 1 预处理 对中文语料的预处理,主要包括:分词.去停用词以及一些根据实 ...

  7. 一句话讲清URI、URL、URN

    关于URI,URL ,URN URN(Uniform Resource Name):统一资源名称 URL(Uniform Resource Locator):统一资源定位符 URI(Uniform R ...

  8. bzoj 4561: [JLoi2016]圆的异或并

    Description 在平面直角坐标系中给定N个圆.已知这些圆两两没有交点,即两圆的关系只存在相离和包含.求这些圆的异或面 积并.异或面积并为:当一片区域在奇数个圆内则计算其面积,当一片区域在偶数个 ...

  9. 【转载】在Angular 2/Typescript中声明全局变量的最佳方式是什么?

    问题详细描述 我想在Typescript语言中的Angular 2中声明一些全局可见的变量.最佳的实践方法是? 推荐的实现方法 这是最简单的解决方案,无需使用Service或Observer: 将全局 ...

  10. js控制div样式显示与隐藏,JS通过点击超链接右边(指定位置)显示一个图标

    原文出自:https://blog.csdn.net/seesun2012 javascript基础篇,老土的方法解决js控制div样式,便于新手理解,粗暴的不能再粗暴,如果你是高手,请忽略! 思路: ...