前言:
关于File类
File类是用来表示本地文件的,所以创建对象时需要指定本地文件的位置(通过File对象的有参构造传递参数来设置对象的位置属性)。但File类只是说明一个文件的概念,其对象是一个基于逻辑的文件,真实的文件可以不存在,也可以通过成员方法将逻辑文件创建成物理文件。exist()方法用来判断是否有真实的物理文件。File类可以创建的对象可以为文件也可以为目录(文件夹)。
重点:
File文件字节输入流的读(相对于写来说,读取数据有更多的注意事项)
指定文件:a.txt
输入流读取文件的实现:
运行结果:
重点①:
为什么要用if(file.exists()&&file.isFile())来判断?
答:因为不知道文件对象是逻辑上的还是真正存在在物理现实的,要用exists()方法来判断。而isFile()来判断其是文件还是文件夹,我们要的是对文件的操作。
重点②:
为什么要创建一个字节数组?
答:我们也可以用字节来接收,每次打印一个字节。但是用字节数组效率更高,每次可以读取和打印更多的内容。
重点③:
为什么要设置长度参数length?
答:在while语句判断时,就获得read()方法中返回的读取的字节长度。
重点④:
String str = new String(bytes,0,length);创建字符串时为什么要截取字节数组的一部分而不是全部内容呢?
答:首先我们从文件中读取的内容的长度是不可知的,我们的数组容器可能长度超过文件内容,也可能比文件内容长度短。所以我们使用循环读取。第一种情况:当数组容器超过文件内容时,循环执行一次就能把文件内的所有内容读取到字节数组中,但是数组中其他未填充的元素都是0,;如果我们之间将字节数组当做参数来构造字符串并打印,会打印出多余的0;所以我们设置截取字节数组的长度就是read()方法读取的字节长度来构造字符串,这样输出的字符串都是我们从文件中读取的内容。第二种情况:当数组容器小于文件内容,这样会多次循环读取,每次读取的长度为字节数组的长度。在读取数据前,read()方法会先判断当前指针是否有内容,如果没有会返回-1,跳出循环;若有内容则读取完字节数组的长度的内容,然后read指针指向文件中未读取的数据内容。经过多次循环,可能最后文件中剩余的内容小于或等于数组长度,如果等于数组长度则刚好将数组填满,此时构造字符串时无需截取数组。但是更多的情况是文件中剩余的内容小于数组长度。此时数组中的元素仍然有上一次循环所赋予的值,此时将文件中的内容读取到数组,会不完全的覆盖旧数组的内容,此时如果直接将字节数组用于构造字符串打印,会多打印上一次循环超过此次循环读入数据长度的部分。所以我们一般都要用length参数进行限制,打印的内容必须是我们读的内容,否则可能存储和打印错误。
应用:
1、文件的拷贝(复制)
现在桌面上有一个文件,我们如何实现将此文件拷贝到一个新文件呢?
现有文件:naruto.jpg
文件路径:C:\\Users\\lc\\Desktop\\naruto.jpg
源码与注释:
拷贝方法:
main方法:
运行结果:
文件拷贝成功实现!