文件操作/IO

文件路径

绝对路径

以盘符开头: D:\火狐浏览器\图片\wallhaven-g7dod3.jpg
在这里插入图片描述

相对路径

以 . 或者 … 开头的 其中 . 表示当前路径 / … 表示当前路径的父目录(上级路径)谈到相对路径,必须现有一个基准目录,相对路径就是从基准目录出发,按照一个啥样的路径找到对应文件

例如:D:\火狐浏览器\图片为基准目录
找到wallhaven-g7dod3.jpg
就是./wallhaven-g7dod3.jpg 这就是表示当前目录(基准目录)

还是以D:\火狐浏览器\图片为基准目录
找到uTools-2.5.2.exe 就是 …/uTools-2.5.2.exe(两个点)

在这里插入图片描述这个就表示基准目录的上一级路径D:\火狐浏览器,从这个路径找到uTools-2.5.2.exe这个文件

即便是定位到同一个文件,如果基准目录不同,此时相对路径也不同

java中操作文件

import java.io.File;
import java.io.IOException;

// File 的构造
public class Demo1 {
    
    
    public static void main(String[] args) throws IOException {
    
    
        File f = new File("d:\\text.txt");
        System.out.println(f.getParent()); // 获取到文件的父目录
        System.out.println(f.getName());    // 获取到文件名
        System.out.println(f.getPath());    // 获取到文件路径(构造 File 的时候指定的路径)
        System.out.println(f.getAbsolutePath()); // 获取到绝对路径
        System.out.println(f.getCanonicalPath()); // 获取到绝对路径

        System.out.println("=================");

        File f2 = new File("./test.txt");
        System.out.println(f2.getParent()); // 获取到文件的父目录
        System.out.println(f2.getName());    // 获取到文件名
        System.out.println(f2.getPath());    // 获取到文件路径(构造 File 的时候指定的路径)
        System.out.println(f2.getAbsolutePath()); // 获取到绝对路径
        System.out.println(f2.getCanonicalPath()); // 获取到绝对路径
    }
}

在这里插入图片描述

普通文件的创建和删除

import java.io.File;
import java.io.IOException;

public class Test {
    
    
    public static void main(String[] args) throws IOException {
    
    
        File file = new File("./test.txt");
        System.out.println("创建前:");
        System.out.println("文件是否真实存在: "+file.exists());
        System.out.println("文件是否是一个目录: "+file.isDirectory());
        System.out.println("文件是否是一个普通文件: "+file.isFile());
        System.out.println("创建后:");
        System.out.println("文件创建是否成功: "+file.createNewFile());
        System.out.println("文件是否真实存在: "+file.exists());
        System.out.println("文件是否是一个目录: "+file.isDirectory());
        System.out.println("文件是否是一个普通文件: "+file.isFile());
        System.out.println("再次创建:");
        System.out.println("文件创建是否成功: "+file.createNewFile());
    }
}

在这里插入图片描述

deleteOnExit 的使用

import java.io.File;
import java.io.IOException;

public class Test1 {
    
    
    public static void main(String[] args) throws IOException, InterruptedException {
    
    
        File file = new File("./test.txt");
        System.out.println(file.exists());
        System.out.println(file.createNewFile());
        System.out.println(file.exists());

        Thread.sleep(3000);
        file.deleteOnExit();
        System.out.println(file.exists());
    }
}

在这里插入图片描述

单级目录的创建

import java.io.File;

public class FileDemo4 {
    
    
    public static void main(String[] args) {
    
    
        File file = new File("test");
        System.out.println(file.isDirectory());
        System.out.println(file.isFile());
        System.out.println(file.mkdir());
        System.out.println(file.isDirectory());
        System.out.println(file.isFile());
    }
}

在这里插入图片描述

多级目录的创建

import java.io.File;

public class Test2 {
    
    
    public static void main(String[] args) {
    
    
        File file = new File("aaa/bbb/ccc");
        System.out.println(file.isDirectory());
        System.out.println(file.isFile());
        System.out.println(file.mkdirs());
        System.out.println(file.isDirectory());
        System.out.println(file.isFile());
    }
}

在这里插入图片描述

文件的重命名

import java.io.File;
import java.io.IOException;

public class Test2 {
    
    
    public static void main(String[] args) throws IOException {
    
    
        File file1 = new File("./test.txt");
        File file2 = new File("./test2.txt");
        System.out.println(file1.exists());
        System.out.println(file1.createNewFile());
        System.out.println(file1.exists());
        System.out.println(file1.renameTo(file2));
    }
}

在这里插入图片描述

文件的移动

import java.io.File;

public class Test2 {
    
    
    public static void main(String[] args) {
    
    
        File file1 = new File("./test2.txt");
        File file2 = new File("./aaa/test2.txt");
        file1.renameTo(file2);
    }
}

打印当前目录下所有的文件名

import java.io.File;
import java.util.Arrays;

public class Test2 {
    
    
    public static void main(String[] args) {
    
    
        File file = new File(".");

        String[] files = file.list();
        System.out.println(Arrays.toString(files));
    }
}

在这里插入图片描述

文件内容的读写 – 数据流

FileInputStream

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;

public class Demo8 {
    
    
    public static void main(String[] args) {
    
    
        // 构造方法中需要指定打开文件的路径.
        // 此处的路径可以是绝对路径, 也可以是相对路径, 还可以是 File 对象
//        InputStream inputStream = null;
//        try {
    
    
//            // 1. 创建对象, 同时也是在打开文件.
//            inputStream = new FileInputStream("d:/test.txt");
//            // 2. 尝试一个一个字节的读, 把整个文件都读完.
//            while (true) {
    
    
//                int b = inputStream.read();
//                if (b == -1) {
    
    
//                    // 读到了文件末尾
//                    break;
//                }
//                System.out.println(b);
//            }
//        } catch (IOException e) {
    
    
//            e.printStackTrace();
//        } finally {
    
    
//            // 3. 读完之后要记得关闭文件, 释放资源~
//            try {
    
    
//                inputStream.close();
//            } catch (IOException e) {
    
    
//                e.printStackTrace();
//            }
//        }

//        try (InputStream inputStream = new FileInputStream("d:/test.txt")) {
    
    
//            while (true) {
    
    
//                int b = inputStream.read();
//                if (b == -1) {
    
    
//                    break;
//                }
//                System.out.println(b);
//            }
//        } catch (IOException e) {
    
    
//            e.printStackTrace();
//        }

        try (InputStream inputStream = new FileInputStream("d:/hello.txt")) {
    
    
            // 一次读取若干个字节.
            while (true) {
    
    
                byte[] buffer = new byte[1024];
                int len = inputStream.read(buffer);
                if (len == -1) {
    
    
                    // 如果返回 -1 说明读取完毕了
                    break;
                }
                for (int i = 0; i < len; i++) {
    
    
                    System.out.println(buffer[i]);
                }
            }
        } catch (IOException e) {
    
    
            e.printStackTrace();
        }
    }
}

在这里插入图片描述

FileOutputStream

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;

// 使用字节流, 写文件的案例.
public class Demo9 {
    
    
    public static void main(String[] args) {
    
    
        try (OutputStream outputStream = new FileOutputStream("d:/text.txt")) {
    
    
//            outputStream.write(97);
//            outputStream.write(98);
//            outputStream.write(99);

            byte[] buffer = new byte[]{
    
    97, 98, 99};
            outputStream.write(buffer);
        } catch (IOException e) {
    
    
            e.printStackTrace();
        }
    }
}

在这里插入图片描述

FileReader

import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;

// 按照字符来读写
public class Demo10 {
    
    
    public static void main(String[] args) {
    
    
        try (Reader reader = new FileReader("d:/test.txt")) {
    
    
            // 按照字符来读.
            while (true) {
    
    
                char[] buffer = new char[1024];
                int len = reader.read(buffer);
                if (len == -1) {
    
    
                    break;
                }
//                for (int i = 0; i < len; i++) {
    
    
//                    System.out.println(buffer[i]);
//                }
                // 如果这里传入的 数组 是 byte 数组, 还可以手动的指定一下 utf8 字符集避免乱码.
                String s = new String(buffer, 0, len);
                System.out.println(s);
            }
        } catch (IOException e) {
    
    
            e.printStackTrace();
        }
    }
}

在这里插入图片描述

FileWriter

import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;

// 按照字符来写
public class Demo11 {
    
    
    public static void main(String[] args) {
    
    
        try (Writer writer = new FileWriter("d:/text.txt")) {
    
    
            writer.write("xyz");
        } catch (IOException e) {
    
    
            e.printStackTrace();
        }


    }
}

在这里插入图片描述

案例一

== 扫描一个指定的目录,并找到名称中包含指定字符的所有普通文件,并且根据用户的选择来判断是否要删除文件.==

import java.io.File;
import java.io.IOException;
import java.util.Scanner;

// 案例1, 实现查找文件并删除
public class Demo12 {
    
    
    public static void main(String[] args) {
    
    
        // 1. 先输入要扫描的目录, 以及要删除的文件名
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入要扫描的路径: ");
        String rootDirPath = scanner.next();
        System.out.println("请输入要删除的文件名: ");
        String toDeleteName = scanner.next();
        File rootDir = new File(rootDirPath);
        if (!rootDir.isDirectory()) {
    
    
            System.out.println("输入的扫描路径有误!");
            return;
        }
        // 2. 遍历目录, 把 指定目录 中的所有文件和子目录都遍历一遍, 从而找到要删除的文件
        //    通过这个方法来实现递归遍历并删除的操作
        scanDir(rootDir, toDeleteName);
    }

    private static void scanDir(File rootDir, String toDeleteName) {
    
    
        // 1. 先列出 rootDir 中都有哪些内容
        File[] files = rootDir.listFiles();
        if (files == null) {
    
    
            // rootDir 是一个空目录
            return;
        }
        // 2. 遍历当前列出的这些内容. 如果是普通文件, 就检测文件名是否是要删除的文件.
        //    如果是目录, 就递归的进行遍历
        for (File f : files) {
    
    
            if (f.isFile()) {
    
    
                // 普通文件的情况
                if (f.getName().contains(toDeleteName)) {
    
    
                    // 不要求名字完全一样, 只要文件名中包含了关键字即可删除
                    // 就进行删除操作
                    deleteFile(f);
                }
            } else if (f.isDirectory()) {
    
    
                // 目录就递归的进行遍历
                scanDir(f, toDeleteName);
            }
        }
    }

    private static void deleteFile(File f) {
    
    
        try {
    
    
            System.out.println(f.getCanonicalPath() + " 确认要删除吗? (Y/n)");
            Scanner scanner = new Scanner(System.in);
            String choice = scanner.next();
            if (choice.equals("Y") || choice.equals("y")) {
    
    
                f.delete();
                System.out.println("文件删除成功!");
            } else {
    
    
                System.out.println("文件取消删除!");
            }
        } catch (IOException e) {
    
    
            e.printStackTrace();
        }
    }
}

在这里插入图片描述

案例二

进行普通文件的复制

import java.io.*;
import java.util.Scanner;

public class Demo13 {
    
    public static void main(String[] args) {
    
    
        // 1. 输入两个路径
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入要拷贝的源路径: ");
        String src = scanner.next();
        System.out.println("请输入要拷贝的目标路径: ");
        String dest = scanner.next();
        File srcFile = new File(src);
        if (!srcFile.isFile()) {
    
    
            System.out.println("输入的源路径不正确!");
            return;
        }
        // 此处不太需要检查目标文件是否存在. OutputStream 写文件的时候能够自动创建不存在的文件.// 2. 读取源文件, 拷贝到目标文件中try (InputStream inputStream = new FileInputStream(src)) {
    
    
            try (OutputStream outputStream = new FileOutputStream(dest)) {
    
    
                // 把 inputStream 中的数据读出来, 写入到 outputStream 中byte[] buffer = new byte[1024];
                while (true) {
    
    
                    int len = inputStream.read(buffer);
                    if (len == -1) {
    
    
                        // 读取完毕break;
                    }
                    // 写入的时候, 不能把整个 buffer 都写进去. 毕竟 buffer 可能是只有一部分才是有效数据.
                    outputStream.write(buffer, 0, len);
                }
            }
        } catch (IOException e) {
    
    
            e.printStackTrace();
        }
    }
}

在这里插入图片描述在这里插入图片描述

案例三

扫描指定目录,并找到名称或者内容中包含指定字符的所有普通文件(不包含目录)

import java.io.*;
import java.util.Scanner;

public class Demo14 {
    
    public static void main(String[] args) throws IOException {
    
    
        // 1. 输入要扫描的文件路径
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入要扫描的路径: ");
        String rootDirPath = scanner.next();
        System.out.println("请输入要查询的关键词: ");
        String word = scanner.next();
        File rootDir = new File(rootDirPath);
        if (!rootDir.isDirectory()) {
    
    
            System.out.println("输入的路径非法!");
            return;
        }
        // 2. 递归的进行遍历
        scanDir(rootDir, word);
    }

    private static void scanDir(File rootDir, String word) throws IOException {
    
    
        // 1. 先列出 rootDir 中都有哪些内容File[] files = rootDir.listFiles();
        if (files == null) {
    
    
            return;
        }
        // 2. 遍历每个元素, 针对普通文件和目录分别进行处理.for (File f : files) {
    
    
            if (f.isFile()) {
    
    
                // 针对文件进行内容查找if (containsWord(f, word)) {
    
    
                    System.out.println(f.getCanonicalPath());
                }
            } else if (f.isDirectory()) {
    
    
                // 针对目录进行递归
                scanDir(f, word);
            }
        }
    }

    private static boolean containsWord(File f, String word) {
    
    
        // 写代码, 慎重使用缩写!!! 缩写的可读性会比较差. (一些业界常见缩写, 可以用, 不要随便滥用)
        StringBuilder stringBuilder = new StringBuilder();
        // 把 f 中的内容都读出来, 放到一个 StringBuilder 中try (Reader reader = new FileReader(f)) {
    
    
            char[] buffer = new char[1024];
            while (true) {
    
    
                int len = reader.read(buffer);
                if (len == -1) {
    
    
                    break;
                }
                // 把这一段读到的结果, 放到 StringBuilder 中
                stringBuilder.append(buffer, 0, len);
            }
        } catch (IOException e) {
    
    
            e.printStackTrace();
        }
        // indexOf 返回的是子串的下标. 如果 word 在 stringBuilder 中不存在, 则返回下标为 -1return stringBuilder.indexOf(word) != -1;
    }
}

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/chenbaifan/article/details/124049551
今日推荐