📓
Be a Javaer
  • Introduction
  • 第 1 章 Java编程开发入门
    • 第 1 节 Java开发准备
    • 第 2 节 Java基本概念
    • 第 3 节 Java数据类型划分
    • 第 4 节 Java运算符
    • 第 5 节 Java程序逻辑控制
    • 第 6 节 Java方法的定义及使用
  • 第 2 章 Java面向对象编程
    • 第 1 节 类与对象
    • 第 2 节 深入分析类与对象
    • 第 3 节 数组的定义与使用
    • 第 4 节 String类的基本概念
    • 第 5 节 String类的常用方法
    • 第 6 节 this关键字
    • 第 7 节 引用传递
    • 第 8 节 数据表与简单Java类映射
    • 第 9 节 对象比较
    • 第 10 节 static关键字
    • 第 11 节 代码块
    • 第 12 节 内部类
    • 第 13 节 链表的定义与使用
    • 第 14 节 继承性
    • 第 15 节 覆写
    • 第 16 节 数组操作
    • 第 17 节 辅助概念
      • final关键字
      • 多态性
    • 第 18 节 抽象类的定义及使用
    • 第 19 节 接口的定义及使用
    • 第 20 节 Object类
    • 第 21 节 拓展概念
      • 匿名内部类
      • 包装类
    • 第 22 节 包的定义及使用
    • 第 23 节 访问控制权限
      • 单例设计模式
      • 多例设计模式
    • 第 24 节 异常的捕获及处理
    • 第 25 节 Java5新特性
      • 可变参数
      • foreach循环
      • 静态导入
    • 第 26 节 泛型
    • 第 27 节 枚举
    • 第 28 节 Annotation
    • 第 29 节 Java7新特性
      • AutoCloseable
      • Try-with-resources
    • 第 30 节 Java8新特性
      • 接口定义增强
      • Lambda表达式
      • 方法引用
      • 函数式接口
  • 第 3 章 Java高级编程
    • 第 1 节 Java多线程基础实现
    • 第 2 节 线程常用操作方法
    • 第 3 节 线程的同步与死锁
    • 第 4 节 生产者与消费者
    • 第 5 节 Java基础类库
      • StringBuffer
      • Runtime
      • System
      • finalize
      • Cleaner
      • 对象克隆
    • 第 6 节 数字操作类
      • Math类
      • Random类
      • 大数字操作类
    • 第 7 节 日期处理类
      • Date类
      • 日期格式化
      • Calendar类
    • 第 8 节 比较器
    • 第 9 节 正则表达式
      • 常用的正则标记
      • String类对正则的支持
      • java.util.regex包支持
    • 第 10 节 反射机制
    • 第 11 节 动态代理
    • 第 12 节 反射与Annotation
    • 第 13 节 国际化程序实现
    • 第 14 节 开发支持类库
      • Arrays类
      • UUID类
      • Optional类
      • ThreadLocal类
      • 定时器
      • Base64加密工具
    • 第 15 节 文件操作
    • 第 16 节 字节流与字符流
    • 第 17 节 IO辅助概念
      • 字符编码
      • 内存流
      • 管道流
      • RandomAccessFile
    • 第 18 节 打印流
    • 第 19 节 System类对IO的支持
    • 第 20 节 对象序列化
    • 第 21 节 IO高级应用
      • 缓冲输入流
      • Scanner
    • 第 22 节 网络编程
    • 第 23 节 类集框架
    • 第 24 节 List集合
    • 第 25 节 集合输出
    • 第 26 节 Map集合
    • 第 27 节 Set集合
    • 第 28 节 集合工具类
      • Stack
      • Queue
      • Properties
      • Collections工具类
    • 第 29 节 数据流Stream
    • 第 30 节 JDBC简介
    • 第 31 节 Statement接口
    • 第 32 节 PreparedStatment接口
    • 第 33 节 批处理与事务处理
  • 第 4 章 Oracle数据库基础
    • 第 1 节 Oracle简介
    • 第 2 节 Oracle安装与配置
    • 第 3 节 SQLPlus命令
    • 第 4 节 SQL简介与数据表分析
    • 第 5 节 SQL简单查询
    • 第 6 节 SQL限定查询
    • 第 7 节 查询排序
    • 第 8 节 综合练习:基础查询
    • 第 9 节 单行函数
    • 第 10 节 多表查询
    • 第 11 节 分组统计查询
    • 第 12 节 子查询
    • 第 13 节 综合案例:复杂查询
    • 第 14 节 数据更新操作
    • 第 15 节 事务处理
    • 第 16 节 数据伪列
    • 第 17 节 数据表的创建与管理
    • 第 18 节 约束的创建与管理
    • 第 19 节 综合案例:数据表操作
    • 第 20 节 序列的定义与使用
  • 第 5 章 JavaWeb基础
  • 第 6 章 走向单体地狱
  • 第 7 章 GitFlow工作流指南
    • 版本控制
    • Git
    • 集中式工作流
    • 功能分支工作流
    • GitFlow 工作流
    • Forking 工作流
    • Pull Requests
  • 第 8 章 微服务入门
    • 第 1 节 微服务简介
    • 第 2 节 Linux
    • 第 3 节 Docker
    • Docker 仓库
    • Ubuntu 安装 Docker
    • Docker 镜像加速器
    • 第 4 节 Docker Compose
    • 第 5 节 GitLab
    • 第 6 节 Nexus
    • 第 7 节 Harbor
  • 第 9 章 再谈微服务
  • 第 10 章 Spring Boot
  • 第 11 章 Spring Cloud Netflix
  • 第 12 章 Apache Dubbo Zookeeper
  • 第 13 章 Spring Cloud Alibaba
  • 第 14 章 Vue
  • 第 15 章 Kubernetes
  • 第 16 章 Spring Security oAuth2
  • 第 17 章 Flutter
  • Redis
    • Redis 入门
    • Redis 的数据类型
    • Redis 事务
    • Jedis
    • Spring Boot 整合 Redis
    • Redis 配置文件
    • Redis 持久化
    • Redis 发布/订阅
    • Redis 主从复制
    • Redis Sentinel
    • Redis 缓存故障
  • Glossary
由 GitBook 提供支持
在本页

这有帮助吗?

  1. 第 3 章 Java高级编程

第 15 节 文件操作


使用File类来进行文件的操作。

如果要进行所有的文件以及文件内容的开发操作,应该使用java.io包完成,而在java.io包里面一共有五个核心类和一个核心接口:

  • 五个核心类:File、InputStream、OutputStream、Reader、Writer;

  • 一个核心接口:Serializable。

在整个java.io包里面,File类是唯一一个与文件本身操作有关的类,但是不涉及到文件的具体内容。文件本身指的是文件的创建、删除等操作。

如果想要使用File类,那么首先就需要通过它提供的构造方法定义一个要操作文件的路径:

  • 设置完整路径:public File(String pathname),大部分情况下使用此类操作;

  • 设置父路径与子文件路径:public File(String parent, String child),在Android上使用比较多。

范例: 操作文件

  • 创建文件:public boolean createNewFile() throws IOException

    • 如果目录不能访问;

    • 文件名称重名或错误;

  • 删除文件:public boolean delete();

  • 判断文件是否存在:public boolean exists();

package com.alpha;
import java.io.File;
public class MainClass { 
	public static void main(String[] args) throws Exception {
		File file = new File("d:/test.txt"); //设置文件的路径
		if (file.exists()) {
			file.delete();
		} else {
			System.out.println(file.createNewFile());
		}
	}
}

以上的程序已经完成了具体的文件创建与删除的操作,但是此时的程序会存在有两个问题:

  • 在Windows系统里面支持的是“\”路径分割符,Linux下使用的是“/”路径分隔符;

    • 在File类里面提供有一个常量:public static final String separator;

	File file = new File("d:" + File.separator + "test.txt"); //设置文件的路径
  • 在进行java.io操作的过程之中,会出现有延迟的情况,因为现在的问题是Java程序是通过JVM间接的调用操作系统的文件处理函数进行的文件处理操作,所以中间会出现延迟情况。

以上已经实现了文件的创建操作,但是这个时候是直接创建在了根目录下,下面来创建包含有子目录的文件。

	File file = new File("d:" + File.separator + "demo" + File.separator + "test.txt"); //设置文件的路径

那么现在由于“demo”目录不存在,所以系统会以为此时的路径是不能够使用的,那么就会出现错误。所以现在必须要想办法判断要创建的父路径是否存在。

  • 找到父路径:public File getParentFile();

  • 创建目录:public boolean mkdirs();

package com.alpha;
import java.io.File;
public class MainClass { 
	public static void main(String[] args) throws Exception {
		File file = new File("d:" + File.separator + "demo" + File.separator + "hello" + File.separator + "mori" + File.separator + "test.txt"); //设置文件的路径
		if (!file.getParentFile().exists()) {
			file.getParentFile().mkdirs(); // 创建父路径
		}
		if (file.exists()) {
			file.delete();
		} else {
			System.out.println(file.createNewFile());
		}
	}
}

在File类里面还提供有一系列的取得文件信息内容的操作功能:

  • 取得文件的大小:public long length(),按照字节返回;

  • 判断是否是文件:public boolean isFile();

  • 判断是否是目录:public boolean isDirectory();

  • 最近一次修改日期:public long lastModified();

package com.alpha;
import java.io.File;
import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.util.Date;
public class MainClass { 
	public static void main(String[] args) throws Exception {
		File file = new File("d:" + File.separator + "city.jpg"); //设置文件的路径
		if (file.exists()) {
			System.out.println("是否是文件:" + file.isFile());
			System.out.println("是否是目录:" + file.isDirectory()); 
			System.out.println("文件大小:" + new BigDecimal((double)file.length() / 1024 / 1024).divide(new BigDecimal(1), 2, BigDecimal.ROUND_HALF_UP) + " MB");
			System.out.println("上次修改时间:" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date(file.lastModified()))); 
		}
	}
}

整个取得的过程里面取得的都是文件的相关信息,但是不包含文件内容。

以上的所有操作都是围绕着文件进行的,但是在整个磁盘上除了文件之外,还会包含有使用的目录,那么对于目录而言,最为常用的功能应该就是列出目录组成,在File类里面定义有如下的两个列出目录的方法:

  • 列出目录下的信息:public String[] list();

  • 列出所有的信息以File类对象包装:public File[] listFiles()。

范例: 列出信息

package com.alpha;
import java.io.File;
public class MainClass { 
	public static void main(String[] args) throws Exception {
		File file = new File("d:" + File.separator); //设置文件的路径
		if (file.isDirectory()) {
			String[] result = file.list();
			for (String filename : result) {
				System.out.println(filename);
			}
		}
	}
}

范例: 列出全部的File类对象

package com.alpha;
import java.io.File;
public class MainClass { 
	public static void main(String[] args) throws Exception {
		File file = new File("d:" + File.separator); //设置文件的路径
		if (file.isDirectory()) {
			File[] result = file.listFiles();
			for (File filename : result) {
				System.out.println(filename);
			}
		}
	}
}
package com.alpha;
import java.io.File;
import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.util.Date;
public class MainClass { 
	public static void main(String[] args) throws Exception {
		File file = new File("d:" + File.separator); //设置文件的路径
		if (file.isDirectory()) {
			File[] result = file.listFiles();
			for (File filename : result) {
				System.out.println(filename + "\t\t" 
						+ new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date(file.lastModified())) + "\t\t" 
						+ (filename.isDirectory() ? "文件夹" : "文件") + "\t\t" 
						+ (filename.isFile() ? (new BigDecimal((double)file.length() / 1024 / 1024).divide(new BigDecimal(1), 2, BigDecimal.ROUND_HALF_UP) + " MB") : ""));
			}
		}
	}
}

通过一系列验证可以发现,取得文件对象列表会更加的方便,因为可以继续取出跟多的内容。

**思考题:**列出指定目录下的所有子路径

  • 原则:如果现在给定的路径依然是一个目录,则应该向里面继续列出所有的组成,应该使用递归的方式完成。

package com.alpha;
import java.io.File;
public class MainClass { 
	public static void main(String[] args) throws Exception {
		File file = new File("d:" + File.separator);
		print(file);
	}
	public static void print(File file) {
		if (file.isDirectory()) {
			File[] result = file.listFiles();
			if (result != null) {
				for (File filename : result) {
					print(filename);
				}
			}
		}
		System.out.println(file);
	} 
}

如果现在将以上的输出变成删除了呢?这就成为了一个恶性程序。

总结

1、File类本身只是操作文件的,不涉及到内容;

2、File类中的重要方法:

  • 设置完整路径:public File(String pathname);

  • 删除文件:public boolean delete();

  • 判断文件是否存在:public boolean exists();

  • 找到父路径:public File getParentFile();

  • 创建目录:public boolean mkdirs();

3、在使用File类操作的时候路径的分隔符使用:File.separator;

上一页第 14 节 开发支持类库下一页第 16 节 字节流与字符流

最后更新于5年前

这有帮助吗?