- File类
- 相对路径与绝对路径
- 非空目录的删除
- 带目录的文件的创建
- 文件或目录的拷贝
- 编写一个简易的cmd
file是什么? —> 文件和目录路径名的抽象表示形式。
- 包路径:java.io.File
- 继承关系:File —> Object
- 构造方法
4.方法
常用方法
方法 | 功能 |
---|---|
String getPath() String getAbsolutePath() String getCanonicalPath() | 将此抽象路径名转换为一个路径名字符串(获取构建路径) 返回此抽象路径名的绝对路径名字符串(获取 当前路径1 + 构建路径) 返回此抽象路径名的规范路径名字符串。(如果构建目录包括".“或”.."时,会进行规范处理) |
boolean isFile() boolean isDirtory() | 当且仅当此抽象路径名表示的文件存在且 是一个标准文件时,返回 true;否则返回 false 当且仅当此抽象路径名表示的文件存在且 是一个目录时,返回 true;否则返回 false 在不知道file是否存在时,不要使用这两个方法来判断file是否是文件/目录 ,因为当一个文件不存在时这个文件既不是文件也不是目录; 在file不存在时,想要判断file路径是文件还是目录,建议自己写一个方法来判断。 |
boolean delete() | 可以删除文件以及空目录,不能删除带有内容的目录(带有目录或带有文件的目录) |
boolean createNewFile() | 如果文件存在,则不会不会创建也不会覆盖;如果文件不存在则创建文件 |
boolean mkdir() boolean mkdirs() | 如果目录存在,则不会创建也不会覆盖,如果目录不存在则创建目录 如果file是一个多级目录使用mkdir()会创建失败,返回false |
非空目录的删除 带目录的文件的创建 文件或目录的拷贝在java中,盘符后面的“”不能省略,???
package com.jsoft.io; import org.junit.Test; import java.io.*; public class Demo01 { public static boolean copyFile(File copyFile,File destDir) throws IOException { // 如果路径不存在 if(!copyFile.exists() || !destDir.exists()) { System.out.println("找不到的路径,请检查被拷贝文件或目录与拷贝目录是否存在"); return false; } // 如果destDir不是一个目录 if(!destDir.isDirectory()) { System.out.println("拷贝位置不是一个目录,无法拷贝"); return false; } // 如果是文件拷贝并终止 if(copyFile.isFile()) { try(FileInputStream in = new FileInputStream(copyFile); FileOutputStream out = new FileOutputStream(new File(destDir + File.separator + copyFile.getName()));) { // 一次读完(不建议使用) int readCount; byte[] bytes = new byte[in.available()]; readCount = in.read(bytes); out.write(bytes); } return true; } // 如果是目录,拷贝目录 if(copyFile.isDirectory()) { // 创建目录 File tempFile = new File(destDir.getCanonicalPath() + File.separator + copyFile.getName()); tempFile.mkdir(); // 获取当前目录下的所有file File[] files = copyFile.listFiles(); for (File file : files) { File newDestDir = new File(tempFile.getCanonicalPath()); // 递归拷贝 copyFile(file,newDestDir); } } return true; } @Test public void testFile() throws IOException { File srcFile = new File("D:\桌面\a"); // 如果路径是在盘符的根下,必须在盘符后面加“” File destFile = new File("E:\"); System.out.println(copyFile(srcFile, destFile) ? "拷贝成功!" : "拷贝失败!"); } }编写一个简易的cmd
package com.jsoft.io.file; import org.junit.Test; import java.io.File; import java.io.IOException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Scanner; public class CMD { private static String currentDir; // 当前目录路径 private static Scanner sc; static { currentDir = System.getProperty("user.dir"); sc = new Scanner(System.in); } // 切换路径 private static boolean cd(String userIn) throws IOException { String[] split = userIn.split(" "); if(split.length != 2) { System.out.println("格式错误"); return false; } // 获取目录名 String dirName = split[1]; // 当前路径(currentDir)+相对路径 File file = new File(currentDir + "\" + dirName); // 如果是绝对路径 if(dirName.contains(":")) { file = new File(dirName); } // 切换当前目录 if(".".equals(dirName)) { return true; } // 切换到上级目录 if("..".equals(dirName)) { File fatherFile = new File(currentDir).getParentFile(); if(fatherFile == null) { return false; } currentDir = fatherFile.getCanonicalPath(); return true; } // 如果不是目录 if(isFile(file)) { System.out.println("目录名称无效"); return false; } // 如果文件不存在 if(!file.exists()) { System.out.println("系统找不到指定的路径。"); return false; } // 文件存在 currentDir = file.getCanonicalPath(); return true; } // 创建文件或目录 private static boolean md(String userIn) throws IOException { String[] split = userIn.split(" "); String cdContent = split[1]; File file = new File(currentDir + "\" + cdContent); // 如果是绝对路径 if(cdContent.contains(":")) { file = new File(cdContent); } // 如果是文件(目前不能处理带目录的文件) if(isFile(file)) { file.createNewFile(); } else { file.mkdirs(); } return true; } // 打印当前路径中的所有文件目录信息 private static void dir() { File[] files = new File(currentDir).listFiles(); SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm"); long byteNum = 0; if(files.length == 0) { System.out.println("当前目录为空"); return; } // 此处并未统计文件夹所占字节大小 for(File file : files) { byteNum += file.length(); StringBuilder sb = new StringBuilder(); sb.append(sdf.format(new Date(file.lastModified()))); sb.append("t"); sb.append(file.isDirectory() ? "" : "t"); sb.append("t"); sb.append(file.length()); sb.append("t"); sb.append(file.getName()); System.out.println(sb); } System.out.println(files.length + " 个文件"); System.out.println(byteNum + " 字节"); } private static boolean rd(String userIn) throws IOException { String[] split = userIn.split(" "); String rdContent = split[1]; File file = new File(currentDir + "\" + rdContent); // 如果是绝对路径 if(rdContent.contains(":")) { file = new File(rdContent); } // 如果是文件 if (isFile(file)) { file.delete(); return true; } else { // 暂不支持对多级文件夹以及非空文件夹的删除 file.delete(); return true; } } // 获取用户键入 private static String commindLine() { System.out.print(currentDir + ">"); return sc.nextLine(); } // 显示帮助信息 private static void help() { // cd StringBuilder sb = new StringBuilder(); sb.append("cd命令"); sb.append("n"); sb.append("语法格式:cd 文件路径"); sb.append("t"); sb.append("改变当前目录(支持相对路径和绝对路径)"); System.out.println(sb); System.out.println("---------------------------------------"); // dir sb = new StringBuilder(); sb.append("dir命令"); sb.append("t"); sb.append("未实现功能:查询目录中所占字节大小,统计文件和目录的个数,对./..显示"); sb.append("n"); sb.append("语法格式:dir"); sb.append("t"); sb.append("列出当前目录的所有文件"); System.out.println(sb); System.out.println("---------------------------------------"); // md sb = new StringBuilder(); sb.append("md命令"); sb.append("t"); sb.append("未实现功能:创建带目录的文件"); sb.append("n"); sb.append("语法格式:md 文件路径"); sb.append("t"); sb.append("创建文件(支持相对路径和绝对路径)"); System.out.println(sb); System.out.println("---------------------------------------"); // rd sb = new StringBuilder(); sb.append("rd命令"); sb.append("t"); sb.append("未实现功能:对非空目录的删除"); sb.append("n"); sb.append("语法格式:rd 文件路径"); sb.append("t"); sb.append("删除文件(支持相对路径和绝对路径)"); System.out.println(sb); System.out.println("---------------------------------------"); sb = new StringBuilder(); sb.append("exit"); sb.append("t"); sb.append("退出cmd"); System.out.println(sb); System.out.println("---------------------------------------"); } // 判断File是否是文件,当路径中包含“.”时,我们认为这个file是一个文件(并不严谨) private static boolean isFile(File file) throws IOException { // 当路径中存在.时,我们认为这个File是一个文件 if(file.getCanonicalPath().contains(".")) { return true; } return false; } public static void main(String[] args) throws IOException { System.out.println("Microsoft Windows [版本 10.0.18363.1556]n" + "(c) 2019 Microsoft Corporation。保留所有权利。n"); System.out.println("输入help查看帮助信息nn"); while(true) { // 获取用户键入 String userIn = commindLine(); if(userIn.startsWith("cd")) { cd(userIn); } else if("dir".equals(userIn)) { dir(); } else if(userIn.startsWith("md")) { md(userIn); } else if(userIn.startsWith("rd")) { rd(userIn); }else if("help".equals(userIn)) { help(); }else if("exit".equals(userIn)) { break; } else { System.out.println(userIn + "不是内部或外部命令,也不是可运行的程序或批处理文件。"); } } } }
在java中,当前路径默认是project(项目)的根 ↩︎