文件操作-IO

目录

前言

文件

狭义上的文件

广义上的文件

File类

文件内容的读写

字节流(以字节为单位)适用于二进制文件

InputSream

OutputSream

字符流(以字符为基本单位)适用于文本文件

Reader

Writer

示例


前言

在上篇博客,我们学习了多线程,接下来就要学一些文件的操作!!! 

文件

狭义上的文件

存储在硬盘上的数据,以“文件”为单位,进行组织,常见的就是普通文件(文本文件、图片、视频、音频等)

硬盘的特点:

1、硬盘存储空间大,内存存储空间小;

2、硬盘访问速度慢,内存访问速度快;

3、硬盘的成本比较低,内存成本比较高;

4、硬盘上的数据断电不会丢失,内存数据断电会丢失

广义上的文件

操作系统,是要负责管理软硬件资源,操作系统往往会把这些资源都统一的抽象成“文件”来进行管理 

File类

IO输入输出

File(String pathname)根据文件路径创建一个新的File实例,路径可以是绝对路径或者相对路径

修饰符及返回值类型方法签名说明
String
getParent()
返回 File 对象的父目录文件路径
String
getName()
返回 FIle 对象的纯文件名称
String
getPath()
返回 File 对象的文件路径
String
getAbsolutePath()
返回 File 对象的绝对路径
String
getCanonicalPath()
返回 File 对象的修饰过的绝对路径
boolean
exists()
判断 File 对象描述的文件是否真实存在
boolean
isDirectory()
判断 File 对象代表的文件是否是一个目录
boolean
isFile()
判断 File 对象代表的文件是否是一个普通文件
boolean
createNewFile()
根据 File 对象,自动创建一个空文件。成功创建后返 回 true
boolean
delete()
根据 File 对象,删除该文件。成功删除后返回 true
void
deleteOnExit()
根据 File 对象,标注文件将被删除,删除动作会到 JVM 运行结束时才会进行
String[ ]
list()
返回 File 对象代表的目录下的所有文件名
File[ ]
listFiles()
返回 File 对象代表的目录下的所有文件,以 File 对象表示
boolean
mkdir()
创建 File 对象代表的目录
boolean
mkdirs()
创建 File 对象代表的目录,如果必要,会创建中间目录
boolean
renameTo(File dest)
进行文件改名,也可以视为我们平时的剪切、粘贴操作
booleancanRead()
判断用户是否对文件有可读权限
booleancanWrite()
判断用户是否对文件有可写权限
    public static void main(String[] args) throws IOException {
        File f=new File("D:/do.txt");
        System.out.println(f.getParent());
        System.out.println(f.getName());
        System.out.println(f.getPath());
        System.out.println(f.getAbsolutePath());
        System.out.println(f.getCanonicalPath());
    }

普通文件的创建删除

    public static void main(String[] args) throws IOException {
        File f=new File("./test.txt");
        //判定存在
        System.out.println(f.exists());
        //判定是否是目录
        System.out.println(f.isDirectory());
        //判定文件是否存在
        System.out.println(f.isFile());
        //创建文件
        System.out.println(f.createNewFile());
        System.out.println(f.exists());
    }
    public static void main(String[] args) {
        //删除文件
        File f=new File("./test.txt");
        System.out.println(f.delete());
        //进程退出时删除文件
        f.deleteOnExit();
    }

创建目录

    public static void main(String[] args) {
        //创建目录
        File f=new File("./testDir");
        f.mkdir();
        //创建多级目录
        f.mkdirs();
    }

重命名

    public static void main(String[] args) {
        //重命名
        File srcFile=new File("aaa.txt");
        File destFile=new File("bbb.txt");
        srcFile.renameTo(destFile);
    }

文件内容的读写

字节流(以字节为单位)适用于二进制文件

InputSream

    public static void main(String[] args) throws IOException {
        InputStream inputStream=new FileInputStream("./bbb.txt");
        while (true){
            int b=inputStream.read();
            if (b==-1){
                break;
            }
            System.out.println(b);
        }
        inputStream.close();
    }

OutputSream

    public static void main(String[] args) throws IOException {
        OutputStream outputStream=new FileOutputStream("./bbb.txt");
        outputStream.write(97);
        outputStream.write(98);
        outputStream.write(99);
        outputStream.close();
    }

使用OutputStream写文件的时候,只要打开文件成功,就会把文件原有内容清空

字符流(以字符为基本单位)适用于文本文件

Reader

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

Writer

    public static void main(String[] args) throws IOException {
        Writer writer=new FileWriter("./bbb.txt");
        writer.write(97);
        writer.close();
    }

使用Scanner来读取文本文件内容

    public static void main(String[] args) throws IOException {
        InputStream inputStream=new FileInputStream("./bbb.txt");
        Scanner scanner=new Scanner(inputStream);
        while (scanner.hasNext()){
            System.out.println(scanner.next());
        }
        inputStream.close();
    }

使用PrintWriter来写文本文件内容

    public static void main(String[] args) throws IOException {
        OutputStream outputStream=null;
        try {
            outputStream=new FileOutputStream("./bbb.txt");
            PrintWriter writer=new PrintWriter(outputStream);
            writer.println();
            writer.printf("a=%d\n",10);   
        }finally {
            outputStream.close();   
        }
    }

示例

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

1、先让用户输入:要扫描的路径+要查找的词

2、遍历目录,找到名字匹配的文件

3、询问用户是否删除

    public static void main(String[] args) throws IOException {
        //1.让用户输入了必要的信息
        Scanner scanner=new Scanner(System.in);
        System.out.println("请输入要扫描的路径:");
        File rootDir=new File(scanner.next());
        if (!rootDir.isDirectory()){
            System.out.println("您输入的目录不存在!");
            return;
        }
        System.out.println("请输入要搜索的关键词:");
        String toDelete=scanner.next();

        //2.遍历目录
        scanDir(rootDir,toDelete);


    }

    private static void scanDir(File rootDir,String toDelete) throws IOException {
        System.out.println("当前访问"+rootDir.getCanonicalPath());
        File[] files=rootDir.listFiles();
        if(files==null){
            //说明rootDir是一个空的目录
            return;
        }
        //如果目录非空,循环遍历每个元素
        for (File f:files){
            if (f.isDirectory()){
                scanDir(f,toDelete);
            }else {
                //不是目录,是普通文件,判定文件名是否符合要求,是否要进行删除
                checkDelete(f,toDelete);
            }
        }
    }

    private static void checkDelete(File f, String toDelete) throws IOException {
        if (f.getName().contains(toDelete)){
            System.out.println("该单词"+toDelete+"被"+f.getCanonicalPath()+"包含了,是否删除?(Y/N)");
            Scanner scanner=new Scanner(System.in);
            String choice=scanner.next();
            if (choice.equals("Y")||choice.equals("y")){
                f.delete();
            }
        }
    }

文件的复制

    public static void main(String[] args) {
        //输入源文件和目标文件
        Scanner scanner=new Scanner(System.in);
        System.out.println("请输入源文件:");
        File srcFile=new File(scanner.next());
        System.out.println("请输入目标文件:");
        File destFile=new File(scanner.next());
        if (!srcFile.isFile()){
            System.out.println("输入的源文件有误!");
            return;
        }
        if (!destFile.getParentFile().isDirectory()){
            System.out.println("输入的目标文件有误!");
            return;
        }

        //打开源文件,按照字节读取内容,依次写入到目标文件中
        try (InputStream inputStream=new FileInputStream(srcFile);
             OutputStream outputStream=new FileOutputStream(destFile)){
            //读src的每个字节,写到dest中
            while (true){
                int ret=inputStream.read();
                if (ret==-1){
                    break;
                }
                outputStream.write(ret);
            }
        }catch (IOException e) {
            e.printStackTrace();
        }
    }

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

    public static void main(String[] args) throws IOException {
        //1.输入路径和要查找的关键词
        Scanner scanner=new Scanner(System.in);
        System.out.println("请输入要扫描的路径:");
        File rootDir=new File(scanner.next());
        if (!rootDir.isDirectory()){
            System.out.println("您输入的目录不存在!");
            return;
        }
        System.out.println("请输入要搜索的关键词:");
        String toFind=scanner.next();
        scanDir(rootDir,toFind);
    }

    private static void scanDir(File rootDir, String toFind) throws IOException {
        File[] files=rootDir.listFiles();
        if(files==null){
            //说明rootDir是一个空的目录
            return;
        }
        //如果目录非空,循环遍历每个元素
        for (File f:files){
            if (f.isDirectory()){
                scanDir(f,toFind);
            }else {
                //不是目录,是普通文件,判定文件名是否符合要求,是否要进行删除
                checkDelete(f,toFind);
            }
        }
    }

    private static void checkDelete(File f, String toFind) throws IOException {
        //1.先检查文件名
        if (f.getName().contains(toFind)){
            System.out.println(f.getCanonicalPath()+"文件中包含了"+toFind);
            Scanner scanner=new Scanner(System.in);
            String choice=scanner.next();
            if (choice.equals("Y")||choice.equals("y")){
                f.delete();
            }
        }
        //2.在检查文件内容
        try (InputStream inputStream=new FileInputStream(f)){
            StringBuilder stringBuilder=new StringBuilder();
            Scanner scanner=new Scanner(inputStream);
            while (scanner.hasNextLine()){
                stringBuilder.append(scanner.nextLine()+"\n");
            }
            if (stringBuilder.indexOf(toFind)>-1){
                System.out.println(f.getCanonicalPath()+"文件内容包含"+toFind);
            }
        }
    }
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值