File类及文件夹的完整复制
File类
在实现IO流对文件处理的时候,有一个类是一定要学习的,那就是File类
-
File类的父类是Object,所以不能完成文件的读写操作
-
file对象代表文件和目录路径所在的抽象表示形式
-
file对象可以是一个文件,也可以是一个目录
-
File对象hi是一个路径名的抽象表现形式
1.构造方法
File(File parent, String child) | 从父抽象路径名和子路径名字符串创建新的 File 实例。 |
File(String pathname) | 通过将给定的路径名字符串转换为抽象路径名来创建新的 File 实例。 |
File(String parent, String child) | 从父路径名字符串和子路径名字符串创建新的 File 实例。 |
File(URI uri) | 通过将给定的 file: URI转换为抽象路径名来创建新的 File 实例。 |
2.File类常用方法
方法名 | 作用 |
---|---|
exists() |
测试此抽象路径名表示的文件或目录是否存在。 |
equals(Object obj) |
测试此抽象路径名与给定对象的相等性。 |
long length() |
返回由此抽象路径名表示的文件的长度。 |
File[ ] listFiles() |
返回一个抽象路径名数组,表示由该抽象路径名表示的目录中的文件。 |
mkdir() |
创建由此抽象路径名命名的目录。 |
mkdirs() |
创建由此抽象路径名命名的目录,包括任何必需但不存在的父目录。 |
createNewFile () |
当且仅当具有该名称的文件尚不存在时,原子地创建一个由该抽象路径名命名的新的空文件。 |
String getAbsolutePath() |
返回此抽象路径名的绝对路径名字符串。 |
String getName() |
返回由此抽象路径名表示的文件或目录的名称。 |
String getParent() |
返回此抽象路径名的父 null 的路径名字符串,如果此路径名未命名为父目录,则返回null。 |
getParentFile() |
返回此抽象路径名的父,或抽象路径名 null 如果此路径名没有指定父目录。 |
String getPath() |
将此抽象路径名转换为路径名字符串。 |
3.代码示例
import java.io.File;
import java.io.IOException;
public class FileTest01 {
public static void main(String[] args) throws IOException {
File f1 = new File("D:/JAVATest/files");
//1.exists判断是否存在
System.out.println(f1.exists());
//如果文件不存在,那么以文件的形式创建出来
// if (!f1.exists()) {
// f1.createNewFile();
// }
//如果文件不存在,以目录的形式创建出来
// if (!f1.exists()){
// f1.mkdir();
// }
File f2 = new File("D:/JAVATest/a/b/c/d/e");
//也可以以多重目录的形式创建
// if (!f2.exists()){
// f2.mkdirs();
// }
File f3=new File("D:/JAVATest/a/b");
//获取文件的父路径
String paraentPath=f3.getParent();
System.out.println(paraentPath);
//获取绝对路径
File paraentFile=f3.getParentFile();
System.out.println("绝对路径"+paraentFile.getAbsolutePath());
File f4=new File("log");
System.out.println("绝对路径"+f4.getAbsolutePath());
}
}
输出:
false
D:\JAVATest\a
绝对路径D:\JAVATest\a
绝对路径D:\AAAbegin\JAVASE\log
以及上述创建的新文件和目录,在执行一次之后也已经创建成功
file文件被创建
a/b/c/d/e目录被创建
看下一段代码,也是介绍File类的方法
import java.io.File;
import java.text.SimpleDateFormat;
import java.util.Date;
public class FileTest02 {
public static void main(String[] args) {
File f1 = new File("D:/JAVATest/files");
//如果文件存在执行删除操作,delete()方法删除文件路径或目录
if (f1.exists()){
f1.delete();
}
System.out.println(f1.exists());
File f2 = new File("D:/JAVATest/a/b/c");
//还有获取文件名称
System.out.println(f2.getName());
//判断是否是一个目录
System.out.println("是一个目录吗?"+f2.isDirectory());
//判断是否是一个文件
System.out.println("是一个文件吗?"+f2.isFile());
//获取文件的最后一次修改时间
//这里返回的是一个总毫秒数
long lastTime=f2.lastModified();
Date date=new Date(lastTime);
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss SSS");
String str=sdf.format(date);
System.out.println("最后修改时间"+str);
//获取文件大小,返回的是字节数
System.out.println(f2.length());
}
}
输出:
false
c
是一个目录吗?true
是一个文件吗?false
最后修改时间2022-07-24 10:02:47 139
0
可以利用循环遍历出某个目录下的所有子文件
public class FileTest03 {
public static void main(String[] args) {
//File[] listFiles()
// 获取当前目录下的所有子文件
File f1 = new File("D:/JAVATest");
File[] files = f1.listFiles();
for (File file : files) {
System.out.println(file);
}
}
}
输出:
D:\JAVATest\a
D:\JAVATest\bufferedReader
D:\JAVATest\bufferedtest
D:\JAVATest\copy02
D:\JAVATest\data
D:\JAVATest\file
D:\JAVATest\filewrite
D:\JAVATest\test
D:\JAVATest\testcopy
4.文件复制
需求:将D盘下的文件JAVATest复制到C盘下面
我们可以利用file类以及学到的输入输出流进行文件的复制操作
设计思路:
首先要有目标文件和源文件,然后实现一个复制的方法即可,
获取文件目录之后,判断是文件还是文件夹,要是文件夹的话创建相同名称的文件夹即可,要是文件,调用IO流一边读一边写,将读取到的源文件中的内容,创建对应的目标文件写入目标文件即可
import java.io.*;
public class FileCopyTest01 {
public static void main(String[] args) {
//拷贝源
File srcfile = new File("D:\\JAVATest");
//拷贝目标
File destfile = new File("C:\\");
//调用方法拷贝
copyDir(srcfile,destfile);
}
private static void copyDir(File srcfile, File destfile) {
//如果srcFile是一个文件的话,递归结束
if (srcfile.isFile()) {
FileInputStream inputStream=null;
FileOutputStream outputStream=null;
try {
inputStream = new FileInputStream(srcfile);
String path=(destfile.getAbsolutePath().endsWith("\\")? destfile.getAbsolutePath() : "\\"+destfile.getAbsolutePath())+srcfile.getAbsolutePath().substring(3);
outputStream = new FileOutputStream(path);
//一边读一边写
byte[] bytes=new byte[1024*1024];
int readCount=0;
while ((readCount=inputStream.read(bytes))!=-1){
outputStream.write(bytes,0,readCount);
}
outputStream.flush();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally {
//关闭流
if (inputStream != null) {
try {
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (outputStream != null) {
try {
outputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return;
}
//首先获取源目录下面的子目录
File[] files = srcfile.listFiles();
for (File file : files) {
if (file.isDirectory()){
//获取源文件和目标文件的绝对路径
String srcDir=file.getAbsolutePath();
//因为是要从D盘复制到C盘,所以要创建的新文件目录是元源文件的目录去掉D盘加上C盘即可,我们采用截取字符串就可以截取到源文件的目录,再进行字符串的拼接,即可得到需要的目录
String destDir=(destfile.getAbsolutePath().endsWith("\\")? destfile.getAbsolutePath() : "\\"+destfile.getAbsolutePath())+srcDir.substring(3);
System.out.println(destDir);
File newfile = new File(destDir);
if (!newfile.exists())
newfile.mkdirs();
}
copyDir(file,destfile);
}
输出:
当然文件复制的方法不止这一种,我们还可以利用缓冲流再对代码进行优化,实现一些功能,比如,我们可以利用Scanner输入路径,自由的选择去复制想要复制的文件,又或者使用缓冲流来读写数据!
本文来自博客园,作者:星余明,转载请注明原文链接:https://www.cnblogs.com/lingstar/p/16514840.html