存储了解:
当我们在执行保存这个操作时,就是将数据持久化保存(二进制),用不同的工具可以以不同的解析方式解析文件(使我们可见),如:用记事本打开图片就会出现很多文字
数据在内存中是临时存储,CPU进行存储,将数据存到硬盘上就可以持久存储
数据出内存就叫做输出,进入内存就叫做输入
软件中想要数据持久化存储,这样的 操作肯定是基于操作系统的。同样的在Java 中,
Java -----> JVM-------->操作系统
I/O 输入输出对象
持久化存储在硬盘上的体现————文件(有很多的属性)
在Java 中就将文件封装成类 File :描述文件和目录文件
File:
1.构造函数:
//1.File 的构造函数
String pathname = "E:\\java\\File";
//File file = new File(pathname);//传入文件地址字符串
//将E:\java\File 这个文件包装成对象,如果这个文件不存在,那么会先创建再包装成对象
// File file = new File("E:\\java","File");//传入父地址和子地址
File f = new File("E:\\java");
File file = new File(f,"File");
构造函数中可以传入:地址常量,地址变量(都是字符串型)/封装的文件对象
为了提高程序的跨平台性:可以使用File 类中的文件分隔符字段 pathSeparator
路径可以是绝对路径也可以是相对路径(在当前程序运行的文件夹下)
2.基本方法:
//基本方法
File F = new File("src"); //传入的是相对路径,在程序运行的同一个文件夹中
String path = F.getPath(); //获取的使File 中封装的路径
String absPathName = F.getAbsolutePath(); //获取绝对路径
String FileName = F.getName(); //获取时间
long size = F.length(); //获取大小
long time = F.lastModified(); //最后一次修改的时间,很有用的一个数据
//得到的时间是毫秒值 格式化输出
String t = DateFormat.getDateTimeInstance(DateFormat.LONG,DateFormat.LONG).format(time);
对于文件的创建,删除,判断
//创建文件
File file = new File("E:\\JAVA\\file");
boolean b1 = file.createNewFile();//当且仅当路径存在且文件不存在时,创建才会成功
System.out.println(b1);
//删除
// boolean b2 = file.delete();//删除不去回收站,要谨慎使用
//System.out.println(b2);
//判断文件夹是否存在
boolean b3 = file.exists();
System.out.println(b3);
对于文件夹的创建,删除,判断
//对于文件夹
File f = new File("E:\\JAVA\\HAHA\\xhixi\\jiji\\XIXI");
//boolean b4 = f.mkdir();
boolean b5 = f.mkdirs();
boolean b6 = f.delete();//只能删除最后一个文件夹,当文件夹正在使用时是无法删除的,文件夹中为空才能删除
boolean b7 = f.isFile();//判断是否为文件
boolean b8 = f.isDirectory();//判断是否为文件夹(目录)
注意在同一路径下,文件夹或者是文件不区分大小写。判断是文件还是文件夹的前提是存在
过滤器:
1.文件名过滤器:实现接口 FilenameFilter 重写 accept() 方法
2.文件过滤器(如:只要目录下的文件夹) :实现接口 FileFilter 重写 accept()
将过滤器传入 获取目录的函数中
ListFile 源码//根据名字过滤
public File[] listFiles(FilenameFilter filter) {
String ss[] = list();//获取目录名称
if (ss == null) return null;//增强健壮性,先判空
ArrayList<File> files = new ArrayList<>();//创建存储文件对象的集合
for (String s : ss)
if ((filter == null) || filter.accept(this, s))
files.add(new File(s, this));//将文件重新封装成对象
return files.toArray(new File[files.size()]);//将集合转化为数组
练习:获取所有的文件
1.递归,遍历获取到的file 如果是文件夹,则获取该文件夹中的目录。是文件夹就获取目录。
for(File f : files){
if(f.isDirectory()){
System.out.println("dir : "+f.getName());
getFile(f);//递归
}
else {
System.out.println("file : " + f.getName());
}
2.基于递归的方法,一旦文件嵌套过深,就容易发生溢出,所以不使用递归和for 循环嵌套
- 每遍历到一个目录,不对其进行遍历,而是将他先临时存储起来
相当于将所有的目录都存储起来(但是被遍历过的目录就要从容器中删除) - 再遍历容器取到的就是目录,然后再对目录进行遍历
- 对从容器中取到的目录遍历时发现目录下还有目录,一样在存储到容器中
(容器应该使用LinkedList 符合队列)
将目录存储到容器中,在容器中进行遍历,遍历到的子目录有存储到容器中,直到容器为空。此时就获取了全部文件。