在之前的文章我们都是通过 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实现 LeetCode 376 摆动序列

    376. 摆动序列 如果连续数字之间的差严格地在正数和负数之间交替,则数字序列称为摆动序列.第一个差(如果存在的话)可能是正数或负数.少于两个元素的序列也是摆动序列. 例如, [1,7,4,9,2,5 ...

  2. Java实现 蓝桥杯VIP 算法训练 暗恋

    算法训练 暗恋 时间限制:1.0s 内存限制:256.0MB 问题描述 同在一个高中,他却不敢去找她,虽然在别人看来,那是再简单不过的事.暗恋,是他唯一能做的事.他只能在每天课间操的时候,望望她的位置 ...

  3. Java实现 蓝桥杯VIP 算法训练 乘法表

    问题描述 输出九九乘法表. 输出格式 输出格式见下面的样例.乘号用""表示. 样例输出 下面给出输出的前几行: 11=1 21=2 22=4 31=3 32=6 33=9 41=4 ...

  4. Java实现 LeetCode 29 两数相除

    29. 两数相除 给定两个整数,被除数 dividend 和除数 divisor.将两数相除,要求不使用乘法.除法和 mod 运算符. 返回被除数 dividend 除以除数 divisor 得到的商 ...

  5. Redis企业级数据备份与恢复方案

    一.持久化配置 RBD和AOF建议同时打开(Redis4.0之后支持) RDB做冷备,AOF做数据恢复(数据更可靠) RDB采取默认配置即可,AOF推荐采取everysec每秒策略 AOF和RDB还不 ...

  6. 全网最全测试点总结:N95 口罩应该如何测试?

    引言 随着”新冠疫情“慢慢地消散,各大企业都开始恢复正常的运行,因为疫情造成很多工作人员的流失,企业也开始疯狂的招聘新鲜的人才,这对于莘莘求职者无疑是个机会,但是因为求职者众多,很多面试官也开始想方设 ...

  7. 使用root配置的hadoop并启动会出现报错

    1.使用root配置的hadoop并启动会出现报错 错误:         Starting namenodes on [master]         ERROR: Attempting to op ...

  8. Pipeline 脚本调用 mvn 命令失败

    问题描述 jenkins构建job时 提示mvn 未找到命令 + export JAVA_HOME=/home/tools/jdk1.8.0_221 + JAVA_HOME=/home/tools/j ...

  9. zabbix 监控 tcp 连接数

    一.zabbix-agent 服务器配置 1.编辑zabbix_agent配置文件,添加以下内容 vim /etc/zabbix/zabbix_agentd.conf ##添加此行 UserParam ...

  10. 一文讲透Java序列化

    本文目录 一.序列化是什么 二.为什么需要序列化 三.序列化怎么用 四.序列化深度探秘 4.1 为什么必须实现Serializable接口 4.2 被序列化对象的字段是引用时该怎么办 4.3 同一个对 ...