IO流
一、File
Io概述:
当需要把内存中的数据存储到持久化设备上这个动作称为输出(写)Output操作。
当把持久设备上的数据读取到内存中的这个动作称为输入(读)Input操作。
因此我们把这种输入和输出动作称为IO操作。
File类的构造函数:
文件及文件夹的一系列操作方法:
代码实现:
1 package com.oracle.io;
2
3 import java.io.File;
4 import java.io.IOException;
5
6 //File 类包含
7 //1.路径 path e:\\java_code\\day22e\\hello.java
8 //2.目录 directory 文件夹
9 //3.文件 file
10 public class Demo01 {
11 public static void main(String[] args) throws IOException {
12 /*method2();
13 method3();
14 method4();
15 method5();
16 method6();
17 method7();
18 method8();
19 method9();*/
20 method10();
21 }
22 public static void method1(){
23 //与系统有关的路径分隔符win ; Linux :
24 System.out.println(File.pathSeparator);
25 //与系统有关的名称分隔符win \ Linux /
26 System.out.println(File.separator);
27 }
28 public static void method2(){
29 //File类构造方法不会给你检验这个文件或者文件夹是否真实存在
30 //File file=new File("X:\\test\\a.txt");
31 //File file=new File("X:","test");
32 File f1=new File("X:\\test");
33 File file=new File(f1,"a.txt");
34 System.out.println(file);
35 }
36 public static void method3(){
37 //File file=new File("X:\\test\\a.txt");
38 File file=new File("src");
39 //相对路径走的是本工程路径
40 System.out.println(file.getAbsolutePath());
41
42 }
43 public static void method4(){
44 //获取本路径目录名或者文件名
45 File file=new File("X:\\test\\a.txt");
46 System.out.println(file.getName());
47 //getPath()和toString()一个作用
48 System.out.println(file.getPath());
49 //返回文件的长度long(字节数)
50 System.out.println(file.length());
51 }
52 public static void method5() throws IOException{
53 //创建文件(只能创建文件不能创建文件夹)
54 File file=new File("X:\\test\\b.txt");
55 boolean flag=file.createNewFile();
56 System.out.println(flag);
57 }
58 public static void method6(){
59 //创建文件夹(不能创建文件)
60 File file=new File("X:\\test\\e\\f");
61 //boolean flag=file.mkdir();//单级目录
62 boolean flag=file.mkdirs();//多级目录
63 System.out.println(flag);
64 }
65 public static void method7(){
66 //删除文件或文件夹
67 //直接从硬盘上删除,不走回收站
68 //删除需谨慎
69 File file=new File("X:\\test\\b.txt");
70 boolean flag=file.delete();
71 System.out.println(flag);
72 }
73 public static void method8(){
74 File file=new File("X:\\test\\a.txt");
75 //判断file对象表示的文件或文件夹是否真实存在
76 //boolean flag=file.exists();
77 //判断是否是文件夹
78 //boolean flag=file.isDirectory();
79 //是否是文件
80 boolean flag=file.isFile();
81 System.out.println(flag);
82 }
listFiles()方法介绍
83 public static void method9(){
84 File file=new File("X:\\test");
85 //获取此路径下所有的文件或文件夹的字符串名称
86 String[] files=file.list();
87 for(String s:files){
88 File f1=new File(file,s);
89 if(f1.getName().equals("a.txt")){
90 f1.delete();
91 }
92 }
93 }
94 public static void method10(){
95 File file=new File("X:\\test");
96 File[] files=file.listFiles();
97 for(File f:files){
98 System.out.println(f);
99 }
100 }
101
102 }
注意:在获取指定目录下的文件或者文件夹时必须满足下面两个条件
1,指定的目录必须是存在的,
2,指定的必须是目录。否则容易引发返回数组为null,出现NullPointerException
文件过滤器:
1 package com.oracle.io;
2
3 import java.io.File;
4 import java.io.FileFilter;
5
6 public class MyFilter implements FileFilter{
7
8
9 public boolean accept(File pathname) {
10 /* String name=pathname.getName().toLowerCase();
11 boolean flag=name.endsWith(".java");*/
12 return pathname.getName().toLowerCase().endsWith(".java");
13 }
14
15 }
16
17 import java.io.File;
18
19 public class Demo02 {
20 public static void main(String[] args) {
21 File file=new File("x:\\test");
22 File[] files=file.listFiles(new MyFilter());
23 for(File f:files){
24 System.out.println(f);
25 }
26 }
27 }
图解:
文字解:
有参:
当listFile获取路径时,会调用accept方法,然后把路径传过去,运行accept方法,如果返回true,则存进
File数组中,反之;如果返回false,就不存;最后遍历输出结果。
无参:
1 import java.io.File;
2
3 //获取某目录下所有的文件
4 public class Demo03 {
5
6 public static void main(String[] args) {
7 File file=new File("x:\\test");
8 getAllFile(file);
9
10 }
11 public static void getAllFile(File file){
12 //获取该目录下的文件及文件夹
13 File[] files=file.listFiles();
14 //遍历
15 for(File f:files){
16 if(f.isDirectory()){
17 getAllFile(f);
18 }else{
19 System.out.println(f);
20 }
21 }
22 }
23 }
文解:
创建一个File数组,调用无参方法;进行遍历,先进行判断,如果f是文件夹的话,则遍历到它的子目录,
讲子目录下的文件存入数组,反之打印遍历到的所有文件。
递归
递归分为两种,直接递归和间接递归。
直接递归称为方法自身调用自己。
举例:
1 public class Demo04 {
2 //递归:要运行的方法主体不变,而参与运行的方法参数会变
3 //递归必须要写一个程序出口,否则该程序没有意义
4 public static void main(String[] args) {
5 getNum(3);
6 }
7 //计算1-100的和,用递归做
8 public static int getNum(int n){
9 if(n==1){
10 return 1;
11 }
12 return n+getNum(n-1);
13 }
14
15 }
递归打印所有子目录中的文件路径
1 public class YourFilter implements FileFilter{
2
3 public boolean accept(File pathname) {
4 //如果是文件夹,则不进行过滤,认为满足条件加到File数组中
5 if(pathname.isDirectory()){ 判断是否是文件夹
6 return true; 是则不过滤并存入数组
7 }else{
8 return pathname.getName().toLowerCase().endsWith(".java"); 反之打印带有.java后缀的文件
9 }
10 }
11
12 }
1 public class Demo05 {
2
3 public static void main(String[] args) {
4 File file=new File("x:\\test");
5 getAllFile(file);
6
7 }
8 public static void getAllFile(File file){
9 File[] files=file.listFiles(new YourFilter());
10 for(File f:files){
11 if(f.isDirectory()){ 判断是否是文件夹
12 getAllFile(f); 显示子目录存入数组
13 }else{
14 System.out.println(f); 反之打印文件
15 }
16 }
17 }
18
19 }
搜索指定目录中的.java文件(含子目录)
1 public class FileDemo4 {
2 public static void main(String[] args) {
3 File file = new File("d:\\test");
4 getFileAll(file);
5 }
6 //获取指定目录以及子目录中的所有的文件
7 public static void getFileAll(File file) {
8 File[] files = file.listFiles(MyFileFilter());
9 //遍历当前目录下的所有文件和文件夹
10 for (File f : files) {
11 //判断当前遍历到的是否为目录
12 if(f.isDirectory()){
13 //是目录,继续获取这个目录下的所有文件和文件夹
14 getFileAll(f);
15 }else{
16 //不是目录,说明当前f就是文件,那么就打印出来
17 System.out.println(f);
18 }
19 }
20 }
21 }
22
23 //定义类实现文件名称FilenameFilter过滤器
24 class MyFileFilter implements FilenameFilter{
25 public boolean accept(File dir, String name) {
26 return name.endsWith(".java");
27 }
28 }
8.20总结:
1.学习了IO流的概念;File类的构造函数以及获取的各种常用方法;
学了文件及文件夹的创建与删除等常用方法;
学了如何获取一个目录下的所有文件及文件夹的方法;
2.学习了文件过滤器,通过实现接口调用accept方法进行过滤器文件名;
3.学习了递归的概念;计算数的和以及打印所有子目录中的文件路径。