首先抽象类和接口都是 Java 中多态的常见使用方式。
区别可以理解为接口比抽象类更加的抽象,但是抽象类的功能是比接口更多的。
抽象类和普通类,其实差别不是特别大,只不过抽象类不能new示例,和不能直接使用抽象方法,而且抽象类是可以有普通方法,也可以有普通的属性。
比如在文件IO操作的时候,InputStream/OutputStream/Reader/Writer都是抽象类,是不能直接new的,需要new它的子类。
附:文章底部附有递归遍历删除文件和拷贝文件的代码(文件操作IO)
对于抽象类来说,大部分的东西都是确定的,有几个属性有几个方法大部分都是明确的,只有一小部分是抽象方法。而对于接口来说,大部分都是不确定的,有什么属性是不知道的,方法也是抽象方法(不考虑default的情况),所以可以认为接口是比抽象类更加的抽象。
抽象类中可以包含普通方法和普通字段, 这样的普通方法和字段可以被子类直接使用(不必重写), 而 接口中不能包含普通方法, 子类必须重写所有的抽象方法。
递归遍历删除文件
public class IOdemo1 { private static Scanner scanner = new Scanner(System.in); public static void main(String[] args) { // 输入一个指定搜索的目录 System.out.println("请输入要搜索的路径: "); String basePath = scanner.next(); // 针对输入进行简单判定 File root = new File(basePath); if (!root.isDirectory()) { // 路径不存在, 或者只是一个普通文件, 此时无法进行搜索. System.out.println("输入的目录有误!"); return; } // 再输入一个要删除的文件名 System.out.println("请输入要删除的文件名: "); String nameToDelete = scanner.next(); // 针对指定的路径进行扫描,递归操作 // 先从根目录出发(root) // 先判定一下, 当前的这个目录里, 看看是否包含咱们要删除的文件。如果是, 就删除; 否则就跳过下一个 // 如果当前这里包含了一些目录, 再针对子目录进行递归 scanDir(root, nameToDelete); } private static void scanDir(File root, String nameToDelete) { //打印递归的路径 System.out.println("[scanDir] " + root.getAbsolutePath()); // 1. 先列出 root 下的文件和目录 File[] files = root.listFiles(); if (files == null) { // 当前 root 目录下没东西. 是一个空目录 // 结束继续递归 return; } // 2. 遍历当前的列出结果 for (File f : files) { if (f.isDirectory()) { // 如果是目录, 就进一步递归 scanDir(f, nameToDelete); } else { // 如果是普通文件, 则判定是否要删除 if (f.getName().contains(nameToDelete)) { System.out.println("确认是否要删除 " + f.getAbsolutePath() + " 嘛?"); String choice = scanner.next(); if (choice.equals("y") || choice.equals("Y")) { f.delete(); System.out.println("删除成功!"); } else { System.out.println("删除取消!"); } } } } } }
拷贝文件:
如果文件不存在,OutputStream会自动创建,但是InputStream会直接报错。
public class IODemo2 { public static void main(String[] args) { // 输入两个路径 Scanner scanner = new Scanner(System.in); System.out.println("请输入要拷贝哪个文件: "); String srcPath = scanner.next(); System.out.println("请输入要被到到哪个地方: "); String destPath = scanner.next(); File srcFile = new File(srcPath); if (!srcFile.isFile()) { // 如果源不是一个文件(是个目录或者不存在),此时就不做任何操作 System.out.println("您当前输入的源路径有误!"); return; } File destFile = new File(destPath); if (destFile.isFile()) { // 如果已经存在, 认为也不能拷贝 System.out.println("您当前输入的目标路径有误!"); return; } // 进行拷贝操作. try (InputStream inputStream = new FileInputStream(srcFile); OutputStream outputStream = new FileOutputStream(destFile)) { // 进行读文件操作. while (true) { int b = inputStream.read(); if (b == -1) { break; } outputStream.write(b); } } catch (IOException e) { e.printStackTrace(); } } }