Java I/O 从0到1 - 第Ⅰ滴血 File
Posted 蚂蚁分享圈
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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://。因此此处不要写死路径
1 /** 2 * 3 * Title: createNewFile 4 * Description: 创建文件 5 * @author yacong_liu Email:2682505646@qq.com 6 * @date 2017年9月19日下午6:06:24 7 * @param pathname 8 */ 9 public static void createNewFile(String pathname){ 10 //创建文件的时候 不指定路径 11 File file = new File(pathname); 12 try { 13 file.createNewFile(); 14 System.out.println(file.createNewFile()); 15 } catch (IOException e) { 16 e.printStackTrace(); 17 System.err.println(" create new file error "); 18 } 19 20 //创建文件的时候制定路径 21 try { 22 File file1 = new File("D:"+File.separator+"tmp",pathname); 23 System.out.println(file1); 24 System.out.println(file1.createNewFile()); 25 } catch (IOException e) { 26 System.err.println(" create new file1 error "); 27 e.printStackTrace(); 28 } 29 30 /** 31 * Console: 32 * false 33 * D:\\tmp\\a.txt 34 * true 35 */ 36 37 }
列出所有
使用目录路径名创建File,此时File表示的是目录
1 ======listAllFile("D:\\\\tmp"); ====== 2 3 /** 4 * 5 * Title: listAllFile 6 * Description: 列出所有文件 7 * @author yacong_liu Email:2682505646@qq.com 8 * @date 2017年9月19日下午6:16:57 9 * @param path 10 */ 11 private static void listAllFile(String path){ 12 //path 为目录名 此处的File 表示目录 13 File dir = new File(path); 14 if(dir.isDirectory()){ 15 File[] files = dir.listFiles(); 16 System.out.println("目录"+dir.getName()+"下所有文件:"); 17 18 for (File file : files) { 19 System.out.println(file.getName()+" "); 20 } 21 } 22 /** 23 * Console: 24 * 目录tmp下所有文件: 25 a.txt 26 b.txt 27 */ 28 }
列出指定文件
使用目录列表器,进行限定文件的显示。实现FilenameFilter 接口
1 package io; 2 3 import java.io.File; 4 import java.io.FilenameFilter; 5 6 public class DirFilter implements FilenameFilter { 7 String extension = "."; 8 9 public DirFilter(String fileExtensionNoDot) { 10 extension += fileExtensionNoDot; 11 } 12 13 @Override 14 public boolean accept(File dir, String name) { 15 return name.endsWith(extension); 16 } 17 18 }
DirFilter 这个类存在的唯一原因就是accept()方法.创建这个类的目的在于吧accept()方法提供给list()使用,是list()可以回调accept(),进而决定哪些文件包含在列表中。因此这种结构也叫做 回调。更具体地说,使用的是策略模式的思想,因为list()实现了基本的功能,而且按照FilenameFilter的形式提供了这个策略。
1 ========listFileByExtension("D:\\\\tmp","java");======= 2 /** 3 * 4 * Title: listFileByExtension 5 * Description: 列出目录下指定文件 6 * @author yacong_liu Email:2682505646@qq.com 7 * @date 2017年9月19日下午6:43:02 8 * @param path 目录 9 * @param extension 文件扩展名 10 */ 11 private static void listFileByExtension(String path,String extension){ 12 File dir = new File(path); 13 if(dir.isDirectory()){ 14 File[] files = dir.listFiles(new DirFilter(extension)); 15 System.out.println("目录 "+dir.getName()+"下的"+extension+"文件有:"); 16 for (File file : files) { 17 System.out.println(file.getName()+" "); 18 } 19 } 20 /** 21 * Console: 22 * 目录 tmp下的java文件有: 23 1.java 24 */ 25 }
删除文件夹下所有文件以及该文件夹
获取制定目录下的所有File,判断每一个File 是否是文件,如果是文件,就直接删除,如果是目录就递归调用该方法进行删除。
1 ==========deleteDirectory(new File("D:\\\\tmp"));====== 2 /** 3 * 4 * Title: deleteDirectory 5 * Description: 删除文件夹下所有文件以及该文件夹 6 * @author yacong_liu Email:2682505646@qq.com 7 * @date 2017年9月19日下午10:04:27 8 * @param file 9 */ 10 private static void deleteDirectory(File file) { 11 File[] fileArr = file.listFiles(); 12 if (fileArr.length > 0) { 13 for (int i = 0; i < fileArr.length; i++) { 14 if (fileArr[i].isFile()) { 15 if (fileArr[i].delete()) { 16 System.out.println(fileArr[i] + "文件删除成功!"); 17 } else { 18 System.err.println(fileArr[i] + "文件删除失败!"); 19 } 20 } else { 21 // 递归 22 deleteDirectory(fileArr[i]); 23 } 24 } 25 } 26 27 // 删除该文件夹 28 if (file.delete()) { 29 System.out.println(file + "文件夹删除成功!"); 30 } else { 31 System.err.println(file + "文件夹删除失败!"); 32 } 33 34 /** 35 * Console: 36 * D:\\tmp\\1 - 副本 (2).java文件删除成功! 37 D:\\tmp\\1 - 副本.txt文件删除成功! 38 D:\\tmp\\1.txt文件删除成功! 39 D:\\tmp文件夹删除成功! 40 */ 41 }
创建文件夹
创建文件夹的时候,需要注意的也就是是创建一级目录(mkdir())还是创建多级目录(mkdirs())?
下面举得这个例子还是符合实际的,一般情况下,业务系统中队产生的文件进行保存到磁盘的时候,就需要按照 指定目录/年/月/日/file 这样的格式进行保存。
1 /** 2 * 3 * Title: createDirectory Description: 创建多级文件夹 4 * 5 * @author yacong_liu Email:2682505646@qq.com 6 * @date 2017年9月19日下午10:31:52 7 */ 8 private static void createDirectory() { 9 String year = null; 10 String month = null; 11 String day = null; 12 String[] strings = getDate(); 13 year = strings[0]; 14 month = strings[1]; 15 day = strings[2]; 16 17 // File dir = new File("D:\\\\tmp2\\\\2017\\\\9\\\\19"); 18 File dir = new File( 19 "D:" + File.separator + "tmp3" + File.separator + year + File.separator + month + File.separator + day); 20 21 if (!dir.exists()) { 22 if (dir.mkdirs()) { 23 System.out.println(dir.getAbsolutePath() + " 文件夹创建成功!"); 24 } else { 25 System.err.println(dir.getName() + " 文件夹创建失败!"); 26 } 27 } else { 28 System.err.println(dir.getName() + " 文件夹已经存在!"); 29 } 30 } 31 32 private static String[] getDate() { 33 SimpleDateFormat f = new SimpleDateFormat("yyyy-MM-dd"); 34 String date = f.format(new Date(System.currentTimeMillis())); 35 String[] strings = date.split("-"); 36 return strings; 37 }
那么到这里呢,关于File 类的介绍,大致就是上面总结的这些,需要更为详细的理解File的话,还是建议常浏览API文档:http://commons.apache.org/proper/commons-io/javadocs/api-release/index.html
以上是关于Java I/O 从0到1 - 第Ⅰ滴血 File的主要内容,如果未能解决你的问题,请参考以下文章