在之前的文章我们都是通过 Java 在内存中应用,本章开始我们来看一下 Java 在系统文件(硬盘)上的操作。

系统文件就是我们电脑中的文件,简单来说就是像 Windows 系统中 C D E 等各类盘符中的文件。Java 在系统文件的操作需要通过  File 来完成。

接下来我们通过一个简单的实例来看一下 Java 在操作系统文件中的基本操作。

如上图,我们先在项目目录下创建一个 fileDemo.txt 的文件,通过电脑可以查看到它的一些属性,如名称,大小,是否可读可写等,接下来我们通过代码来对该文件进行一些操作。

 package FileDemo;

 import java.io.File;

 /**
* java.io.File
*
* @author wjt
* File 可以表示一个文件或目录
* 使用 File 可以:
* 1、访问其表示的文件或目录的属性(如:名字,长度等)
* 2、可以创建或删除一个文件或目录
* 3、可以访问一个目录的所有子项信息
* 但是 File 不能访问一个文件的数据内容
*/
public class FileDemo1 {
public static void main(String[] args) {
// File.separator 相当于 / ,为了兼容 Windows 和 Linux 等系统
File file = new File("." + File.separator + "fileDemo.txt");
String name = file.getName(); // 文件名
long len = file.length(); // 文件名的长度
boolean canRead = file.canRead(); // 文件是否可读
boolean canWrite = file.canWrite(); // 文件是否可写
boolean isHidden = file.isHidden(); // 文件是否隐藏
System.out.println("name: " + name); // name: fileDemo.txt
System.out.println("len: " + len); // len: 11
System.out.println("canRead: " + canRead); // canRead: true
System.out.println("canWrite: " + canWrite); // canWrite: true
System.out.println("isHidden: " + isHidden); // isHidden: false
}
}

通过对比我们可以看出代码运行对文件所做的打印内容和电脑属性所展示的文件名,大小,可读写性等是一样的。

接下来我们再来看一下如何创建一个文件

 package FileDemo;

 import java.io.File;
import java.io.IOException; /**
* 创建一个文件
*
* @author wjt
*/
public class FileDemo2 {
public static void main(String[] args) throws IOException {
/**
* 在当前目录下创建文件 fileDemo2.txt
* 默认路径就是当前路径,即 "./",所以可以不写
*/
File file = new File("fileDemo2.txt");
if (!file.exists()) { // 判断是否存在该文件
file.createNewFile();
System.out.println("创建完毕!");
} else {
System.out.println("文件已存在!");
}
}
}

在上面都代码中,我们可以通过 file.exists() 来判断文件是否存在,然后通过 file.createNewFile() 来创建文件,需要注意都是该方法需要抛出异常,然后我们就可以在当前目录下创建我们需要都文件来。

既然能创建文件,纳闷我们就能删除文件,如下:

 /**
* 删除一个文件
*
* @author wjt
*/
public class FileDemo3 {
public static void main(String[] args) {
/**
* 删除当前目录中都 fileDemo2.txt 文件
*/
File file = new File("fileDemo2.txt");
if (file.exists()) { // 判断是否存在该文件
file.delete();
System.out.println("删除完毕");
} else {
System.out.println("文件不存在");
}
}
}

在上面都代码中,我们可以通过 file.delete() 方法来对文件进行删除,需要注意对是这里的删除是真的删了,在电脑的回收站里是找不到的,不像电脑的删除操作,所以在进行此操作时需要特别注意!

既然可以创建文件,那么我们也就能创建文件目录,如下:

 /**
* 创建一个目录
*
* @author wjt
*/
public class FileDemo4 {
public static void main(String[] args) {
// 创建一个单级目录
File dir1 = new File("demo");
if (!dir1.exists()) {
dir1.mkdir();
System.out.println("创建目录完毕!");
} else {
System.out.println("该目录已存在!");
}
// 创建一个多级目录 ./a/b/c
File dir2 = new File("a" + File.separator + "b" + File.separator + "c");
if (!dir2.exists()) {
// mkdirs() 在创建当前目录的同时将所有不存在的父目录一起创建出出来
dir2.mkdirs();
System.out.println("创建目录完毕!");
} else {
System.out.println("该目录已存在!");
}
}
}

创建文件和创建目录方法上大同小异,只不过是换成了 mkdir() 方法,但是需要注意对是在创建多级目录时所需要调用的方法是 mkdirs() 来进行创建。

同样的我们也可以对创建对目录进行删除,如下:

 /**
* 删除目录
* @author wjt
*/
public class FileDemo5 {
public static void main(String[] args) {
File dir1 = new File("demo");
if(dir1.exists()){
dir1.delete();
System.out.println("目录删除成功!");
}else {
System.out.println("目录不存在!");
} File dir2 = new File("a");
if(dir2.exists()){
dir2.delete();
System.out.println("目录删除成功!");
}else {
System.out.println("文件不存在!");
}
}
}

删除目录和删除文件所用对方法都是 delete(),我们通过该方法将刚才创建的目录 demo 和 a 进行删除,可以发现 demo 目录被删除成功了,a 目录虽然也打印了 “目录删除成功”,但是并没有真正的删除掉,这是因为 a 目录并不是一个空目录,如果想要删该目录,需要老老实实一级一级进行删除!如下代码:

 /**
* 获取一个目录中所有的子项
*
* @author wjt
*/
public class FileDemo6 {
public static void main(String[] args) {
// 获取当前目录中的所有子项
File dir = new File(".");
/**
* boolean isFile() 判断是否为一个文件
* boolean isDirectory() 判断是否为一个目录
*/
if (dir.isDirectory()) {
/**
* File[] listFiles() 获取所有子项
*/
File[] subs = dir.listFiles();
for (File sub : subs) {
if (sub.isFile()) {
System.out.print("文件:");
} else {
System.out.print("目录:");
}
System.out.println(sub.getName());
// 文件:demo.iml
// 目录:out
// 目录:a
// 文件:fileDemo.txt
// 目录:.idea
// 目录:src
}
}
}
}

在上面的代码中,我们可以获取到某一个目录下所有到文件和目录,那么我们就可以实现一个方法来对指定目录进行删除,如下

 /**
* 删除多级目录
*/
public class FileDemo7 {
public static void main(String[] args) {
File dir = new File("a");
delete(dir);
} public static void delete(File file) {
if (file.isDirectory()) {
// 将其所有子项删除
File[] subs = file.listFiles();
for (File sub : subs) {
// 递归调用
delete(sub);
}
}
file.delete();
}
}

通过上面对方法我们可以将多级目录进行删除,其中我们用到了递归操作!递归操作开销还是挺大对,在程序中应尽量避免!

我们在上面的代码中用到了 listFiles() 方法来获取当前目录下所有的文件和目录,当然我们也可以通过该方法获取到我们想要的文件或目录,如下:

 /**
* 获取一个目录中符合条件对部分子项
* 使用重载对 listFiles 方法,需要传入一个额外的文件过滤器
* 文件过滤器是一个接口:FileFilter
*
* @author wjt
*/
public class FileDemo8 {
public static void main(String[] args) {
File dir = new File(".");
// 获取名字以 "." 开头的子项
File[] subs = dir.listFiles(new FileFilter() {
@Override
public boolean accept(File file) {
return file.getName().startsWith(".");
}
});
for (File sub : subs) {
System.out.println(sub.getName()); // .idea
}
}
}

Java 从入门到进阶之路(二十八)的更多相关文章

  1. Java 从入门到进阶之路(十八)

    在之前的文章我们介绍了一下 Java 中的正则表达式,本章我们来看一下 Java 中的 Object. 在日常生活中,任何事物我们都可以看做是一个对象,在编程中是同样的道理,在 Java 编程中其实更 ...

  2. Java 从入门到进阶之路(十二)

    在之前的文章我们介绍了一下 Java 类的重写及与重载的区别,本章我们来看一下 Java 类的 private,static,final. 我们在之前引入 Java 类概念的时候是通过商场收银台来引入 ...

  3. Java 从入门到进阶之路(十)

    之前的文章我们介绍了一下 Java 中的引用型数组类型,接下来我们再来看一下 Java 中的继承. 继承的概念 继承是java面向对象编程技术的一块基石,因为它允许创建分等级层次的类. 继承就是子类继 ...

  4. Java 从入门到进阶之路(十五)

    在之前的文章我们介绍了一下 Java 中的接口,本章我们来看一下 Java 中类的多态. 在日常生活中,很多意思并不是我们想要的意思,如下: 1.领导:“你这是什么意思?” 小明:“没什么意思,意思意 ...

  5. Java 从入门到进阶之路(十四)

    在之前的文章我们介绍了一下 Java 中的抽象类和抽象方法,本章我们来看一下 Java 中的接口. 在日常生活中,我们会接触到很多类似接口的问题,比如 USB 接口,我们在电脑上插鼠标,键盘,U盘的时 ...

  6. Java 从入门到进阶之路(十六)

    在之前的文章我们介绍了一下 Java 中类的多态,本章我们来看一下 Java 中类的内部类. 在 Java 中,内部类分为成员内部类和匿名内部类. 我们先来看一下成员内部类: 1.类中套类,外面的叫外 ...

  7. Java 从入门到进阶之路(十九)

    在之前的文章我们介绍了一下 Java 中的Object,本章我们来看一下 Java 中的包装类. 在 Java 中有八个基本类型:byte,short,int,long,float,double,ch ...

  8. Python 爬虫从入门到进阶之路(十八)

    在之前的文章我们通过 scrapy 框架 及 scrapy.Spider 类做了一个<糗事百科>的糗百爬虫,本章我们再来看一下相较于 scrapy.Spider 类更为强大的 CrawlS ...

  9. Java 从入门到进阶之路(二十)

    在之前的文章我们介绍了一下 Java 中的包装类,本章我们来看一下 Java 中的日期操作. 在我们日常编程中,日期使我们非常常用的一个操作,比如读写日期,输出日志等,那接下来我们就看一下 Java ...

  10. Java 从入门到进阶之路(二十三)

    在之前的文章我们介绍了一下 Java 中的  集合框架中的Collection 的迭代器 Iterator,本章我们来看一下 Java 集合框架中的Collection 的泛型. 在讲泛型之前我们先来 ...

随机推荐

  1. Java实现蓝桥杯VIP 算法训练 找公倍数

    问题描述 这里写问题描述. 打印出1-1000所有11和17的公倍数. 样例输入 一个满足题目要求的输入范例. 样例输出 与上面的样例输入对应的输出. 这道题其实没有什么可写的,但是为了让读者更方便的 ...

  2. Java实现 洛谷 P2141 珠心算测验

    import java.util.LinkedList; import java.util.Scanner; public class Main { private static Scanner ci ...

  3. Java实现 串中取3个不重复字母

    从标准输入读入一个由字母构成的串(不大于30个字符). 从该串中取出3个不重复的字符,求所有的取法. 取出的字符,要求按字母升序排列成一个串. 不同的取法输出顺序可以不考虑. 例如: 输入: abc ...

  4. Java实现第九届蓝桥杯书号验证

    书号验证 2004年起,国际ISBN中心出版了<13位国际标准书号指南>. 原有10位书号前加978作为商品分类标识:校验规则也改变. 校验位的加权算法与10位ISBN的算法不同,具体算法 ...

  5. 一个static和面试官扯了一个小时,舌战加强版

    一:背景 1. 讲故事 最近也是奇怪,在社区里看到好几篇文章聊static 的玩法以及怎么拿这个和面试官扯半个小时,有点意思,点进去看都是java版的,这就没意思了,怎么也得有一篇和面试官扯C# 中的 ...

  6. 诸葛亮vs司马懿,排序算法大战谁能笑到最后?

    阵前对峙 公元234年,蜀汉丞相诸葛孔明再次北伐. 一日,与司马仲达所率魏军两军相峙,二人阵前舌战. 司马曰:"诸葛村夫,吾与汝相斗数年,斗兵斗阵斗谋略,均已疲乏.今日,何不一改陈规,斗点新 ...

  7. 启动fiddler情况下,网络连接错误[Fiddler] The connection to ** failed.解决办法

    这种错误是由于浏览器设置了代理,而代理服务器配置不正确导致 解决办法 1.关闭浏览器服务器代理,设置-高级-网络代理 2.检查网络代理设置是否正确,Fiddler中配置的端口号需要跟浏览器中配置的端口 ...

  8. [ARC101B]Median of Medians

    题目   点这里看题目. 分析   看到中位数,当然会想到二分答案.   考虑检查答案.自然,我们需要找出中位数小于二分值\(k\)的区间的个数.考虑构造一个\(b\): \[b_i=(-1)^{[a ...

  9. Redis系列(三):redisServer、redisDb、redisObject、sds四大结构体理解

    一.源码下载: Windows中的Redis源码下载:https://github.com/microsoftarchive/redis/tree/3.2 根据官网说明可知,用VS2013编译,但是必 ...

  10. java特性 JDK JRE JVM

    1简单性 2可移植性性(跨平台) 3面向对象 4高性能 5分布式 6动态性 7多线程 8安全性JDK:java开发工具 . JRE:JDK:java运行环境 . JVM:JDK:java虚拟机