正文
《Java I/O 从0到1》 - 第Ⅰ滴血 File
小程序:扫一扫查出行
【扫一扫了解最新限行尾号】
复制小程序
【扫一扫了解最新限行尾号】
复制小程序
前言
File 类的介绍主要会依据《Java 编程思想》以及官网API 。相信大家在日常工作中,肯定会遇到文件流的读取等操作,但是在搜索过程中,并没有找到一个介绍的很简洁明了的文章。因此,在最近比较轻松的时间里做一个关于 《Java I/O 从0到1》系列。规划是包括以下几个方面:File类、字节流、字符流、字节字符的组合使用、编码示例以及JDK1.4 推出的为了提高性能增加了功能的nio类(新I/O)。那么,接下来,进行File 的介绍。
File
从File 的字面意思来讲,就会认为指的是文件。其实并不是如此,File类名字有一定的误导性。FilePath(文件路径)对此类来说是个更好的名字。摘自《Java编程思想 第四版》。File类以抽象的方式代表文件名和目录路径名。该类主要用于文件和目录的创建、文件的查找和文件的删除等。
1. 它既能代表一个特定文件的名称,又能代表一个目录下的一组文件的名称。
2. 如果指的是一个文件集,那么就可以使用list(),此时会返回一个字符数组。
下面提供一个根据官网API整理的思维导图(邮件点击图片 新标签页打开 查看图片):
Xmind思维导图下载链接:http://pan.baidu.com/s/1jIzMzAY
新建文件
1. 创建文件的时候一定要制定路径,不然会提示找不到路径错误!
2. new File(String pathName) 并不是真实创建文件,而是指向新建文件的引用
3. File.separator 不同的系统平台 路径分隔符不一样,Window:\\ Unix/Linux://。因此此处不要写死路径
/**
*
* Title: createNewFile
* Description: 创建文件
* @author yacong_liu Email:2682505646@qq.com
* @date 2017年9月19日下午6:06:24
* @param pathname
*/
public static void createNewFile(String pathname){
//创建文件的时候 不指定路径
File file = new File(pathname);
try {
file.createNewFile();
System.out.println(file.createNewFile());
} catch (IOException e) {
e.printStackTrace();
System.err.println(" create new file error ");
} //创建文件的时候制定路径
try {
File file1 = new File("D:"+File.separator+"tmp",pathname);
System.out.println(file1);
System.out.println(file1.createNewFile());
} catch (IOException e) {
System.err.println(" create new file1 error ");
e.printStackTrace();
} /**
* Console:
* false
* D:\tmp\a.txt
* true
*/ }
新建文件
列出所有
使用目录路径名创建File,此时File表示的是目录
======listAllFile("D:\\tmp"); ====== /**
*
* Title: listAllFile
* Description: 列出所有文件
* @author yacong_liu Email:2682505646@qq.com
* @date 2017年9月19日下午6:16:57
* @param path
*/
private static void listAllFile(String path){
//path 为目录名 此处的File 表示目录
File dir = new File(path);
if(dir.isDirectory()){
File[] files = dir.listFiles();
System.out.println("目录"+dir.getName()+"下所有文件:"); for (File file : files) {
System.out.println(file.getName()+" ");
}
}
/**
* Console:
* 目录tmp下所有文件:
a.txt
b.txt
*/
}
列出指定目录下所有文件
列出指定文件
使用目录列表器,进行限定文件的显示。实现FilenameFilter 接口
package io; import java.io.File;
import java.io.FilenameFilter; public class DirFilter implements FilenameFilter {
String extension = "."; public DirFilter(String fileExtensionNoDot) {
extension += fileExtensionNoDot;
} @Override
public boolean accept(File dir, String name) {
return name.endsWith(extension);
} }
目录列表器
DirFilter 这个类存在的唯一原因就是accept()方法.创建这个类的目的在于吧accept()方法提供给list()使用,是list()可以回调accept(),进而决定哪些文件包含在列表中。因此这种结构也叫做 回调。更具体地说,使用的是策略模式的思想,因为list()实现了基本的功能,而且按照FilenameFilter的形式提供了这个策略。
========listFileByExtension("D:\\tmp","java");=======
/**
*
* Title: listFileByExtension
* Description: 列出目录下指定文件
* @author yacong_liu Email:2682505646@qq.com
* @date 2017年9月19日下午6:43:02
* @param path 目录
* @param extension 文件扩展名
*/
private static void listFileByExtension(String path,String extension){
File dir = new File(path);
if(dir.isDirectory()){
File[] files = dir.listFiles(new DirFilter(extension));
System.out.println("目录 "+dir.getName()+"下的"+extension+"文件有:");
for (File file : files) {
System.out.println(file.getName()+" ");
}
}
/**
* Console:
* 目录 tmp下的java文件有:
1.java
*/
}
列出目录中指定扩展名文件
删除文件夹下所有文件以及该文件夹
获取制定目录下的所有File,判断每一个File 是否是文件,如果是文件,就直接删除,如果是目录就递归调用该方法进行删除。
==========deleteDirectory(new File("D:\\tmp"));======
/**
*
* Title: deleteDirectory
* Description: 删除文件夹下所有文件以及该文件夹
* @author yacong_liu Email:2682505646@qq.com
* @date 2017年9月19日下午10:04:27
* @param file
*/
private static void deleteDirectory(File file) {
File[] fileArr = file.listFiles();
if (fileArr.length > 0) {
for (int i = 0; i < fileArr.length; i++) {
if (fileArr[i].isFile()) {
if (fileArr[i].delete()) {
System.out.println(fileArr[i] + "文件删除成功!");
} else {
System.err.println(fileArr[i] + "文件删除失败!");
}
} else {
// 递归
deleteDirectory(fileArr[i]);
}
}
} // 删除该文件夹
if (file.delete()) {
System.out.println(file + "文件夹删除成功!");
} else {
System.err.println(file + "文件夹删除失败!");
} /**
* Console:
* D:\tmp\1 - 副本 (2).java文件删除成功!
D:\tmp\1 - 副本.txt文件删除成功!
D:\tmp\1.txt文件删除成功!
D:\tmp文件夹删除成功!
*/
}
删除文件夹下所有文件以及该文件夹
创建文件夹
创建文件夹的时候,需要注意的也就是是创建一级目录(mkdir())还是创建多级目录(mkdirs())?
下面举得这个例子还是符合实际的,一般情况下,业务系统中队产生的文件进行保存到磁盘的时候,就需要按照 指定目录/年/月/日/file 这样的格式进行保存。
/**
*
* Title: createDirectory Description: 创建多级文件夹
*
* @author yacong_liu Email:2682505646@qq.com
* @date 2017年9月19日下午10:31:52
*/
private static void createDirectory() {
String year = null;
String month = null;
String day = null;
String[] strings = getDate();
year = strings[0];
month = strings[1];
day = strings[2]; // File dir = new File("D:\\tmp2\\2017\\9\\19");
File dir = new File(
"D:" + File.separator + "tmp3" + File.separator + year + File.separator + month + File.separator + day); if (!dir.exists()) {
if (dir.mkdirs()) {
System.out.println(dir.getAbsolutePath() + " 文件夹创建成功!");
} else {
System.err.println(dir.getName() + " 文件夹创建失败!");
}
} else {
System.err.println(dir.getName() + " 文件夹已经存在!");
}
} private static String[] getDate() {
SimpleDateFormat f = new SimpleDateFormat("yyyy-MM-dd");
String date = f.format(new Date(System.currentTimeMillis()));
String[] strings = date.split("-");
return strings;
}
创建多级目录
那么到这里呢,关于File 类的介绍,大致就是上面总结的这些,需要更为详细的理解File的话,还是建议常浏览API文档:http://commons.apache.org/proper/commons-io/javadocs/api-release/index.html