Java基础-IO流对象之File类
作者:尹正杰
版权声明:原创作品,谢绝转载!否则将追究法律责任。
一.IO技术概述
回想之前写过的程序,数据都是在内存中,一旦程序运行结束,这些数据都没有了,等下次再想使用这些数据,可是已经没有了。那怎么办呢?能不能把运算完的数据都保存下来,下次程序启动的时候,再把这些数据读出来继续使用呢?其实要把数据持久化存储,就需要把内存中的数据存储到内存以外的其他持久化设备(硬盘、光盘、U盘等)上。
当需要把内存中的数据存储到持久化设备上这个动作称为输出(写)Output操作,当把持久设备上的数据读取到内存中的这个动作称为输入(读)Input操作,因此我们把这种输入和输出动作称为IO操作。
二.File类的作用
我们可以一起看看Java的API对File类的描述如下:
综上,我们可以总结File类有以下特点:
1>.将操作系统中的文件(file),目录(文件夹,directory),路径(path),封装成File对象;
2>.File对象提供很多方法可以操作系统中的内容;
3>.File类是与系统无关的类;
三.File类静态的成员变量
我们在编写程序的时候,最好不要把操作系统的分隔符或者是路径的分隔符写死,除非你明确它的执行环境,不然最好还是用变量去代替!File定义了这两个变量,用法如下:
/*
@author :yinzhengjie
Blog:http://www.cnblogs.com/yinzhengjie/tag/Java%E5%9F%BA%E7%A1%80/
EMAIL:y1053419035@qq.com
*/ package cn.org.yinzhengjie.note5; import java.io.File; public class FileDemo {
public static void main(String[] args) {
//与系统有关的路径分隔符,windows用“;”表示,Linux用“:”表示。
String pathseparator = File.pathSeparator;
System.out.println(pathseparator); //与系统有关的默认名称分隔符,Windows为“\”,而Linux以“/”分割
String separator = File.separator;
System.out.println(separator); }
} /*
以上代码执行结果如下:
;
\
*/
四.File类构造方法
1>.File(String pathname)
传递路径名:可以写到文件夹,也可以写到一个文件。该方法发的作用就是将路径封装成File类型对象。
/*
@author :yinzhengjie
Blog:http://www.cnblogs.com/yinzhengjie/tag/Java%E5%9F%BA%E7%A1%80/
EMAIL:y1053419035@qq.com
*/ package cn.org.yinzhengjie.note5; import java.io.File; public class FileDemo {
public static void main(String[] args) {
//注意,windows路径可以写成“\\”进行分割。
File file = new File("D:\\10.Java");
System.out.println(file);
//Linux操作系统就建议用这种方式写,不过在Windows操作系统这样写也是可以的,效果和上面等效!
file = new File("D:/10.Java");
System.out.println(file);
}
} /*
以上代码执行结果如下:
D:\10.Java
D:\10.Java
*/
2>.File(String parent,String child)
传递路径:需要传递字符串父路径(parent)以及字符串子路径(child),用“,”进行分割。
/*
@author :yinzhengjie
Blog:http://www.cnblogs.com/yinzhengjie/tag/Java%E5%9F%BA%E7%A1%80/
EMAIL:y1053419035@qq.com
*/ package cn.org.yinzhengjie.note5; import java.io.File; public class FileDemo {
public static void main(String[] args) {
//注意,windows路径可以写成“\\”进行分割。
File file = new File("D:\\10.Java\\JavaSE\\eclipse\\Myprogram","eclipse");
System.out.println(file);
}
} /*
以上代码执行结果如下:
D:\10.Java\JavaSE\eclipse\Myprogram\eclipse
*/
3>.File(File parent,String child)
传递路径:传递File类型父路径,字符串子路径。
/*
@author :yinzhengjie
Blog:http://www.cnblogs.com/yinzhengjie/tag/Java%E5%9F%BA%E7%A1%80/
EMAIL:y1053419035@qq.com
*/ package cn.org.yinzhengjie.note5; import java.io.File; public class FileDemo {
public static void main(String[] args) {
File parent = new File("D:\\10.Java\\JavaSE\\eclipse\\Myprogram");
//父路径为一个File对象
File file = new File(parent,"eclipse");
System.out.println(file);
}
} /*
以上代码执行结果如下:
D:\10.Java\JavaSE\eclipse\Myprogram\eclipse
*/
五.File类的常用方法
1>.File类创建文件功能
/*
@author :yinzhengjie
Blog:http://www.cnblogs.com/yinzhengjie/tag/Java%E5%9F%BA%E7%A1%80/
EMAIL:y1053419035@qq.com
*/ package cn.org.yinzhengjie.note5; import java.io.File;
import java.io.IOException; public class FileDemo {
public static void main(String[] args) throws IOException {
File file = new File("D:\\10.Java\\JavaSE\\eclipse\\Myprogram","yinzhengjie.txt");
//创建file文件,如果创建成功就返回true,如果文件已经存在就不会创建,并返回false,注意,该方法需要抛异常:IOException.
boolean res = file.createNewFile();
System.out.println(res);
}
} /*
以上代码执行结果如下:
true
*/
2>.File类创建目录功能
/*
@author :yinzhengjie
Blog:http://www.cnblogs.com/yinzhengjie/tag/Java%E5%9F%BA%E7%A1%80/
EMAIL:y1053419035@qq.com
*/ package cn.org.yinzhengjie.note5; import java.io.File;
import java.io.IOException; public class FileDemo {
public static void main(String[] args) throws IOException {
File file = new File("D:\\10.Java\\JavaSE\\eclipse\\Myprogram","yinzhengjie");
//创建单级文件夹
boolean res = file.mkdir();
System.out.println(res);
file = new File("D:\\10.Java\\JavaSE\\eclipse\\Myprogram","yinzhengjie/test/a/b/c");
//创建多级文件夹
res = file.mkdirs();
System.out.println(res);
}
} /*
以上代码执行结果如下:
true
true
*/
3>.File类删除功能【删除有风险,运行需谨慎!】
/*
@author :yinzhengjie
Blog:http://www.cnblogs.com/yinzhengjie/tag/Java%E5%9F%BA%E7%A1%80/
EMAIL:y1053419035@qq.com
*/ package cn.org.yinzhengjie.note5; import java.io.File;
import java.io.IOException; public class FileDemo {
public static void main(String[] args) throws IOException {
File file = new File("D:\\10.Java\\JavaSE\\eclipse\\Myprogram","yinzhengjie");
//删除空文件夹,删除成功就返回true,删除失败就返回false,删除方法不走回收站,直接从硬盘中删除。
boolean res = file.delete();
System.out.println(res); }
} /*
以上代码执行结果如下:
true
*/
4>.File类获取功能
/*
@author :yinzhengjie
Blog:http://www.cnblogs.com/yinzhengjie/tag/Java%E5%9F%BA%E7%A1%80/
EMAIL:y1053419035@qq.com
*/ package cn.org.yinzhengjie.note5; import java.io.File;
import java.io.IOException; public class FileDemo {
public static void main(String[] args) throws IOException {
File file = new File("D:\\10.Java\\JavaSE\\eclipse\\Myprogram","yinzhengjie");
//获取文件名称
String fileName = file.getName();
System.out.println(fileName);
//获取父路径
String getParent = file.getParent();
System.out.println(getParent);
//获取绝对路径
File absoluteFile = file.getAbsoluteFile();
System.out.println(absoluteFile); }
} /*
以上代码执行结果如下:
yinzhengjie
D:\10.Java\JavaSE\eclipse\Myprogram
D:\10.Java\JavaSE\eclipse\Myprogram\yinzhengjie
*/
5>.File类判断功能
/*
@author :yinzhengjie
Blog:http://www.cnblogs.com/yinzhengjie/tag/Java%E5%9F%BA%E7%A1%80/
EMAIL:y1053419035@qq.com
*/ package cn.org.yinzhengjie.note5; import java.io.File;
import java.io.IOException; public class FileDemo {
public static void main(String[] args) throws IOException {
File file = new File("D:\\10.Java\\JavaSE\\eclipse\\Myprogram","yinzhengjie");
if(!file.exists()) { //如果file对象封装的路径就执行以下代码
file.mkdirs(); //创建该目录对象
System.out.println(file.isDirectory()); //判断其是否为目录。
System.out.println(file.isFile()); //判断其是否为文件,如果上面为true,则说明该File对象是目录而非文件
}
}
} /*
以上代码执行结果如下:
true
false
*/
6>.File类list获取功能
/*
@author :yinzhengjie
Blog:http://www.cnblogs.com/yinzhengjie/tag/Java%E5%9F%BA%E7%A1%80/
EMAIL:y1053419035@qq.com
*/ package cn.org.yinzhengjie.note5; import java.io.File;
import java.io.IOException; public class FileDemo {
public static void main(String[] args) throws IOException {
File file = new File("D:\\10.Java\\JavaSE\\eclipse\\Myprogram");
//用list方法获取文件和目录,返回的是字符串数组
String[] fileList = file.list();
for (String fileName : fileList) {
System.out.println(fileName);
} //用listFiles方法返回的是文件的绝对路径,返回的是File数组,推荐使用这种方法。
File[] listFiles = file.listFiles();
for (File fileName : listFiles) {
System.out.println(fileName);
} //获取系统中的所有根目录,包括你的移动分区,硬盘分区,只要是挂在到当前操作系统中的都能查出来!
File[] listRoots = file.listRoots();
for (File rootName : listRoots) {
System.out.println(rootName);
}
}
} /*
以上代码执行结果如下:
eclipse
workspace
yinzhengjie
D:\10.Java\JavaSE\eclipse\Myprogram\eclipse
D:\10.Java\JavaSE\eclipse\Myprogram\workspace
D:\10.Java\JavaSE\eclipse\Myprogram\yinzhengjie
C:\
D:\
E:\
F:\
*/
六.文件过滤器
1>.文件过滤器原理分析
a>.listFiles() 遍历目录的同时,获取到了文件名全路径,调用过滤器的方法 accept将获取到的路径传递给accept反方的参数pathname;
b>.accept方法接受到了参数pathname,参数的是listFiles传递来的,在accept方法通过一系列逻辑判断(比如判断这个路径是否为Java文件),然后返回相应的布尔值;
c>.一旦返回了true,listFiles将路径,保存在File数组中,如果为false,那么就真的被过滤掉了(就不会保存在File数组中);
2>.案例展示
/*
@author :yinzhengjie
Blog:http://www.cnblogs.com/yinzhengjie/tag/Java%E5%9F%BA%E7%A1%80/
EMAIL:y1053419035@qq.com
*/ package cn.org.yinzhengjie.note5; import java.io.File;
import java.io.FileFilter;
import java.io.IOException; class MyFile implements FileFilter{ @Override
public boolean accept(File pathname) {
//判断文件是否为java文件,
return pathname.getName().toLowerCase().endsWith(".java");
} } public class FileDemo { public static void main(String[] args) throws IOException {
File file = new File("D:\\10.Java\\JavaSE\\eclipse\\Myprogram\\yinzhengjie");
File[] listFiles = file.listFiles(new MyFile());
for (File fileName : listFiles) {
System.out.println(fileName);
}
}
} /*
以上代码执行结果如下:
D:\10.Java\JavaSE\eclipse\Myprogram\yinzhengjie\arrayArrayDemo.java
D:\10.Java\JavaSE\eclipse\Myprogram\yinzhengjie\arrayArrayDemo1.java
D:\10.Java\JavaSE\eclipse\Myprogram\yinzhengjie\arrayArrayDemo2.java
D:\10.Java\JavaSE\eclipse\Myprogram\yinzhengjie\arrayArrayDemo3.java
D:\10.Java\JavaSE\eclipse\Myprogram\yinzhengjie\callName.java
D:\10.Java\JavaSE\eclipse\Myprogram\yinzhengjie\Car.java
D:\10.Java\JavaSE\eclipse\Myprogram\yinzhengjie\CarDemo.java
D:\10.Java\JavaSE\eclipse\Myprogram\yinzhengjie\Demo1.java
D:\10.Java\JavaSE\eclipse\Myprogram\yinzhengjie\Dog.java
D:\10.Java\JavaSE\eclipse\Myprogram\yinzhengjie\DogDemo.java
D:\10.Java\JavaSE\eclipse\Myprogram\yinzhengjie\Engine.java
D:\10.Java\JavaSE\eclipse\Myprogram\yinzhengjie\Person.java
D:\10.Java\JavaSE\eclipse\Myprogram\yinzhengjie\PersonDemo.java
*/
七.方法的递归调用
方法的递归调用不仅仅是Java语言自己的特点,类似于Python,C++,C,golang等高级语言都有递归用法,递归方法说白了就是自己调用自己。递归方法适用于方法中运算的主题不变,但是运行的时候,参与运行的方法参数会变化,关于Java中的递归调用要注意以下几点:
a>.递归一定要有出口,必须可以让程序停下;
b>.递归次数不能过多;
c>.构造方法,禁止递归;
接下来我们就来几个递归的案例展示吧:
1>.递归变量全目录
/*
@author :yinzhengjie
Blog:http://www.cnblogs.com/yinzhengjie/tag/Java%E5%9F%BA%E7%A1%80/
EMAIL:y1053419035@qq.com
*/ package cn.org.yinzhengjie.note5; import java.io.File;
import java.io.IOException; public class FileDemo { public static void main(String[] args) throws IOException {
File file = new File("D:\\10.Java\\JavaSE\\eclipse\\Myprogram\\yinzhengjie");
getAllDir(file);
} public static void getAllDir(File dir) {
File[] listFiles = dir.listFiles();
for (File file : listFiles) {
//判断变量file表示的路径是不是文件夹
if(file.isDirectory()) {
//如果是目录就继续遍历这个目录
getAllDir(file);
}else {
System.out.println(file);
}
}
} } /*
以上代码执行结果如下:
D:\10.Java\JavaSE\eclipse\Myprogram\yinzhengjie\arrayListDemo\arrayArrayDemo.java
D:\10.Java\JavaSE\eclipse\Myprogram\yinzhengjie\arrayListDemo\arrayArrayDemo1.java
D:\10.Java\JavaSE\eclipse\Myprogram\yinzhengjie\arrayListDemo\arrayArrayDemo2.java
D:\10.Java\JavaSE\eclipse\Myprogram\yinzhengjie\arrayListDemo\arrayArrayDemo3.java
D:\10.Java\JavaSE\eclipse\Myprogram\yinzhengjie\bin\arrayArrayDemo.class
D:\10.Java\JavaSE\eclipse\Myprogram\yinzhengjie\bin\arrayArrayDemo1.class
D:\10.Java\JavaSE\eclipse\Myprogram\yinzhengjie\bin\arrayArrayDemo2.class
D:\10.Java\JavaSE\eclipse\Myprogram\yinzhengjie\bin\arrayArrayDemo3.class
D:\10.Java\JavaSE\eclipse\Myprogram\yinzhengjie\bin\callName.class
D:\10.Java\JavaSE\eclipse\Myprogram\yinzhengjie\bin\Car.class
D:\10.Java\JavaSE\eclipse\Myprogram\yinzhengjie\bin\CarDemo.class
D:\10.Java\JavaSE\eclipse\Myprogram\yinzhengjie\bin\Demo1.class
D:\10.Java\JavaSE\eclipse\Myprogram\yinzhengjie\bin\Dog.class
D:\10.Java\JavaSE\eclipse\Myprogram\yinzhengjie\bin\DogDemo.class
D:\10.Java\JavaSE\eclipse\Myprogram\yinzhengjie\bin\Engine.class
D:\10.Java\JavaSE\eclipse\Myprogram\yinzhengjie\bin\Person.class
D:\10.Java\JavaSE\eclipse\Myprogram\yinzhengjie\bin\PersonDemo.class
D:\10.Java\JavaSE\eclipse\Myprogram\yinzhengjie\demo\callName.java
D:\10.Java\JavaSE\eclipse\Myprogram\yinzhengjie\demo\Car.java
D:\10.Java\JavaSE\eclipse\Myprogram\yinzhengjie\demo\CarDemo.java
D:\10.Java\JavaSE\eclipse\Myprogram\yinzhengjie\demo\Demo1.java
D:\10.Java\JavaSE\eclipse\Myprogram\yinzhengjie\demo\Dog.java
D:\10.Java\JavaSE\eclipse\Myprogram\yinzhengjie\demo\DogDemo.java
D:\10.Java\JavaSE\eclipse\Myprogram\yinzhengjie\demo\Engine.java
D:\10.Java\JavaSE\eclipse\Myprogram\yinzhengjie\Person.java
D:\10.Java\JavaSE\eclipse\Myprogram\yinzhengjie\PersonDemo.java
*/
2>.递归求和计算
/*
@author :yinzhengjie
Blog:http://www.cnblogs.com/yinzhengjie/tag/Java%E5%9F%BA%E7%A1%80/
EMAIL:y1053419035@qq.com
*/ package cn.org.yinzhengjie.note5; import java.io.File;
import java.io.IOException; public class FileDemo { public static void main(String[] args) throws IOException {
File file = new File("D:\\10.Java\\JavaSE\\eclipse\\Myprogram\\yinzhengjie");
int sum = getSum(10000);
System.out.println(sum);
} /*如果只是求和运算的话,不建议用递归,因为递归设计到弹栈和压栈,开销是比较大的用for循环还是
相当不错的,不过这里只是为了演示递归用法,就不用这么吹毛求疵啦!*/
public static int getSum(int number) {
if(number == 1) {
return 1;
}
return number + getSum(number - 1 );
} } /*
以上代码执行结果如下:
50005000
*/
3>.递归求阶乘
/*
@author :yinzhengjie
Blog:http://www.cnblogs.com/yinzhengjie/tag/Java%E5%9F%BA%E7%A1%80/
EMAIL:y1053419035@qq.com
*/ package cn.org.yinzhengjie.note5; import java.io.File;
import java.io.IOException; public class FileDemo { public static void main(String[] args) throws IOException {
File file = new File("D:\\10.Java\\JavaSE\\eclipse\\Myprogram\\yinzhengjie");
int sum = getFactorial(5);
System.out.println(sum);
} /*如果只是求和运算的话,不建议用递归,因为递归设计到弹栈和压栈,开销是比较大的用for循环还是
相当不错的,不过这里只是为了演示递归用法,就不用这么吹毛求疵啦!*/
public static int getFactorial(int number) {
if(number == 1) {
return 1;
}
return number * getFactorial( number - 1 );
}
} /*
以上代码执行结果如下:
120
*/
4>.递归计算斐波那契数列
/*
@author :yinzhengjie
Blog:http://www.cnblogs.com/yinzhengjie/tag/Java%E5%9F%BA%E7%A1%80/
EMAIL:y1053419035@qq.com
*/ package cn.org.yinzhengjie.note5; import java.io.File;
import java.io.IOException; public class FileDemo { public static void main(String[] args) throws IOException {
int sum = getFibonaccieries(45);
System.out.println(sum);
} /*如果只是求和运算的话,不建议用递归,因为递归设计到弹栈和压栈,开销是比较大的用for循环还是
相当不错的,不过这里只是为了演示递归用法,就不用这么吹毛求疵啦!*/
public static int getFibonaccieries(int number) {
if( number == 1 ) {
return 1;
}else if( number == 2 ) {
return 1;
}else {
return getFibonaccieries(number -1 ) + getFibonaccieries(number - 2 );
}
}
} /*
以上代码执行结果如下:
1134903170
*/
5>.遍历目录下的所有java文件
/*
@author :yinzhengjie
Blog:http://www.cnblogs.com/yinzhengjie/tag/Java%E5%9F%BA%E7%A1%80/
EMAIL:y1053419035@qq.com
*/ package cn.org.yinzhengjie.note5; import java.io.File;
import java.io.FileFilter;
import java.io.IOException; class MyFile implements FileFilter{ @Override
public boolean accept(File pathname) {
//判断获取的是目录,直接返回true
if(pathname.isDirectory()) {
return true;
}
//如果不是目录再判断文件是否为java文件,
return pathname.getName().toLowerCase().endsWith(".java");
} } public class FileDemo { public static void main(String[] args) throws IOException {
File file = new File("D:\\10.Java\\JavaSE\\eclipse\\Myprogram\\yinzhengjie");
getJavaFiles(file);
} public static void getJavaFiles(File dir) {
//调用File对象方法listFiles()获取,加入过滤器
File[] listFiles = dir.listFiles(new MyFile());
for (File fileName : listFiles) {
//对fileName路径进行判断,是否为文件夹
if(fileName.isDirectory()) {
getJavaFiles(fileName);
}else {
System.out.println(fileName);
}
}
} } /*
以上代码执行结果如下:
D:\10.Java\JavaSE\eclipse\Myprogram\yinzhengjie\arrayListDemo\arrayArrayDemo.java
D:\10.Java\JavaSE\eclipse\Myprogram\yinzhengjie\arrayListDemo\arrayArrayDemo1.java
D:\10.Java\JavaSE\eclipse\Myprogram\yinzhengjie\arrayListDemo\arrayArrayDemo2.java
D:\10.Java\JavaSE\eclipse\Myprogram\yinzhengjie\arrayListDemo\arrayArrayDemo3.java
D:\10.Java\JavaSE\eclipse\Myprogram\yinzhengjie\demo\callName.java
D:\10.Java\JavaSE\eclipse\Myprogram\yinzhengjie\demo\Car.java
D:\10.Java\JavaSE\eclipse\Myprogram\yinzhengjie\demo\CarDemo.java
D:\10.Java\JavaSE\eclipse\Myprogram\yinzhengjie\demo\Demo1.java
D:\10.Java\JavaSE\eclipse\Myprogram\yinzhengjie\demo\Dog.java
D:\10.Java\JavaSE\eclipse\Myprogram\yinzhengjie\demo\DogDemo.java
D:\10.Java\JavaSE\eclipse\Myprogram\yinzhengjie\demo\Engine.java
D:\10.Java\JavaSE\eclipse\Myprogram\yinzhengjie\Person.java
D:\10.Java\JavaSE\eclipse\Myprogram\yinzhengjie\PersonDemo.java
*/