读取文件大小的length()方法,available()方法的联系

本文探讨了Java中File的length()方法和InputStream的available()方法。length()返回文件的大小,对于目录则返回不确定的值。available()方法提供输入流可读取的估计字节数,但不保证准确性,具体行为取决于子类的实现。FileInputStream实现了available(),而网络编程中的InputStream可能未实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

这两天突然看到InputStream的available方法,然后想到length方法,后面查API发现,length方法是FIle类的,因其意思相近,故此记录下。

length()方法

先查的JDK API的1.6版本发现FIle类中有对这个方法的描述:返回由此抽象路径名表示的文件的长度。
在这里插入图片描述
这里有两个注意的点,第一个返回值是long类型的,所以对于大文件而言返回的值会比较准确。第二个是如果是目录返回值会不确定。怎样的不确定呢?我开始以为是目录下文件大小的总和,然后代码试了一下,,,,

package com.yuer.io;

import java.io.File;

/**
 * 介绍一些File类的操作
 * @author Yuer
 *
 */
public class FileDemo {
	
	
	public static void main(String[] args) {
		
		File file = new File("C:\\Users\\Yuer\\Desktop\\学校");
		System.out.println("这个文件夹的大小为" + file.length()); // 值不确定,不是文件夹中所有文件大小的总和
		
		File file1 = new File("C:\\Users\\Yuer\\Desktop\\学校\\Wuhan.rar");
		System.out.println("这个文件的大小为" + file1.length()); // 5788 5KB左右
		
		
		
	}

}

运行结果:
在这里插入图片描述
这里Wuhan.rar的大小是5788B,除以1024的结果的结果是5.65KB,如图:
在这里插入图片描述
这里直接看到一个文件夹的大小比这个文件夹中的文件的大小还小,自然,值是不准的。

available()方法

这个方法是InputStream中的。废话不多说,直接看API的解释:
在这里插入图片描述
第一个看返回值是int,所以对于大型文件,可能会出现结果不是很准确的情况。availbale()返回的值是一个估算值,所以一般不能依赖这个值来分配空间。(API中也描述了:返回此输入流下一个方法调用可以不受阻塞地从此输入流读取(或跳过)的估计字节数。)
第二个则是看其描述:有些 InputStream 的实现将返回流中的字节总数,但也有很多实现不会这样做。试图使用此方法的返回值分配缓冲区,以保存此流所有数据的做法是不正确的。能否使用取决于实现了InputStream这个抽象类的具体子类中有没有实现available这个方法。如果实现了那么就可以取得大小,如果没有实现那么就获取不到。例如FileInputStream就实现了available方法,那么就可以用new byte[in.available()];这种方式。但是,网络编程的时候Socket中取到的InputStream,就没有实现这个方法,那么就不可以使用这种方式创建数组。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值