IO
Input:输入,从持久设备到内存;Output:输出,从内存到持久设备
File类
我们学习IO目的就是实现内存和持久设备(硬盘)之间的数据交互。有一个问题:硬盘上都有什么?文件和文件夹。我们要学习IO,实现与硬盘交互,很明显最终数据一定是写在某个文件夹下的某个文件中。程序中要与文件交互,Java是面向对象的语言,必须对文件和文件夹也用对象来描述。描述文件和文件夹的就是File类。
File类的构造函数
* public File(String pathname) 根据文件或文件夹的路径名封装一个File对象
* public File(String parent,String child) 根据父目录的路径名和儿子的名称封装一个File对象
* public File(File parent,String child) 根据父目录的File对象和儿子的名称封装一个File对象
* 注意:File类代表的是文件或目录的路径名的抽象表示形式,因此对应的文件不一定存在的!
public static void main(String[] args) {
// public File(String pathname) 根据文件或文件夹的路径名封装一个File对象
File file = new File("D:\\test\\1.txt");
System.out.println(file);
// public File(String parent,String child) 根据父目录的路径名和儿子的名称封装一个File对象
File file2 = new File("D:\\test","1.txt");
System.out.println(file2);
// public File(File parent,String child) 根据父目录的File对象和儿子的名称封装一个File对象
File parent = new File("D:\\test");
File file3 = new File(parent,"1.txt");
System.out.println(file3);
}
运行结果:
File类的创建功能
* public boolean createNewFile() 创建文件,如果不存在才创建,并且返回true;如果存在返回false
* public boolean mkdir() 创建文件夹,如果不存在才创建,并且返回true;如果存在返回false
* public boolean mkdirs() 创建目录,如果父目录中有不存在的,一并创建。
*
* 注意:
* A:如果创建文件时,父目录不存在,会抛出异常!
* B:创建文件夹时,如果父目录不存在,不抛异常,返回false
* C:创建文件或文件夹时,我们要注意必须调用对应的方法。否则:
* 名字叫jpg的不一定是图片,也有可能是文件夹!
* D:相对路径和绝对路径
* 绝对路径:带有根目录的路径,明确指向某一个固定的位置。
* 相对路径:不带根目录的路径,无法确定一个具体的位置。相对于一个位置的路径
* 在我们IO中,如果使用相对路径,都是相对于当前项目所在路径
* 所以,如果我们使用相对路径,创建文件或文件夹,会创建到当前项目目录下
public static void main(String[] args) throws IOException {
// 需求:创建D:\\test\\1.txt
File file = new File("D:\\test\\1.txt");
// public boolean createNewFile() 创建文件
System.out.println(file.createNewFile());
// 创建文件夹 D:\\demo
File file3 = new File("D:\\demo");
System.out.println(file3.mkdir());
// 需求:创建 D:\\aaa\\bbb\\ccc
File file4 = new File("D:\\aaa\\bbb\\ccc");
System.out.println(file4.mkdir());
System.out.println(file4.mkdirs());
// 需求:创建D:\\test\\2.jpg
File file5 = new File("D:\\test\\2.jpg");
System.out.println(file5.mkdir());
File file6 = new File("3.txt");
System.out.println(file6.createNewFile());
File file7 = new File("demo");
System.out.println(file7.mkdir());
}
运行结果:
File类的删除方法
* boolean delete() 删除此抽象路径名表示的文件或目录
注意:
* A:java的删除不走回收站。
* B:如果文件夹下还有儿子,我们就不能直接删除。必须先删除儿子
public static void main(String[] args) throws IOException {
// 需求:我创建一个demo\\aaa\\bbb
File file = new File("demo\\aaa\\bbb");
System.out.println(file.mkdirs());
// 需求:在创建一个demo\\aaa\\2.txt
File file2 = new File("demo\\aaa\\2.txt");
System.out.println(file2.createNewFile());
// 演示删除功能:
// boolean delete() 删除此抽象路径名表示的文件或目录
// 需求:删除3.txt
File file3 = new File("3.txt");
System.out.println(file3.delete());
// 需求:删除demo\\aaa\\bbb
File file4 = new File("demo\\aaa\\bbb");
System.out.println(file4.delete());
// 需求删除demo
File file5 = new File("demo");
System.out.println(file5.delete());
}
运行结果:
File类的判断功能
* public boolean isDirectory() 判断是否是文件夹
* public boolean isFile() 判断是否是文件
* public boolean exists() 判断是否存在
* public boolean canRead() 判断是否可读
* public boolean canWrite() 判断是否可写
* public boolean isHidden() 判断是否隐藏
public static void main(String[] args) {
File file = new File("D:\\test\\制服诱惑.avi");
System.out.println("isDirectory:" + file.isDirectory());// false
System.out.println("isFile:" + file.isFile());// true
System.out.println("exists:" + file.exists());// true
System.out.println("canRead:" + file.canRead());// true
System.out.println("canWrite:" + file.canWrite());// false
System.out.println("isHidden:" + file.isHidden());// true
}
File类的重命名功能
* public boolean renameTo(File dest) 把当前File对象文件重命名为指定的dest
* 注意:
* A:源和目标在一个目录下,重命名
* B:源和目标不在一个目录,剪切 + 重命名
public static void main(String[] args) {
// 需求:重命名 D:\\test\\ly.jpg 为 柳岩.jpg
// 封装源文件的File对象
File src = new File("D:\\test\\ly.jpg");
// 封装目标文件的File对象
File dest = new File("柳岩.jpg");
// 重命名
System.out.println(src.renameTo(dest));// true
}
File类的基本获取功能
* public String getAbsolutePath() 获取绝对路径
* public String getPath() 获取的是,创建File对象时传递的路径
* public String getName() 获取名称
* public long length() 获取文件的字节个数
* public long lastModified() 获取最后修改的时间,返回的是毫秒值
public static void main(String[] args) {
// 封装File对象
File file = new File("demo\\aaa\\2.txt");
System.out.println("getAbsolutePath: " + file.getAbsolutePath());// E:\workspace\demo\aaa\2.txt
System.out.println("getPath: " + file.getPath());// demo\aaa\2.txt
System.out.println("getName: " + file.getName());// 2.txt
System.out.println("length: " + file.length());// 5
System.out.println("lastModified: " + file.lastModified());// 1483092042410
long time = file.lastModified();
Date date = new Date(time);
System.out.println(date.toLocaleString());// 2018-11-25 10:47:22
}
File类的高级获取功能
* 需求:扫描D:\\test下的所有子文件和子文件夹,并且打印绝对路径
* String[] list() 获取当前目录下的所有儿子的名称的数组
* File[] listFiles() 获取当前目录下的所有儿子File对象的数组
* 思路:
* A:封装父文件夹的File对象
* B:获取父目录下的所有儿子的数组
* C:循环遍历,获取每一个儿子
* D:打印绝对路径
*
* 注意:调用这两个方法的必须是文件夹,不能是文件!否则返回null
public static void main(String[] args) {
// A:封装父文件夹的File对象
File parent = new File("D:\\test");
// B:获取父目录下的所有儿子的数组
// String[] list() 获取当前目录下的所有儿子的名称的数组
String[] names = parent.list();
// C:循环遍历,获取每一个儿子的名称
for( String name : names){
// 如果我获取了儿子的File对象,就可以获取儿子的绝对路径
// 封装儿子的File对象
File file = new File(parent,name);
// D:打印绝对路径
System.out.println(file.getAbsolutePath());
}
// 封装父目录的File对象
File parent2 = new File("D:\\test");
// 获取父目录下的所有儿子的File数组
File[] files = parent2.listFiles();
// 循环遍历,取出每个儿子的File对象
for( File file : files){
// 打印绝对路径
System.out.println(file.getAbsolutePath());
}
File file = new File("柳岩.jpg");
String[] arr = file.list();
System.out.println(arr);// null
}
File类应用演示
演示:过滤D:\\下,以及子目录中扩展名是.jpg的文件,输出其绝对路径
// 递归扫描文件夹的方法
public static void scanFolders(File dest) {
// 判断传进来的是否是文件夹
if(dest.isFile()){
throw new RuntimeException("哥们,不要给我传文件,我只扫文件夹!");
}
// B:获取目标文件夹下的所有儿子的数组
File[] files = dest.listFiles();
// 这里高级for报空指针,一定是files为null。那么为什么会是null?
// 这里有一个特殊现象:如果一个文件夹,我们没有访问的权限,那么也会返回null
// 如果无权限,我们无法解决,只能跳过
if( files != null){
// C:循环遍历,取出每个儿子
for( File file : files){
// D:判断是否是文件夹
if( file.isDirectory()){
// 是:回到步骤B
scanFolders(file);
}else{
// 否:判断是否是jpg文件
if( file.getName().endsWith(".jpg")){
// 是:打印绝对路径
System.out.println(file.getAbsolutePath());
}
}
}
}
}
测试:
public static void main(String[] args) {
// A:封装目标文件夹的File对象
File dest = new File("D:\\");
// 调用递归扫描方法
scanFolders(dest);
}
运行结果: