大数据之路week05--day01(I/O流阶段一 之File)
众所周知,我们电脑中有许许多多的文件夹和文件,文件的形式也有许多不同的格式,文件夹中也可以新建文件夹的存在,也就是多层的一步一步的嵌套。
我们想要实现I/O操作,就必须知道硬盘上文件的表现形式。
而Java就提供了一个类FIle供我们使用。
File:
文件和目录(文件夹)路径名的抽象表现形式
构造方法:
File(String pathname) 通过将给定的路径名字符串转换为抽象路径名来创建新的 File实例。
File(File parent, String child) 从父抽象路径名和子路径名字符串创建新的 File实例。
File(String parent, String child) 从父路径名字符串和子路径名字符串创建新的 File实例。
以上三种的方式实现的效果一样,但是具体要使用哪种构造方法,就得看情况去使用
代码体现:
1 package com.wyh.File文件; 2 3 import java.io.File; 4 5 /** 6 7 * 创建时间:2019年11月30日 下午12:59:33 8 9 * 项目名称:practise09_IO流(2) 10 11 * @author WYH 12 13 * @version 1.0 14 15 * @since JDK 1.8.0 16 17 * 文件名称:FileDemo1.java 18 19 * 类说明: 20 * File 文件和目录路径名的抽象表示。 21 * File(String pathname) 通过将给定的路径名字符串转换为抽象路径名来创建新的 File实例。 22 * File(File parent, String child) 从父抽象路径名和子路径名字符串创建新的 File实例。 23 * File(String parent, String child) 从父路径名字符串和子路径名字符串创建新的 File实例。 24 */ 25 26 public class FileDemo1 { 27 public static void main(String[] args) { 28 //File(String pathname) 通过将给定的路径名字符串转换为抽象路径名来创建新的 File实例。 29 File file1 = new File("D://Test//a.txt"); 30 31 //File(File parent, String child) 从父抽象路径名和子路径名字符串创建新的 File实例。 32 File file2 = new File("D://Test","a.txt"); 33 34 //File(String parent, String child) 从父路径名字符串和子路径名字符串创建新的 File实例。 35 File file3 = new File("D://Test"); 36 File file4 = new File(file3,"a.txt"); 37 38 39 40 } 41 42 }
说完了怎么获取到实例,就要去操作它,我们首先想到的是怎么用代码实现新建文件夹和文件,还有如何一次性创建多级文件夹呢?
boolean createNewFile() 当且仅当具有该名称的文件尚不存在时,原子地创建一个由该抽象路径名命名的新的空文件。 如果当前文件存在就返回False
boolean mkdir() 创建由此抽象路径名命名的目录。 如果当前文件夹存在就返回False
boolean mkdirs()创建由此抽象路径名命名的目录,包括任何必需但不存在的父目录。 简单来说就是创建多级目录,如果该文件夹目录存在,就返回false
代码实现:(注意:到底是创建文件还是文件价你最清楚,不要调用错了。)
1 package com.wyh.File文件; 2 3 import java.io.File; 4 import java.io.IOException; 5 6 /** 7 * 8 * 创建时间:2019年11月30日 下午12:59:33 9 * 10 * 项目名称:practise09_IO流(2) 11 * 12 * @author WYH 13 * 14 * @version 1.0 15 * 16 * @since JDK 1.8.0 17 * 18 * 文件名称:FileDemo1.java 19 * 20 * 类说明: File 文件和目录路径名的抽象表示。 21 * boolean createNewFile() 当且仅当具有该名称的文件尚不存在时,原子地创建一个由该抽象路径名命名的新的空文件。 如果当前文件存在就返回False 22 * boolean mkdir() 创建由此抽象路径名命名的目录。 如果当前文件夹存在就返回False 23 * boolean mkdirs()创建由此抽象路径名命名的目录,包括任何必需但不存在的父目录。 简单来说就是创建多级目录,如果该文件夹目录存在,就返回false 24 * 25 * 26 */ 27 28 public class FileDemo2 { 29 public static void main(String[] args) throws IOException { 30 // boolean mkdir() 创建由此抽象路径名命名的目录。 31 File file1 = new File("D://Test//demo"); 32 System.out.println("mkdir():" + file1.mkdir()); 33 34 // boolean createNewFile() 当且仅当具有该名称的文件尚不存在时,原子地创建一个由该抽象路径名命名的新的空文件。 35 File file2 = new File("D://Test//demo//a.txt"); 36 System.out.println("createNewFile():" + file2.createNewFile()); 37 38 //boolean mkdirs()创建由此抽象路径名命名的目录,包括任何必需但不存在的父目录。 简单来说就是创建多级目录,如果该文件夹目录存在,就返回false 39 File file3 = new File("D://aaa//bbb//ccc"); 40 System.out.println("mkdirs():"+file3.mkdirs()); 41 42 //boolean mkdirs() 例子2 43 //该方法只能创建文件夹 44 //骑白马的不一定是王子,也可能是唐僧 45 //创建了wyh文件夹里再创建了叫作a.txt的文件夹 46 File file4 = new File("D://wyh//a.txt"); 47 System.out.println("mkdirs():"+file4.mkdirs()); 48 49 } 50 51 }
那么。我们学会了如何创建,就紧接着就是如何删除呢?
delete()
1、删除文件和文件夹,如果在创建文件或者文件夹的时候,忘记写盘符了,默认路径是项目路径下
2、Java中的删除不走回收站
3、如果要删除一个文件夹,请注意该文件夹下面不能有文件夹和文件
代码实现:
1 package com.wyh.File文件; 2 3 import java.io.File; 4 import java.io.IOException; 5 6 /** 7 * 8 * 创建时间:2019年11月30日 下午12:59:33 9 * 10 * 项目名称:practise09_IO流(2) 11 * 12 * @author WYH 13 * 14 * @version 1.0 15 * 16 * @since JDK 1.8.0 17 * 18 * 文件名称:FileDemo1.java 19 * 20 * 类说明: 21 * 1、删除文件和文件夹,如果在创建文件或者文件夹的时候,忘记写盘符了,默认路径是项目路径下 22 * 2、Java中的删除不走回收站 23 * 3、如果要删除一个文件夹,请注意该文件夹下面不能有文件夹和文件 24 */ 25 26 public class FileDemo3 { 27 public static void main(String[] args) throws IOException { 28 File file1 = new File("a.txt"); 29 System.out.println("a.txt:"+file1.createNewFile()); 30 31 File file2 = new File("aaa//bbb//ccc"); 32 System.out.println("file2:"+file2.mkdirs()); 33 34 File file3 = new File("a.txt"); 35 System.out.println("删除文件:"+file3.delete()); 36 37 File file4 = new File("aaa//bbb//ccc"); 38 System.out.println("删除文件夹:"+file4.delete()); 39 40 //如果要删除一个文件夹,请注意该文件夹下面不能有文件夹和文件 41 File file5 = new File("aaa"); 42 System.out.println("删除文件夹:"+file5.delete()); 43 44 45 } 46 47 }
再后来,我们在现实生活中,更多的会在新建文件夹或者文件之后就会去重命名这个文件夹或者是文件,那么如何给文件夹或者文件重命名呢?
如果路径不一致会发生什么呢?我们来看看:
1 package com.wyh.File文件; 2 3 import java.io.File; 4 import java.io.IOException; 5 6 /** 7 * 8 * 创建时间:2019年11月30日 下午12:59:33 9 * 10 * 项目名称:practise09_IO流(2) 11 * 12 * @author WYH 13 * 14 * @version 1.0 15 * 16 * @since JDK 1.8.0 17 * 18 * 文件名称:FileDemo4.java 19 * 20 * 类说明: 21 * 重命名 22 * 23 */ 24 25 public class FileDemo4 { 26 public static void main(String[] args) throws IOException { 27 /*//如果路径一致,那么就是重命名 28 File file1 = new File("timg.jpg"); 29 File newFile = new File("刘昊然.jpg"); 30 System.out.println("renameTo:"+file1.renameTo(newFile));*/ 31 32 //如果路径不一致,那么就是剪切并且重命名 33 File file2 = new File("刘昊然.jpg"); 34 File newFile2 = new File("D://帅气的刘昊然.jpg"); 35 System.out.println("renameTo2:"+file2.renameTo(newFile2)); 36 37 38 } 39 40 }
经过观察结果发现,
1、如果路径一致,那么得到的效果就是重命名
2、如果路径不一致,那么得到的效果就是剪切并且重命名
好了,到这里,我们掌握了如何创建,删除和重命名这些基本的操作,但是呢,如果想要结合操作,这些方法肯定是不够的。
我们来看看File类的判断功能:
boolean isDirectory() 测试此抽象路径名表示的文件是否为目录。
boolean isFile() 测试此抽象路径名表示的文件是否为普通文件。
boolean isHidden() 测试此抽象路径名命名的文件是否为隐藏文件。
boolean exists() 测试此抽象路径名表示的文件或目录是否存在。
boolean canRead() 测试应用程序是否可以读取由此抽象路径名表示的文件。
boolean canWrite() 测试应用程序是否可以修改由此抽象路径名表示的文件。
代码实现:
1 package com.wyh.File文件; 2 3 import java.io.File; 4 import java.io.IOException; 5 6 /** 7 * 8 * 创建时间:2019年11月30日 下午12:59:33 9 * 10 * 项目名称:practise09_IO流(2) 11 * 12 * @author WYH 13 * 14 * @version 1.0 15 * 16 * @since JDK 1.8.0 17 * 18 * 文件名称:FileDemo4.java 19 * 20 * 类说明: 21 * 判断功能 22 * boolean isDirectory() 测试此抽象路径名表示的文件是否为目录。 23 * boolean isFile() 测试此抽象路径名表示的文件是否为普通文件。 24 * boolean isHidden() 测试此抽象路径名命名的文件是否为隐藏文件。 25 * boolean exists() 测试此抽象路径名表示的文件或目录是否存在。 26 * boolean canRead() 测试应用程序是否可以读取由此抽象路径名表示的文件。 27 * boolean canWrite() 测试应用程序是否可以修改由此抽象路径名表示的文件。 28 * 29 * 30 */ 31 32 public class FileDemo5 { 33 public static void main(String[] args) throws IOException { 34 File file = new File("a.txt"); 35 System.out.println("isDirectory():"+file.isDirectory()); 36 System.out.println("isFile():"+file.isFile()); 37 System.out.println("isHidden():"+file.isHidden()); 38 System.out.println("exists():"+file.exists()); 39 System.out.println("canRead():"+file.canRead()); 40 System.out.println("canWrite():"+file.canWrite()); 41 42 43 } 44 45 }
说完了判断功能,我们在想想,有时候我们会在一个软件发送或者接收的时候,是不是都会弹出来给你去选择,这些文件(夹)名和一些属性,是怎么来的呢?
说明File类还有一种功能,那就是获取功能:
先来说说基本的获取功能:
String getAbsolutePath() 返回此抽象路径名的绝对路径名字符串。
String getPath() 将此抽象路径名转换为路径名字符串。
String getName() 返回由此抽象路径名表示的文件或目录的名称。
long lastModified() 返回此抽象路径名表示的文件上次修改的时间。 拿到的是毫秒值
long length() 返回由此抽象路径名表示的文件的长度。 字节数
代码实现:
1 package com.wyh.File文件; 2 3 import java.io.File; 4 import java.io.IOException; 5 import java.text.SimpleDateFormat; 6 import java.util.Date; 7 8 /** 9 * 10 * 创建时间:2019年11月30日 下午12:59:33 11 * 12 * 项目名称:practise09_IO流(2) 13 * 14 * @author WYH 15 * 16 * @version 1.0 17 * 18 * @since JDK 1.8.0 19 * 20 * 文件名称:FileDemo6.java 21 * 22 * 类说明: 23 * 基本获取功能: 24 * String getAbsolutePath() 返回此抽象路径名的绝对路径名字符串。 25 * String getPath() 将此抽象路径名转换为路径名字符串。 26 * String getName() 返回由此抽象路径名表示的文件或目录的名称。 27 * long lastModified() 返回此抽象路径名表示的文件上次修改的时间。 拿到的是毫秒值 28 * long length() 返回由此抽象路径名表示的文件的长度。 字节数 29 * 30 * 31 */ 32 33 public class FileDemo6 { 34 public static void main(String[] args) throws IOException { 35 File file = new File("demo//test.txt"); 36 System.out.println("getAbsolutePath():"+file.getAbsolutePath()); 37 System.out.println("getPath():"+file.getPath()); 38 System.out.println("getName():"+file.getName()); 39 System.out.println("lastModified():"+file.lastModified()); 40 System.out.println("length():"+file.length()); 41 42 //1575107921343毫秒值 43 Date d = new Date(1575107921343L); 44 SimpleDateFormat sdf = new SimpleDateFormat(); 45 String s = sdf.format(d); 46 System.out.println(s); //19-11-30 下午5:58 47 48 49 } 50 51 }
这里大家也发现了,我们用 lastModified() 方法获取的是最后一次修改的时间,但是返回的是毫秒值,我们需要手动将它进行转化一下
说完基本的获取功能,那么猜猜看接下来是什么,与基本相对的那就是高级的:
高级获取功能:
public String[] list() 返回一个字符串数组,命名由此抽象路径名表示的目录中的文件和目录。
public File[] listFiles() 返回一个抽象路径名数组,表示由该抽象路径名表示的目录中的文件。
这里要注意的是,这两个方法的返回值类型:一个是String[]数组,一个是File[]类型的数组,区别大家应该都想到了,一个是获取的是文件名数组,一个是文件的数组,通过调用方法就可以拿到文件夹或者文件名
代码实现:
1 package com.wyh.File文件; 2 3 import java.io.File; 4 import java.io.IOException; 5 import java.text.SimpleDateFormat; 6 import java.util.Date; 7 8 /** 9 * 10 * 创建时间:2019年11月30日 下午12:59:33 11 * 12 * 项目名称:practise09_IO流(2) 13 * 14 * @author WYH 15 * 16 * @version 1.0 17 * 18 * @since JDK 1.8.0 19 * 20 * 文件名称:FileDemo6.java 21 * 22 * 类说明: 23 * 高级获取功能: 24 * public String[] list() 返回一个字符串数组,命名由此抽象路径名表示的目录中的文件和目录。 25 * public File[] listFiles() 返回一个抽象路径名数组,表示由该抽象路径名表示的目录中的文件。 26 * 27 * 28 */ 29 30 public class FileDemo7 { 31 public static void main(String[] args) throws IOException { 32 File file = new File("D://"); 33 // String[] files = file.list(); 34 // for(String s : files){ 35 // System.out.println(s); 36 // } 37 38 System.out.println("=================================="); 39 File[] files2 = file.listFiles(); 40 for(File f : files2){ 41 if("BIG_DATA_CLASS".equals(f.getName())){ 42 String[] s2 = f.list(); 43 for(String s : s2){ 44 System.out.println(s); 45 } 46 } 47 // System.out.println(f.getName()); 48 } 49 50 } 51 52 }
说了那么久,来举个小案例练练手:判断D盘下面是否有.jpg文件(注意,一定要进行判断是否是文件!!)
代码实现:
1 package com.wyh.File文件; 2 3 import java.io.File; 4 import java.io.IOException; 5 import java.text.SimpleDateFormat; 6 import java.util.Date; 7 8 /** 9 * 10 * 创建时间:2019年11月30日 下午12:59:33 11 * 12 * 项目名称:practise09_IO流(2) 13 * 14 * @author WYH 15 * 16 * @version 1.0 17 * 18 * @since JDK 1.8.0 19 * 20 * 文件名称:FileDemo6.java 21 * 22 * 类说明: 23 * 判断D盘下面是否有.jpg文件(注意,一定要进行判断是否是文件!!) 24 * 25 * 26 */ 27 28 public class FileDemo8 { 29 public static void main(String[] args) throws IOException { 30 File file = new File("D://"); 31 File[] files = file.listFiles(); 32 for(File f : files){ 33 if(f.isFile()){ //一定要进行判断是否是文件!!,因为有可能文件夹名也是以.jpg结尾的 34 if(f.getName().endsWith(".jpg")){ 35 System.out.println(f.getName()); 36 }else{ 37 continue; 38 } 39 } 40 41 } 42 } 43 44 }
从上面的代码我们可以看出实现了,但是有没有更好的办法呢?
那就是文件名称过滤器,这个是调用构造方法的时候,重写接口中的一个方法,为了方便,这里我使用匿名内部类的方式实现
1 package com.wyh.File文件; 2 3 import java.io.File; 4 import java.io.FilenameFilter; 5 import java.io.IOException; 6 import java.text.SimpleDateFormat; 7 import java.util.Date; 8 9 /** 10 * 11 * 创建时间:2019年11月30日 下午12:59:33 12 * 13 * 项目名称:practise09_IO流(2) 14 * 15 * @author WYH 16 * 17 * @version 1.0 18 * 19 * @since JDK 1.8.0 20 * 21 * 文件名称:FileDemo6.java 22 * 23 * 类说明: 24 * 文件名称过滤 25 * File[] listFiles(FilenameFilter filter) 返回一个抽象路径名数组,表示由此抽象路径名表示的满足指定过滤器的目录中的文件和目录。 26 * String[] list(FilenameFilter filter) 返回一个字符串数组,命名由此抽象路径名表示的目录中满足指定过滤器的文件和目录。 27 * 28 * 29 */ 30 31 public class FileDemo8_2 { 32 public static void main(String[] args) throws IOException { 33 File file = new File("D://"); 34 35 String[] s = file.list(new FilenameFilter() { 36 37 @Override 38 public boolean accept(File dir, String name) { 39 //返回true添加,返回false就不添加 40 /*//方式1 41 File files = new File(dir,name); 42 boolean flag = files.isFile(); 43 boolean flag1 = files.getName().endsWith(".jpg"); 44 return flag && flag1;*/ 45 46 //方式2 (方式 1的优化) 47 return new File(dir,name).isFile() && name.endsWith(".jpg"); 48 49 } 50 }); 51 52 for(String s1 : s){ 53 System.out.println(s1); 54 } 55 56 57 } 58 59 }
至于为什么是为true就加入到其中,false就不加入呢?具体的我们跟进看源码:
好了,到此,我们对File类的使用算是有点了解了。