文件操作和IO

文章目录

  • 前言
  • 一、文件系统操作
    • 1.文件路径
    • 2.普通文件的基本操作
  • 二、文件内容操作
    • 1.字节流(InputStream与OutputStream)
    • 2.字符流(Reader和Writer)
    • 3.使用Scanner和PrintWriter
  • 三、案例
    • 1.案例1
    • 2.案例2
    • 3.案例3


前言

操作系统负责管理软件资源,往往会把这些资源统一抽象成“文件”来进行管理。本文主要记录与文件操作相关的基本知识。


一、文件系统操作

1.文件路径

(1)绝对路径:文件的完整路径,例如test.txt的路径,如:
D:\Picture\bbb\test.txt
(2)相对路径
(3)基准路径
如果基准路径是D:/Picture,那么相对路径就是./bbb/test.txt

2.普通文件的基本操作

(1)创建文件(示例):

public class Demo1 {
    public static void main(String[] args) throws IOException {
        File file = new File("test.txt");
        System.out.println(file.isFile());//是否是一个普通文件
        System.out.println(file.isDirectory());//是否是一个目录
        System.out.println(file.isAbsolute());//是否是绝对路径
        //创建文件
        file.createNewFile();
        System.out.println();
        System.out.println(file.isFile());//是否是一个普通文件
        System.out.println(file.isDirectory());//是否是一个目录
        System.out.println(file.isAbsolute());//是否是绝对路径
    }
}

(2)删除文件(示例):

		File file = new File("test.txt");
        //删除文件
        file.delete();
        //进程退出时删除文件
        file.deleteOnExit();

(3)创建目录(示例):

public class Demo2 {
    public static void main(String[] args) {
        File file = new File("Test/AAA/BBB");
        System.out.println(file.isDirectory());
        //创建一个目录
        file.mkdir();
        //创建多级目录
        file.mkdirs();
        System.out.println(file.isDirectory());
    }
}

(5)重命名文件(示例):

 File file1 = new File("Test/AAA/BBB/src.txt");
        File file2 = new File("Test/AAA/BBB/des.txt");
        file1.createNewFile();
        System.out.println(file1.exists());//file1要存在
        System.out.println(file2.exists());//file2需要不存在
        System.out.println(file1.renameTo(file2));

二、文件内容操作

文件一般简单的划分为文本文件和二进制文件。通过流对文件进行读写,分别是字节流和字符流。

1.字节流(InputStream与OutputStream)

(1)FileInputStream(示例):

public static void main(String[] args) throws IOException {
        //InputStream是一个抽象类,不能实例化
        InputStream inputStream = new FileInputStream("test.txt");
        while (true) {
            int b = inputStream.read();
            if(b == -1) {
                break;
            }
            System.out.println(b);
        }
        //一定要记住关闭资源,否则会造成资源泄漏
        inputStream.close();
    }

(2)FileOutputStream(示例):

public static void main(String[] args) throws IOException {
        OutputStream outputStream = new FileOutputStream("test.txt");
        //新写入的会覆盖掉原有的数据
        outputStream.write(97);
        outputStream.write(98);
        outputStream.write(99);
        outputStream.close();
    }

(3)使用Scanner

(4)使用PrintWriter

2.字符流(Reader和Writer)

FileReader和FileWriter(示例):

public static void main(String[] args) throws IOException {
        Reader reader = new FileReader("./test.txt");
        while (true) {
            int b = reader.read();
            if(b == -1) {
                break;
            }
            char c = (char) b;
            System.out.println(c);
        }
        reader.close();

        Writer writer = new FileWriter("./test.txt");
        writer.write("hello world");
        writer.close();
    }

该处使用的url网络请求的数据。

3.使用Scanner和PrintWriter

使用Scanner(示例):

		//try结束后会自动调用对应对象的close
        try (InputStream inputStream = new FileInputStream("./test.txt")){
            Scanner scanner = new Scanner(inputStream);
            while (scanner.hasNext()) {
                System.out.println(scanner.next());
            }
        } catch (IOException e) {
            e.printStackTrace();
        }

使用PrintWriter(示例):

public static void main(String[] args) throws IOException {
        try(OutputStream outputStream = new FileOutputStream("./test.txt");
            PrintWriter writer = new PrintWriter(outputStream);){
            writer.println();
            writer.println("aaaa");
            writer.printf("a = %d\n",10);
        }
        /*OutputStream outputStream = new FileOutputStream("./test.txt");
        PrintWriter writer = new PrintWriter(outputStream);
        writer.println("第一行");
        writer.println("第二行");
        writer.close();*/
    }

三、案例

1.案例1

扫描指定目录,并找到名称中包含指定字符的所有普通文件(不包含目录),并且后续询问用户是否要删除该文件。
代码如下(示例):

public class Test1 {
    public static void main(String[] args) throws IOException {
        Scanner sc = new Scanner(System.in);
        //1.输入指定目录
        System.out.println("请输入目录:");
        String dic = sc.next();
        File rootDic = new File(dic);
        //2.输入包含的字符
        System.out.println("请输入包含的字符:");
        String str = sc.next();
        //3、查找包含的字符
        scanDir(rootDic,str);
    }

    private static void scanDir(File rootDic, String str) throws IOException {
        //列出该目录的所有文件夹
        File[] files = rootDic.listFiles();
        //不存在则直接返回
        if (files == null) {
            return;
        }
        //扫描文件夹
        for(File file : files) {
            //如果是文件夹则继续进行递归
            if(file.isDirectory()) {
                scanDir(file,str);
            }else {
                //核查是否需要删除
                check(file,str);
            }
        }
    }

    private static void check(File file, String str) throws IOException {
        if(file.getName().contains(str)) {
            System.out.println("找到了包含 "+str+"的文件 "+file.getCanonicalPath()+" 是否需要删除?(y/n)");
            Scanner scanner = new Scanner(System.in);
            String choice = scanner.next();
            if(choice.equals("Y")||choice.equals("y")) {
                file.delete();
            }
        }
    }
}

2.案例2

普通文件的复制。
代码如下(示例):

public class Test2 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        //1、输入源文件与目标文件
        System.out.println("请输入源文件:");
        File srcFile = new File(sc.next());

        System.out.println("请输入目标文件:");
        File desFile = new File(sc.next());
        //2、保证源文件是文件,目标文件的地址是有效的
        if(!srcFile.isFile()) {
            System.out.println("输入源文件有误");
            return;
        }
        if(!desFile.getParentFile().isDirectory()) {
            System.out.println("输入的目标文件有误");
            return;
        }
        //3、进行读写
        try(InputStream inputStream = new FileInputStream(srcFile);
            OutputStream outputStream = new FileOutputStream(desFile)) {
            while (true) {
                int ret = inputStream.read();
                if(ret == -1) {
                    break;
                }
                outputStream.write(ret);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

3.案例3

代码如下(示例):

public class Test3 {
    public static void main(String[] args) throws IOException {
        Scanner sc = new Scanner(System.in);
        //1.输入指定目录
        System.out.println("输入指定目录:");
        File dic = new File(sc.next());
        //2.输入需要搜索的字符
        System.out.println("输入关键词:");
        String toFind = sc.next();
        //3.扫描文件夹
        scanDic(dic,toFind);
    }

    private static void scanDic(File dic, String toFind) throws IOException {
        File[] files = dic.listFiles();
        if(files == null) {
            return;
        }
        for (File f : files) {
            if(f.isDirectory()) {
                //是文件夹继续递归
                scanDic(f,toFind);
            }else {
                //查看该文件是不是符合
                checkFile(f,toFind);
            }
        }
    }

    private static void checkFile(File f, String toFind) throws IOException {
        //1.检查文件是否包含toFind
        if(f.getName().contains(toFind)) {
            System.out.println(f.getCanonicalPath()+" 中包含 "+toFind);
        }
        //2.检查文件中的内容是否包含toFind
        try (InputStream inputStream = new FileInputStream(f);
             Scanner scanner = new Scanner(inputStream)) {
            StringBuilder string = new StringBuilder();
            while (scanner.hasNextLine()) {
                string.append(scanner.nextLine());
            }
            if (string.indexOf(toFind) > -1) {
                System.out.println(f.getCanonicalPath() + " 中包含:" + toFind);
            }
        }
    }
}


你可能感兴趣的:(文件操作,操作系统,文件操作,Java)