前言
这两天突然看到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,就没有实现这个方法,那么就不可以使用这种方式创建数组。