文件和目录路径名的抽象表示
一、File类
/*
* java.io.File类:文件和文件路径的抽象表示形式,与平台无关
* 在操作系统层面,一切皆文件。文件是操作系统保存数据和逻辑的唯一形式
* File能新建、删除、重命名文件和目录,但是不能访问文件内容本身
* 如果需要访问文件内容本身,需要使用输入/输出流
* File 类不具有从文件读取信息和向文件写入信息的功能,它仅描述文件本身的属性
* 在java程序中表示一个真实存在的文件或目录,则必须有一个File对象
* File对象可作为参数传递给流的构造器
*
* File类的构造方法
* public File(String pathname): 以pathname为路径创建File对象,可以是绝对路径或相对路径
* public File(String parent, String child): 以parent为父路径,child为子路径创建
* public File(File parent, String child): 根据一个父File对象和子文件路径成File对象
*
* 常用方法
* 获取功能:
* public String getAbsolutePath(): 获取绝对路径
* public String getPath(): 回去路径
* public String getName(): 获取名称
* public String getParent(): 获取上层文件目录,若无,返回null
* public Long length(): 获取文件长度(即字节数)。不能获取目录长度
* public Long lastModified(): 获取最后一次修改时间,毫秒值
* public String[] list(): 获取指定目录下所有文件或者文件目录的名称数组
* public File[] listFiles(): 获取指定目录下所有文件或者文件目录的File数组
* 重命名功能:
* public boolean renameTo(File dest): 重命名为指定文件路径
* 判断功能:
* public boolean isDirectory(): 判断是否是文件目录
* public boolean isFile(): 判断是否是文件
* public boolean exists(): 判断是否存在
* public boolean canRead(): 判断是否可写
* public boolean canWrite(): 判断是否可读
* public boolean isHidden(): 判断是否隐藏
* 创建删除功能:
* public boolean createNewFile(): 创建文件,若文件存在,则不创建,返回false
* public boolean mkdir(): 创建文件目录,若存在,不创建。若文件目录上层目录不存在,也不创建
* public boolean mkdirs(): 创建文件目录,若文件目录上层目录不存在,一并创建
* 如果创建文件或目录没有写盘符名称,则默认在项目路径下
* public boolean delete(): 删除文件或文件夹
* java中删除不走回车站
* */
public class _01_File {
public static void main(String[] args) throws IOException {
// 创建文件对象,可以是文件也可以是目录
File file = new File("D:/迅雷下载/JavaWeb_tianliang");
System.out.println(file.getAbsoluteFile());
System.out.println(file.getName());
System.out.println(file.getParent());
System.out.println(file.isFile()); // false
System.out.println(file.isDirectory()); // true
// 获取子文件
File[] files = file.listFiles();
for (File file1 : files) {
// 打印绝对路径
System.out.println(file1.getAbsoluteFile());
}
System.out.println(file.exists()); // true
// 创建一个不存在目录
File file1 = new File("D:/com/ZPR");
System.out.println(file1.exists()); // false
// 创建一个不存在目录
// 只创建ZPR目录,不会创建com目录
// file1.mkdir();
// 递归创建所有目录(com和ZPR)
// file1.mkdirs();
System.out.println("-----------------------------");
// 创建文件
File file2 = new File("D:/JavaTest/IO.java");
// 如果有对应文件就不创建,返回false。否则返回true
System.out.println(file2.createNewFile());
// 删除文件,删除成功返回true
System.out.println(file2.delete());
File file3 = new File("D:/JavaTest/111.txt");
System.out.println(file3.canRead());
}
}
二、使用File类实现文件递归复制
/*
* 递归赋值一个文件夹
* 使用标准化开发流程(高内聚、低耦合)
* 1 文件复制:本质是输入和输出
* a 完成文件输入
* b 完成文件输出
* c 整合输入输出,完成文件复制
* 代码test1~2,FileUtil,FileException
* 2 获取目录下所有子目录
* a 获取目录对象
* b 获取目录下直接子目录
* c 获取目录下所有后代目录
* 代码test3~4,FileCopyManager
* 3 整合所有后代目录,和文件复制
* a 获取所有后代目录后,得到每一个后代文件对象
* b 通过文件对象可以获得文件的全路径
* c 通过全路径可创建输入流
* d 然后创建输出流输出
* 代码FileCopyManager,CopyDirectory
*
* 复制时输入流和输出流的路径不能相同,否则导致以下两种情况
* 1 文件清空 boolean false
* 2 死循环写数据 boolean true
* 创建输出流对象的时候,构造方法第二个参数可传递Boolean值
* true:向该文件中追加写入新数据
* false:覆盖该文件,重新写入
* 1 false情况:
* 如果没有传递Boolean值,默认是覆盖写入
* 在创建对象时,会把文件清空。导致使用输入流入读的时候读不到,返回-1
* 2 true情况:2
* 追加写入,成功输出流对象时不会情况文件,在读数据时返回-1时候才写入,但是每次写入之后,循环再读,
* 这时候不是返回-1,因为写入了数据。并且是读了多少就追加多少,会造成不断读写,进入死循环。
* */
util工具类
/**
* 核心业务类
* 按文件目录递归复制类
*/
public class FileCopyManager {
/**
* 递归复制(方法重载)
* 对外提供的接口
* @param srcPath 被复制文件路径
* @param destPath 目标路径
*/
public static void checkMenu(String srcPath, String destPath){
File file = new File(srcPath); // 重载新加的功能
checkMenu(file,destPath);
}
/**
* 递归复制
* a 获取所有后代目录后,得到每一个后代文件对象
* b 通过文件对象可以获得文件的全路径
* c 通过全路径可创建输入流
* d 然后创建输出流输出
* @param file 被复制的文件对象
* @param destPath 目标路径
*/
private static void checkMenu(File file, String destPath){
// 判断是否是文件
if (file.isFile()){
// 文件全路径(源文件)
String filePath = file.getAbsolutePath();
// 截取路径并拼接字符串,把源文件内容复制到目录路径
// 源文件:D:\迅雷下载\JavaWeb_tianliang\01_JavaWeb介绍\1-1 JavaWeb介绍-1365902892321472512.mp4
// 目录:D:\JavaTest\JavaWeb_tianliang\01_JavaWeb介绍\1-1 JavaWeb介绍-1365902892321472512.mp4
// "D:\迅雷下载" 被 "D:\JavaTest"代替。"D:\迅雷下载"占用7个字符,则重第七个开始截取源文件路径
// 使能够做到完全复制,"D:\JavaTest"使用参数传入,外部控制
String newFilePath = destPath+filePath.substring(7);
// 判断目标目录是否存在,输出流只会创建文件,不会创建目录
// newFilePath是文件对象,这里判断该文件所在目录是否存在,不存在就创建目录
// 获取上级目录
File parentFile = new File(newFilePath).getParentFile();
if (!parentFile.exists()){
parentFile.mkdirs();
}
// 到这里,目标目录创建成功,开始复制
FileUtil.copyFile(filePath,newFilePath);
return;
}
// 到这说明是目录
// 获取所有子文件
File[] files = file.listFiles();
for (File file1 : files) {
// 不断递归判断是否是文件,是文件打印文件绝对路径,否则递归继续判断子目录
checkMenu(file1,destPath);
}
}
}
/*
* 文件操作异常类
* */
public class FileException extends RuntimeException{
private static final long serialVersionUID = 1L;
public FileException() {
}
public FileException(String message) {
super(message);
}
}
**
* 复制文件工具类
*/
public class FileUtil {
/**
* 复制文件,使用字节复制,存文本另外使用
* @param srcPath 原文件路径
* @param destPath 目标文件路径
*/
public static void copyFile(String srcPath, String destPath) throws FileException {
// 两个路径去除两边空格相等,直接返回
if (srcPath.trim().equals(destPath.trim())) {
throw new FileException("原文件路径和目标文件路径不能相同");
}
try (
FileInputStream fis = new FileInputStream(srcPath);
BufferedInputStream bis = new BufferedInputStream(fis);
FileOutputStream fos = new FileOutputStream(destPath);
BufferedOutputStream bos = new BufferedOutputStream(fos)
){
byte[] bytes = new byte[1024];
int temp;
while ((temp=bis.read(bytes))!=-1){
bos.write(bytes,0,temp);
}
} catch (Exception e){
e.printStackTrace();
}
}
}
测试util类
// 复制文件测试
public class _01_test_copyFile {
public static void main(String[] args) {
try (
FileInputStream fis = new FileInputStream("D:/test.txt");
BufferedInputStream bis = new BufferedInputStream(fis);
FileOutputStream fos = new FileOutputStream("D:/test1.txt");
BufferedOutputStream bos = new BufferedOutputStream(fos)
){
byte[] bytes = new byte[1024];
int temp;
while ((temp=bis.read(bytes))!=-1){
bos.write(bytes,0,temp);
}
} catch (Exception e){
e.printStackTrace();
}
}
}
public class _02_test_FileUtil {
public static void main(String[] args) {
FileUtil.copyFile("D:/test.txt","D:/test1.txt");
}
}
// 获取目录下直接子目录
public class _03_test_Subfile {
public static void main(String[] args) {
// 创建文件对象
File file = new File("D:/迅雷下载/JavaWeb_tianliang");
if (file.isFile()){
System.out.println(file.getName());
return;
}
// 到这说明是目录
// 获取所有子文件
File[] files = file.listFiles();
for (File file1 : files) {
System.out.println(file1.getName());
}
}
}
// 获取目录下所有后代目录
public class _04_test_Subfiles {
public static void main(String[] args) {
// 创建文件对象
File file = new File("D:/迅雷下载/JavaWeb_tianliang");
test(file);
}
public static void test(File file){
// 判断是否是文件
if (file.isFile()){
// 是打印路径
System.out.println(file.getAbsolutePath());
return;
}
// 到这说明是目录
// 获取所有子文件
File[] files = file.listFiles();
for (File file1 : files) {
// 不断递归判断是否是文件,是文件打印文件绝对路径,否则递归继续判断子目录
test(file1);
}
}
}
用户类
public class CopyDirectory {
public static void main(String[] args) {
String srcPath = "D:/迅雷下载/JavaWeb_tianliang";
String destPath = "D:/JavaTest";
// 对外仅通过提供源文件路径和目标路径即可完成复制
// 高内聚低耦合
FileCopyManager.checkMenu(srcPath,destPath);
}
}