IO流
当需要把内存中的数据存储到持久化设备上这个动作称为输出(写)Output操作。
当把持久设备上的数据读取到内存中的这个动作称为输入(读)Input操作。
因此我们把这种输入和输出动作称为IO操作。
File类
打开API,搜索File类。阅读其描述:File文件和目录路径名的抽象表示形式。即,Java中把文件或者目录(文件夹)都封装成File对象。也就是说如果我们要去操作硬盘上的文件,或者文件夹只要找到File这个类即可。
通过构造函数创建File对象:
public class FileDemo { public static void main(String[] args) { //File构造函数演示 String pathName = "e:\java_code\day22e\hello.java"; File f1 = new File(pathName);//将Test22文件封装成File对象。注意;有可以封装不存在文件或者文件夹,变成对象。 System.out.println(f1); File f2 = new File("e:\java_code\day22e","hello.java"); System.out.println(f2); //将parent封装成file对象。 File dir = new File("e:\java_code\day22e"); File f3 = new File(dir,"hello.java"); System.out.println(f3); } }
File类的获取
public class FileMethodDemo { public static void main(String[] args) { //创建文件对象 File file = new File("Test22.java"); //获取文件的绝对路径,即全路径 String absPath = file.getAbsolutePath(); //File中封装的路径是什么获取到的就是什么。 String path = file.getPath(); //获取文件名称 String filename = file.getName(); //获取文件大小 long size = file.length(); System.out.println("absPath="+absPath); System.out.println("path="+path); System.out.println("filename="+filename); System.out.println("size="+size); } }
File类的常用操作
package com.oracle.demo01; import java.io.File; import java.io.IOException; public class FileDemo02 { public static void main(String[] args) throws IOException { //创建文件 File f=new File("E:\Users\demo.txt"); boolean b=f.createNewFile(); System.out.println(b); //创建文件夹 File f2=new File("E:\Users\test"); boolean b2=f2.mkdir(); System.out.println(b2); //创建多级文件夹file.mkdirs //删除 File f2=new File("E:\Users\test"); boolean b2=f2.delete(); System.out.println(b2); //判断是否存在 File f=new File("s:\test\aa"); System.out.println(f.exists()); //判断这个文件对象是否是文件夹 System.out.println(f.isDirectory()); //File类中有几个名次 //文件File //目录(文件夹)directory //路径 path //文件的获取 File f=new File("src"); System.out.println(f.getAbsolutePath()); System.out.println(f.getName()); System.out.println(f.getPath()); System.out.println(f.length()); } }
listFiles()方法
package com.oracle.demo01; import java.io.File; public class FileDemo03 { public static void main(String[] args) { /* * ListFiles方法每次循环目录中的文件,循环一次调用 * accept方法,进行判断,如果返回true就存到文件数组中 * * */ File f=new File("C:\Program Files\Java\jdk-9.0.4\bin"); File[] f2=f.listFiles(new MyFilter()); for(File f3:f2) { System.out.println(f3); } } }
package com.oracle.demo01; import java.io.File; public class FileListDemo { public static void main(String[] args) { // TODO Auto-generated method stub //创建获取的路径对象 File f=new File("E:\Users\Administrator\eclipse-workspace"); //获取此路径下文件数组 File[] f2=f.listFiles(); //遍历数组 for(File file:f2) { System.out.println(file); } } }
注意:在获取指定目录下的文件或者文件夹时必须满足下面两个条件
1,指定的目录必须是存在的,
2,指定的必须是目录。否则容易引发返回数组为null,出现NullPointerException
文件过滤器
package com.oracle.demo01; import java.io.File; import java.io.FileFilter; //过滤器 public class MyFilter implements FileFilter{ public boolean accept(File pathname) { String p=pathname.getName(); return p.endsWith(".exe"); if(pathname.isDirectory()) { return true; } String p=pathname.getName().toLowerCase(); return p.endsWith(".exe"); } }
递归
递归,指在当前方法内调用自己的这种现象
package com.oracle.demo02; public class Demo01 { /* * 递归 * */ public static void main(String[] args) { //求1....100的和 //100+99+98+97+... int sum=get(5); System.out.println(sum); } public static int get(int a) { if(a==1) { return 1; } return a*get(a-1); } public static int getsum(int a) { int sum=0; for(int i=1;i<a;i++) { sum+=i; } return sum; } }
注意:递归一定要有条件限定,保证递归能够停止下来,否则会发生栈内存溢出。
在递归中虽然有限定条件,但是递归次数不能太多。否则也会发生栈内存溢出。
递归打印所有子目录中的文件路径
要求:若指定的目录有子目录,那么把子目录中的文件路径也打印出来
步骤:
指定要打印的目录File对象
调用getFileAll()方法
获取指定目录中的所有File对象
遍历得到每一个File对象
判断当前File 对象是否是目录
判断结果为true,说明为目录,通过递归,再次调用步骤2的getFileAll()方法
判断结果为false,说明是文件,打印文件的路径
public class FileDemo2 { public static void main(String[] args) { File file = new File("d:\test"); getFileAll(file); } //获取指定目录以及子目录中的所有的文件 public static void getFileAll(File file) { File[] files = file.listFiles(); //遍历当前目录下的所有文件和文件夹 for (File f : files) { //判断当前遍历到的是否为目录 if(f.isDirectory()){ //是目录,继续获取这个目录下的所有文件和文件夹 getFileAll(f); }else{ //不是目录,说明当前f就是文件,那么就打印出来 System.out.println(f); } } } }
搜索指定目录中的.java文件(含子目录)
要求:编写一个方法用来打印指定目录中的.java文件路径,并进行方法的调用若指定的目录有子目录,那么把子目录中的.java文件路径也打印出来
步骤:
1. 指定要打印的目录File对象
2. 调用getFileAll()方法,传入要打印的目录File对象
2.1 通过FilenameFilter过滤器获取指定目录中的所有.java类型的File对象
2.2 遍历得到每一个File对象
2.3 判断当前File 对象是否是目录
判断结果为true,说明为目录,通过递归,再次调用步骤2的getFileAll()方法
判断结果为false,说明是文件,打印文件的路径
public class FileDemo4 { public static void main(String[] args) { File file = new File("d:\test"); getFileAll(file); } //获取指定目录以及子目录中的所有的文件 public static void getFileAll(File file) { File[] files = file.listFiles(MyFileFilter()); //遍历当前目录下的所有文件和文件夹 for (File f : files) { //判断当前遍历到的是否为目录 if(f.isDirectory()){ //是目录,继续获取这个目录下的所有文件和文件夹 getFileAll(f); }else{ //不是目录,说明当前f就是文件,那么就打印出来 System.out.println(f); } } } }
自定义文件过滤器:
//定义类实现文件名称FilenameFilter过滤器 class MyFileFilter implements FilenameFilter{ public boolean accept(File dir, String name) { return name.endsWith(".java"); } }