JavaEE 初阶 -- 文件操作 IO

文件路径

绝对路径

从盘符开始,一层一层往下找,这个过程得到的路径,就是绝对路径

相对路径

从给定的某个目录出发,一层一层往下找,这个过程得到的路径,就是相对路径

路径的表示

一定要明确,基准目录(工作目录)是啥

在这里插入图片描述
在实际生活中我们也有很多这样的例子:
比如你要去一个地方见一个朋友,但是你不知道怎么走,所以他给你一个路径,告诉你在某某标志建筑物开始,先直走,后左转,再直走,右转就到了,这种就是绝对路径,还有一种就是你告诉他你现在在哪个位置,这个位置其实离得比较近了,然后他告诉你怎么走,这种就是相对路径。

文件的分类

文本文件

文本文件,存储的是文本,文本文件的内容都是由ascii字符构成的,对于ascii字符来说,表示范围0~127,后来,又搞了一些其它的编码方式,utf8之类的,就可以针对其它语言文字符号进行编码了,utf8,就可以想象成,一个更大的表,但是始终是有限的。文本文件里存储的数据,就是遵守ascii或者其它字符集编码,所得到的文件,本质上存的是字符(不仅仅是所说的char)

二进制文件

二进制文件存储的是二进制数据,就是没有任何字符集的限制(存啥都行)

文件系统操作

Java标准库,给我们提供了File这个类
在这里插入图片描述

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

  • 构造File对象

构造的过程中,可以使用绝对路径/相对路径进行初始化,这个路径所指向的文件,可以是真实存在的,也可以不存在。

  • File提供了一些方法
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

文件内容操作

重要!文件操作一定一定要记得关闭文件!

针对字节流进行操作

InputStream

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

OutputStream

在这里插入图片描述
每次进行写操作,都会将文件里的内容给清空,然后再进行写。
如果你不想它清空再写的话,就在后面加个true:
在这里插入图片描述
这样它就会接着写下去了。

针对字符流进行操作

Reader

在这里插入图片描述
read方法里面可以传一个数组,就能一次读取多个字符了,读的字符放在数组里。

Writer

在这里插入图片描述
如果你想直接读一行,利用Scanner里面套上一个InputStream。

案例

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

public class IODemo9 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        // 1. 先让用户指定一个要搜索的根目录
        System.out.println("请输入要扫描的根目录: ");
        File rootDir = new File(scanner.next());
        if (!rootDir.isDirectory()) {
            System.out.println("输入有误, 您输入的目录不存在!");
            return;
        }
        // 2. 让用户输入一个要查询的词.
        System.out.println("请输入要查询的词: ");
        String word = scanner.next();

        // 3. 递归的进行目录/文件的遍历了
        scanDir(rootDir, word);
    }

    private static void scanDir(File rootDir, String word) {
        // 列出当前的 rootDir 中的内容. 没有内容, 直接递归结束
        File[] files = rootDir.listFiles();
        if (files == null) {
            // 当前 rootDir 是一个空的目录, 这里啥都没有.
            // 没必要往里递归了
            return;
        }
        // 目录里有内容, 就遍历目录中的每个元素
        for (File f : files) {
            System.out.println("当前搜索到: " + f.getAbsolutePath());
            if (f.isFile()) {
                // 是普通文件
                // 打开文件, 读取内容, 比较看是否包含上述关键词
                String content = readFile(f);
                if (content.contains(word)) {
                    System.out.println(f.getAbsolutePath() + " 包含要查找的关键字!");
                }
            } else if (f.isDirectory()) {
                // 是目录
                // 进行递归操作
                scanDir(f, word);
            } else {
                // 不是普通文件, 也不是目录文件, 直接跳过
                continue;
            }
        }
    }

    private static String readFile(File f) {
        // 读取文件的整个内容, 返回出来.
        // 使用字符流来读取. 由于咱们匹配的是字符串, 此处只能按照字符流处理, 才是有意义的.
        StringBuilder stringBuilder = new StringBuilder();
        try (Reader reader = new FileReader(f)) {
            // 一次读一个字符, 把读到的结果给拼装到 StringBuilder 中. 统一转成 String
            while (true) {
                int c = reader.read();
                if (c == -1) {
                    break;
                }
                stringBuilder.append((char)c);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return stringBuilder.toString();
    }
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值