File类是Object的一个子类,与四大家族流是没有关系的,所以File不能对文件进行读和写的操作。
File类是文件和目录路径名的抽象表示。即File对象对应的可能是一个文件,也可能是一个目录。
对于File类,查看api文档,可以看到有非常多的方法,需要掌握其中的一些常用方法。
常用方法的使用:
package com.dh.io;
import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class FileDemo {
public static void main(String[] args) {
//通过构造方法创建一个File类对象
File file1 = new File("F:\\file1");
//首先先判断文件是否存在
boolean b = file1.exists();
//如果不存在
if (!b) {
//以文件的形式创建
try {
file1.createNewFile();
System.out.println("file1文件创建成功!");
} catch (IOException e) {
e.printStackTrace();
}
} else {
System.out.println("file1文件已存在!");
}
File file2 = new File("F:\\file2");
if (!file2.exists()) {
//以目录的形式创建
file2.mkdir();
System.out.println("file2目录创建成功!");
} else {
System.out.println("file2目录已存在!");
}
File file3 = new File("F:\\file3\\test");
if (!file3.exists()) {
//或者以多重目录的形式创建
file3.mkdirs();
System.out.println("file3多重目录创建成功!");
} else {
System.out.println("file3多重目录已存在!");
}
//判断是否是一个目录
System.out.println("file1是一个文件吗?" + file1.isFile());
System.out.println("file1是一个目录吗?" + file1.isDirectory());
//判断是否是一个文件
System.out.println("file2是一个文件吗?" + file2.isFile());
System.out.println("file2是一个目录吗?" + file2.isDirectory());
//获取父路径(1)
String parent = file1.getParent();
System.out.println("file1的父路径:" + parent);
//获取父路径(2)
File parentFile = file1.getParentFile();
System.out.println("file1的绝对路径:" + parentFile);
//获取绝对路径
String absolutePath = file1.getAbsolutePath();
System.out.println(absolutePath);
//获取文件最后一次修改时间
long l = file1.lastModified();
Date date = new Date(l);
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String s = dateFormat.format(date);
System.out.println("file1的最后一次修改时间:" + s);
//获取文件的大小
long length = file1.length();
System.out.println("file1的长度:" + length);
//获取所有的子目录名称
File file4 = new File("F:\\file3");
File[] files = file4.listFiles();
for (File file : files) {
System.out.println(file.getName());
}
}
}
结果:
file1文件创建成功!
file2目录创建成功!
file3多重目录创建成功!
file1是一个文件吗?true
file1是一个目录吗?false
file2是一个文件吗?false
file2是一个目录吗?true
file1的父路径:F:file1的绝对路径:F:F:\file1
file1的最后一次修改时间:2021-02-08 11:51:50
file1的长度:0
test
四大家族是可以完成对文件的读写复制的,但是不能对目录进行复制操作,要对目录进行复制的话,就需要使用File类啦。
分析实现逻辑:
首先我们需要去递归判断(因为可能存在多重目录)要复制目录下的子目录和子文件,如果是目录就在目的目录下新建对应的目录,如果是文件的话,就停止递归,使用流操作完成对文件的复制。
实现代码:
package com.dh.io;
import java.io.*;
public class FileCopyDemo {
public static void main(String[] args) {
//拷贝源
File fileSrc = new File("F:\\test");
//拷贝目标
File fileDes = new File("D:\\");
//调用拷贝方法
copyFiles(fileSrc,fileDes);
}
public static void copyFiles(File fileSrc,File fileDes){
//如果是文件,则复制文件,然后退出
FileInputStream fis = null;
FileOutputStream fos = null;
if(fileSrc.isFile()){
try {
fis = new FileInputStream(fileSrc);
String path = (fileDes.getAbsolutePath().endsWith("\\") ?fileDes.getAbsolutePath() : fileDes.getAbsolutePath() + "\\") + fileSrc.getAbsolutePath().substring(3);
fos = new FileOutputStream(path);
byte[] bytes = new byte[1024*1024];
int readCount = 0;
while((readCount = fis.read(bytes))!=-1){
fos.write(bytes,0,readCount);
}
fos.flush();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally {
if(fos != null){
try {
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(fis != null){
try {
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return;
}
//如果是目录,则获取该目录下的文件,遍历
File[] files = fileSrc.listFiles();
for (File file : files) {
if(file.isDirectory()){
//获取源路径
String srcPath = file.getAbsolutePath();
//利用拷贝目标和源路径拼接,获得对应的目录
String desPath = (fileDes.getAbsolutePath().endsWith("\\") ?fileDes.getAbsolutePath() : fileDes.getAbsolutePath() + "\\") + srcPath.substring(3);
// System.out.println(desPath);
File newFile = new File(desPath);
if(!(newFile.exists())){
newFile.mkdirs();
}
}
//用遍历的当前元素继续递归
copyFiles(file,fileDes);
}
}
}
这样就可以实现目录的拷贝啦!
原文:https://www.cnblogs.com/denghui-study/p/14388649.html