File
一、路径
相对路径
相对路径就是指由这个文件所在的路径引起的跟其它文件(或文件夹)的路径关系。
绝对路径
绝对路径是指目录下的绝对位置,直接到达目标位置,通常是从盘符开始的路径。
二、File类
什么是File类
File对象就表示一个路径,可以是文件的路径,也可以是文件夹的路径
这个路径可以是存在的,也允许是不存在的
三、静态成员变量
静态成员变量 | 描述 |
public static String pathSeparator | 系统中多个路径的分隔符 windows; |
public static String separator | 系统中一个路径中多个名称之间的分隔符号 windows\ |
四、构造方法
方法名 | 作用 |
public File(String pathname) | 根据文件路径创建文件对象 |
public File(String parent, String child) | 根据父路径名字符串和子路径名字符串创建文件对象 |
public File(File parent, String child) | 根据父路径对应文件对象和子路径字符串创建文件对象 |
| |
五、File中常见的成员方法
5.1 获取功能
方法 | 描述 |
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对象数组 |
代码演示:
@Test
public void test2(){
File file1 = new File("hello.txt");
File file2 = new File("d:\\io\\hi.txt");
System.out.println(file1.getAbsolutePath());
System.out.println(file1.getPath());
System.out.println(file1.getName());
System.out.println(file1.getParent());
System.out.println(file1.length());
System.out.println(new Date(file1.lastModified()));
System.out.println();
System.out.println(file2.getAbsolutePath());
System.out.println(file2.getPath());
System.out.println(file2.getName());
System.out.println(file2.getParent());
System.out.println(file2.length());
System.out.println(file2.lastModified());
}
@Test
public void test3(){
File file = new File("D:\\workspace_idea1\\JavaSenior");
String[] list = file.list();
for(String s : list){
System.out.println(s);
}
System.out.println();
File[] files = file.listFiles();
for(File f : files){
System.out.println(f);
}
}
获取文件大小的方法不能获取文件夹大小
5.2 重命名功能
方法 | 描述 |
public boolean renameTo(File dest) | 把文件重命名为指定的文件路径 |
代码演示:
@Test
public void test4(){
File file1 = new File("hello.txt");
File file2 = new File("D:\\io\\hi.txt");
boolean renameTo = file2.renameTo(file1);
System.out.println(renameTo);
}
5.3 判断功能
方法 | 描述 |
public boolean isDirectory() | 判断是否是文件目录 |
public boolean isFile() | 判断是否是文件 |
public boolean exists() | 判断是否存在 |
public boolean canRead() | 判断是否可读 |
public boolean canWrite() | 判断是否可写 |
public boolean isHidden() | 判断是否隐藏 |
代码演示:
@Test
public void test5(){
File file1 = new File("hello.txt");
file1 = new File("hello1.txt");
System.out.println(file1.isDirectory());
System.out.println(file1.isFile());
System.out.println(file1.exists());
System.out.println(file1.canRead());
System.out.println(file1.canWrite());
System.out.println(file1.isHidden());
System.out.println();
File file2 = new File("d:\\io");
file2 = new File("d:\\io1");
System.out.println(file2.isDirectory());
System.out.println(file2.isFile());
System.out.println(file2.exists());
System.out.println(file2.canRead());
System.out.println(file2.canWrite());
System.out.println(file2.isHidden());
}
5.4 创建功能
方法 | 描述 |
public boolean createNewFile() | 创建文件。若文件存在,则不创建,返回false |
public boolean mkdir() | 创建文件目录。如果此文件目录存在,就不创建了。如果此文件目录的上层目录不存在,也不创建。 |
public boolean mkdirs() | 创建文件目录。如果上层文件目录不存在,一并创建 |
注意事项: 如果你创建文件或者文件目录没有写盘符路径,那么,默认在项目路径下。
代码演示:
@Test
public void test6() throws IOException {
File file1 = new File("hi.txt");
if(!file1.exists()){
//文件的创建
file1.createNewFile();
System.out.println("创建成功");
}else{//文件存在
file1.delete();
System.out.println("删除成功");
}
}
@Test
public void test7(){
//文件目录的创建
File file1 = new File("d:\\io\\io1\\io3");
boolean mkdir = file1.mkdir();
if(mkdir){
System.out.println("创建成功1");
}
File file2 = new File("d:\\io\\io1\\io4");
boolean mkdir1 = file2.mkdirs();
if(mkdir1){
System.out.println("创建成功2");
}
//要想删除成功,io4文件目录下不能有子目录或文件
File file3 = new File("D:\\io\\io1\\io4");
file3 = new File("D:\\io\\io1");
System.out.println(file3.delete());
}
}
5.5 删除功能
方法 | 描述 |
public boolean delete() | 删除文件或者文件夹 |
注意事项: Java中的删除不走回收站。 要删除一个文件目录,请注意该文件目录内不能包含文件或者文件目录。
三、练习
显示文件及文件夹内容

public static void showDir(File srcDir,int count) {
System.out.println("|-" + srcDir.getName());
File[] files = srcDir.listFiles();
count++;
for (File file : files) {
System.out.print(printTab(count));
if (file.isFile()) {
System.out.println("|-" + file.getName());
} else {
showDir(file,count);
}
}
}
统计文件夹大小

public static long calculateDirSize(File srcDir) {
long size = 0;
File[] files = srcDir.listFiles();
for (File file : files) {
if (file.isDirectory()) {
size += calculateDirSize(file);
} else {
size += file.length();
}
}
return size;
}
复制文件夹

//使用 commons-io-2.11.0包的工具类,工具类忒好了
public static void copyDirUtil(File srcDir, File desDir) throws IOException {
FileUtils.copyDirectory(srcDir, desDir); //底层也用的递归
}
//自己递归实现
public static void copyDir(File srcDir, File desDir) throws IOException {
if (!desDir.exists()) {
desDir.mkdir();
}
File newDir = new File(desDir, srcDir.getName());
newDir.mkdir();
File[] files = srcDir.listFiles();
if (files == null || files.length == 0) {
return;
}
for (File file : files) {
if (file.isDirectory()) {
copyDir(file, newDir);
} else {
FileInputStream fis = new FileInputStream(file);
FileOutputStream fos = new FileOutputStream(new File(newDir, file.getName()));
byte[] buffer = new byte[1024];
int len = 0;
while ((len = fis.read(buffer)) != -1) {
fos.write(buffer, 0, len);
}
fis.close();
fos.close();
}
}
}
剪切文件夹

//使用 commons-io-2.11.0包的工具类,工具类忒好了
public static void cutDirUtil(File srcDir, File desDir) throws IOException {
FileUtils.moveDirectory(srcDir,desDir);
/*源码
先复制,再删除
*/
}
//自己实现,在复制后紧接着删除源文件
public static void cutDir(File srcDir, File desDir) throws IOException {
if (!desDir.exists()) {
desDir.mkdir();//删除源文件夹
}
File newDir = new File(desDir, srcDir.getName());
newDir.mkdir();
File[] files = srcDir.listFiles();
if (files == null || files.length == 0) {
srcDir.delete();
return;
}
for (File file : files) {
if (file.isDirectory()) {
cutDir(file, newDir);
} else {
FileInputStream fis = new FileInputStream(file);
FileOutputStream fos = new FileOutputStream(new File(newDir, file.getName()));
byte[] buffer = new byte[1024];
int len = 0;
while ((len = fis.read(buffer)) != -1) {
fos.write(buffer, 0, len);
}
fis.close();
fos.close();
//读写完后,删除源文件
file.delete();
}
}
srcDir.delete();
}
删除文件夹

public static boolean deleteDir(File srcDir) {
File[] files = srcDir.listFiles();
if (files == null || files.length == 0) {
return srcDir.delete();
}
for (File file : files) {
if (file.isDirectory()) {
deleteDir(file);
} else {
file.delete();
}
}
return srcDir.delete();
}
复制指定类型文件

//将符合条件的 文件路径-文件名 存到map集合中
public static Map<File, String> serchTypeFile(File srcDir, String desFileSuffix) {
Map<File, String> map = new HashMap<>();
File[] files = srcDir.listFiles();
if (files == null) {
return map;
}
for (File file : files) {
if (file.isDirectory()) {
map.putAll(serchTypeFile(file, desFileSuffix));
} else {
if (file.getName().toLowerCase().endsWith(desFileSuffix)) {
map.put(file.getAbsoluteFile(), file.getName());
}
}
}
return map;
}
public static void copyTypeDir(File srcDir, File desDir, String desFileSuffix) throws IOException {
Map<File, String> map = serchTypeFile(srcDir, desFileSuffix);
Set<Map.Entry<File, String>> entries = map.entrySet();
for (Map.Entry<File, String> entry : entries) {
File key = entry.getKey();
String value = entry.getValue();
System.out.println(key + "---" + value);
/*挑选代码
...
*/
//给文件加上时间戳,防止文件重名.
//这里有点问题,时间戳到毫秒值,如果电脑够快,可能两个同名文件加的时间戳一样,会造成文件的覆盖,唉~~
//用(1)(2)的话,可以解决,但每次都要遍历新文件夹,好麻烦啊。
String[] names = key.getName().split("\\."); //正则表达式的关系
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd-HH-mm-ss-SSS");
String format = sdf.format(new Date());
String s = names[0] + "(" + format + ")." + names[1];
File file = new File(desDir, s);
FileUtils.copyFile(key,file);
}
}