前言

  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

 

《Java I/O 从0到1》 - 第Ⅰ滴血 File的更多相关文章

  1. Java I/O 从0到1 - 第Ⅰ滴血 File

    前言 File 类的介绍主要会依据<Java 编程思想>以及官网API .相信大家在日常工作中,肯定会遇到文件流的读取等操作,但是在搜索过程中,并没有找到一个介绍的很简洁明了的文章.因此, ...

  2. 20145208 《Java程序设计》第0周学习总结

    20145208 <Java程序设计>第0周学习总结 阅读心得 读了老师推荐的几个文章,虽然第四个文章"为什么一定要自学"报告资源不存在而无法阅读,其他的三篇文章都言之 ...

  3. 《Java I/O 从0到1》 - 第Ⅱ滴血 “流”

    前言 <Java I/O 从0到1>系列上一章节,介绍了File 类,这一章节介绍的是IO的核心 输入输出.I/O类库常使用流这个抽象概念.代表任何有能力产出数据的数据源对象或者是有能力接 ...

  4. Windows Intellij环境下Gradle的 “Could not determine Java version from ‘9.0.1’”的解决方式

    当我导入Gradle项目初试Java spring的时候,遇到下面报错: Gradle complete project refresh failed Error:Could not determin ...

  5. hadoop 遇到java.net.ConnectException: to 0.0.0.0:10020 failed on connection

      hadoop 遇到java.net.ConnectException: to 0.0.0.0:10020 failed on connection   这个问题一般是在hadoop2.x版本里会出 ...

  6. 20145328 《Java程序设计》第0周学习总结

    20145328 <Java程序设计>第0周学习总结 阅读心得 从总体上来说,这几篇文章都是围绕着软件工程专业的一些现象来进行描述的,但深入了解之后就可以发现,无论是软件工程专业还是我们现 ...

  7. Java升级替换java version "1.5.0"

    首先进行java安装 http://www.cnblogs.com/someone9/p/8670585.html 2. 然后查看版本信息,仍然是1.5.0 [root@OKC java]# java ...

  8. Java SPI、servlet3.0与@HandlesTypes源码分析

    关于Java SPI与servlet3.0的应用,这里说的很精炼,链接地址如下. https://blog.csdn.net/pingnanlee/article/details/80940993 以 ...

  9. exception java.lang.IndexOutOfBoundsException: Index: 0, Size: 0

      1.情景展示 Java 报错信息如下: java.lang.IndexOutOfBoundsException: Index: 0, Size: 0 2.原因分析 首先,这是越界异常,但不是数组越 ...

随机推荐

  1. CodeIgniter框架学习要点

    以下内容从兄弟连的CI教学视频中摘抄: http://codeigniter.org.cn/tutorials/ ------------------------------------------- ...

  2. C#图解教程读书笔记(第7章 类和继承)

    1.所有的类都继承自object 2.如何隐藏基类的成员 要隐藏一个继承的数据成员,需要声明一个新的相同类型的成员,并使用相同的名称. 通过在派生类中声明新的带有相同签名的函数成员,可以隐藏或掩盖继承 ...

  3. JAVA中日期 yyyy-MM-dd HH:mm:ss和yyyy-MM-dd hh:mm:ss的区别

    JAVA中日期 yyyy-MM-dd HH:mm:ss和yyyy-MM-dd hh:mm:ss的区别 : HH:24小时制 hh:12小时制 package time; import java.tex ...

  4. bzoj3106 [cqoi2013]棋盘游戏

    Description 一个n*n(n>=2)棋盘上有黑白棋子各一枚.游戏者A和B轮流移动棋子,A先走. l         A的移动规则:只能移动白棋子.可以往上下左右四个方向之一移动一格. ...

  5. 本地测试时修改localhost为自己网站的域名的方法(转载)

    做网站的,在本地测试时,所用的地址基本上都是localhost 或者直接用IP地址:127.0.0.1 如果仅仅是用来测试网站内部的程序代码之类的当然没问题,但是如果我们还要测试网站上添加的广告或者统 ...

  6. 7.spring:SpringAOP(配置文件)

    SpringAOP(xml文件配置) 配置文件的方式,主要是在xml文件中进行配置,不使用注解! 目录: AtithmeticCalculator.java public interface Atit ...

  7. Kali-linux设置ProxyChains

    ProxyChains是Linux和其他Unices下的代理工具.它可以使任何程序通过代理上网,允许TCP和DNS通过代理隧道,支持HTTP.SOCKS4和SOCKS5类型的代理服务器,并且可配置多个 ...

  8. struts2不同版本在核心filter在web.xml中的配置

    FilterDispatcher是struts2.0.x到2.1.2版本的核心过滤器.配置如下: <filter> <filter-name>struts2</filte ...

  9. diogo谈框,仿prompt()方法布局

    展示效果: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF ...

  10. 如何在.Net Core 2.0 App中读取appsettings.json

    This is something that strangely doesn’t seem to be that well documented and took me a while to figu ...