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.学习了递归的概念;计算数的和以及打印所有子目录中的文件路径。

 

posted @ 2018-08-20 17:04  文昭  阅读(113)  评论(0编辑  收藏  举报