本帖最后由 小刀葛小伦 于 2019-11-29 16:54 编辑
JAVA中IO的使用
Java.io包基本包含了初学java所需要使用的所有输入输出相关内容,io中的流类又包含了输入流和输出流两大类。通过io包我们基本可以操作本地硬盘上的所有文件。本篇将基本的介绍一下File的相关知识,以便为后面学习流相关操作做相关知识准备。
1.File初识
File的构造方法:
先一个一个看一下吧,第一个方法有两个参数,前面一个是File类型,后面是String,也就是说,你要给他的前一个参数是一个文件(File),后面一个是你要创建的文件的名字,那这意思就很明显,前面一个是你父文件夹的对象(强调一下,是一个File类型的对象),后面一个参数是你要创建的文件的名字呗。那第一个去跟第三个比较一下,方法三,前一个参数是String,那很明显就是父文件的名字了,后面一个是文件的名字。那再来看看第二个方法,直接给一个String类型的参数,在这个方法你可以直接给一个绝对路径,或者相对路径也可以。真正开发中第二个方法是最常用的。至于第四个方法,File通过将给定URI转换为抽象路径名来创建新实例 。这个方法前期基本用不到的。这里就不多说了。
那这个File是个啥呢?一开始你知道他是文件,那么你在敲代码的时候简单创建了一个File对象输入文件的路径,ok!完事了,我成功创建了一个文件!
可是并没什么luan用,因为这里创建的File与本地硬盘上对应的文件完全没有任何关系。你以为你现在就能操作文件了?
那你试一下看看文件存在吗,你再输出一下看看
[Java] 纯文本查看 复制代码 File file = new File("D://java//TsetFile//test.txt");
System.out.println(file.exists());
你会发现,嗯?false???
那也就是说文件不存呗。所以其实,这里的File与真实硬盘中的文件或者文件夹不是一个东西,我们所说的Flie只是内存中的一个对象,file是需要我们去new的,就像集合,类对象一样,我们都是在虚拟机中(确切的说是在堆内存中)为它开辟一个空间。而我们要操作的却是硬盘上的文件,所以实际上,这个file与硬盘上的文件实质上是一个映射的关系。
换句话说,如果你创建文件时的路径是正确的,ok,那么你成功“射”上去了。路径不正确,那就是你没射上呗。所以你看即使我创建的文件是不存在的,编译时也没报错。大不了我们操作不了这个文件而已,File的一些初始值(比如 :可读?可写?可操作性?)都是false而已。
[Java] 纯文本查看 复制代码 File file = new File("D://java//TsetFile//test.txt");
System.out.println(file.exists());
System.out.println(file.isFile());
System.out.println(file.isHidden());
System.out.println(file.canRead());
System.out.println(file.canWrite());
全是false
但是之后当我们用到流的相关技术(后面会写到)去操作文件时,那时候就会报错了。(这里提一嘴,在我们本地硬盘上(windows系统是这样),文件是不区分大小写的,但是我们在编程时,我们写的code是有大小写区分的)
2.File常用的几个方法
这里简单说几个File的常用方法吧
createNewFile
创建一个新的文件,这个只能创建文件,举个栗子,
[Java] 纯文本查看 复制代码 File file = new File("D://java//TestFile//test.txt");
try {
file.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
刚刚上面不是发现这个文件没有对吧,那现在就可以用createNewFile创建一个了。那问题来了,如果我test后面的txt没写呢?
那试一下嘛,
看见了吧,没有后缀它还是会创建出来,只不过打开的时候你要选择打开方式。那又有一个问题,如果我的父文件夹不存在呢?ok那我们再试一下?
这还试个锤子,肯定不行啊,没有父亲哪来的孩子呢。那会不会再帮我们创建一个新的文件夹?肯定不可能啊!在最初就已经说了,createNewFile只能创建文件。那要创建文件夹怎么办,看下面的方法
mkdir和mkdirs
mkdir可以帮你创建一个新的文件夹,那如果这个文件夹没有父亲怎么办?mkdirs呗,+s变复数都是小学英语了。
但是记住你这次创建的是文件夹嗷,可别把后缀名给写上去了。那如果还真的傻乎乎的写上去了怎么办?没关系!
[Java] 纯文本查看 复制代码 File file = new File("D://java//TestFile//test.txt");
file.mkdir();
你创建的文件夹就叫test.txt。莫慌,问题不大。所以java在创建文件夹还是文件时,取决于你调用的方法,方法的优先级更高。
delete
没什么好说的,就是删除文件
但是千万要慎用,因为这里delete之后,那就真的删除了,你连回收站都找不到它。别傻乎乎的在后面的参数里面写个(C:\),不信你就试试。
另起一行! 声明一下:你系统没了跟我可没关系啊!!!
声明:
getName和getPath
getName获取文件名,getPath是获取文件的路径名,返回值都是String类型的,所以懂我意思了吧。
getParent和getParentFile
getParent返回值是String,所以是当前文件父文件夹的名字,getParentFile返回值是File类型,那不返回父对象呗。
list和listFiles
直接上代码
[Java] 纯文本查看 复制代码 File newfile = new File("D://java//TestFile//test");
String[] str = newfile.list();
System.out.println(str.length);
System.out.println(str[0]);
File[] values = newfile.listFiles();
System.out.println(values.length);
System.out.println(values[0]);
就以test文件夹下有个test.txt为例子
list返回的是String[ ],一个String数组,String存放的那只能是字符串了,所以就是子文件和子文件夹的名字。listFiles返回的是File[ ] 类型,所以是子文件和子文件夹的对象。看一下输出结果
[Java] 纯文本查看 复制代码 1
test.txt
1
D:\java\TestFile\test\test.txt
那总结一下:
file对象为空,证明当前file是一个文件而不是文件夹
file对象不为空,证明当前file是一个文件夹
file对象的length不等于0,证明当前file文件夹里面有东西
那又有一个小问题既然我能获取到当前文件夹的子文件和子文件夹,那么我们怎么去获取当前文件夹的所有的子文件呢。循环?循环能达到我们的遍历要求吗?最后一个知识点,递归。
File的递归
[Java] 纯文本查看 复制代码 public void FindAllFiles(File file){//先把你要遍历的文件夹传进来
File[] files = file.listFiles();//files数组接收file的所有子文件(夹)
if(files!=null&&files.length>0){//之前已经说过了,file对象不为空且length大于0才表示里面有元素
for(File f:files){//for-each访问每一个元素
this.FindAllFiles(f);//这里就是递归了 如果当前file内有元素,那就再进去访问一次
}
}
System.out.println(file.getAbsoluteFile());
}
递归一直都是一种很重要的算法思想,文件的遍历就很好的利用了这种思想。
File的常见基础知识就基本都在这了,其实还有很多没有提及的File方法,要是感兴趣可以去Oracle官网多看看。
|