2024年C C++最新文件操作--IO,2024年最新C C++开发实战讲解

img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以戳这里获取

观察 get 系列的特点和差异

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

public class Test01 {
    public static void main(String[] args) throws IOException {
        //绝对路径
        File f = new File("g:/test.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());//获取到的是化简过的绝对路径
    }
}

输出结果:
在这里插入图片描述
绝对路径创建的文件就在指定的路径下面:
在这里插入图片描述
通过相对路径创建文件,一定得先明确一个"基准路径",如果是通过IDEA的方式来运行程序,此时基准路径就是当前java项目所在的路径

在这里插入图片描述
在IDEA中直接运行,基准路径就是上述目录,此处写的"./test.txt"在IDEA中运行,意思就是找javaIO目录下的test.txt

一旦文件路径指定错误,很容易出现找不到文件的情况。

普通文件的创建、删除

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

public class Test09 {
    public static void main(String[] args) throws IOException {
        File file = new File("hello.txt"); 要求该文件不存在,才能看到不一样现象
        System.out.println(file.exists());
        System.out.println(file.isDirectory());
        System.out.println(file.isFile());
        System.out.println("创建文件");
        file.createNewFile();//创建文件时抛出异常
        System.out.println("创建文件结束");
        System.out.println(file.exists());
        System.out.println(file.isDirectory());
        System.out.println(file.isFile());
        System.out.println(file.createNewFile());//已经创建过的文件不能重复创建
    }
}

输出结果:
在这里插入图片描述

普通文件的删除

package File;

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

public class Test10 {
    public static void main(String[] args) throws IOException {
        File file = new File("g:/hello.txt");
        System.out.println(file.exists());
        file.createNewFile();
        System.out.println(file.exists());
        file.delete();
        System.out.println(file.exists());
    }
}


输出结果:
在这里插入图片描述

目录的创建

创建目录的时候,使用mkdir只能创建一级目录,要想一次创建多级,需要使用mkdirs
mkdir() 的时候,如果中间目录不存在,则无法创建成功; mkdirs() 可以解决这个问题。

import java.io.File;
public class Test10 {
    public static void main(String[] args) {
        File file = new File("./aaa/bbb/ccc/ddd");
// file.mkdir();
        file.mkdirs();
        System.out.println(file.isDirectory());//true
    }
 }

在这里插入图片描述

返回File对象代表的目录下的所有文件名

package File;

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

public class Test11 {
    public static void main(String[] args) {
        File file = new File("./");
            //返回File 对象代表的目录下的所有文件名
            // System.out.println(Arrays.toString(file.list()));
        //返回File对象代表的目录下的所有文件,以File对象表示
        System.out.println(Arrays.toString(file.listFiles()));

    }
}

输出结果:
在这里插入图片描述
在这里插入图片描述

文件重命名

import java.io.File;
public class Test11 {
    public static void main(String[] args) {
        File file1 = new File("./aaa");
        File file2 = new File("./sss");
        file1.renameTo(file2);
        }
    }

输出结果:
在这里插入图片描述

三、文件内容的读写 —— 数据流

针对文件内容的读写,Java标准库提供了一组类,首先按照文件的内容,分成了两个系列:
1)字节流对象,针对二进制文件,是以字节为单位进行读写的;读:InputStream,写:OutputStream,上述都是抽象类,实际使用的往往是这些类的子类:FileInputStream、FileOutputStream.

2)字符流对象,针对文本文件,是以字符为单位进行读写的;读:Reader,写:Writer,实际上使用的是这些抽象类的子类:FileReader、FileWriter.

抽象类既可以针对普通文件的读写,也可以针对特殊文件(网卡,socket文件)进行读写;其子类只能针对普通文件进行读写。

为啥上述内容叫做"流”对象?
流Stream,这是一个形象的比喻。此处我们说的流,就像水流一样,打开开关,就源源不断的感觉。
例如:想通过这个流对象,来读取100个字节.可以一次读10个字节,分10次读完;
也可以一次读20个字节,分5次读完;还可以一次读100个字节,分1次读完。

InputStream 方法

修饰符及返回值类型方法签名说明
intread()读取一个字节的数据,返回 -1 代表已经完全读完了
intread(byte[] b)最多读取 b.length 字节的数据到 b 中,把读到的结果放到参数中指定的数组中,返回实际读到的数量;-1 代表以及读完了
intread(byte[] b,int off, int len)最多读取 len - off 字节的数据到 b 中,放在从 off 开始,返回实际读到的数量;-1 代表以及读完了
voidclose()关闭字节流

读文件–一次读取一个字节

import java.io.\*;

//读文件
public class Test12 {
    public static void main(String[] args) {
        try(InputStream inputStream = new FileInputStream("g:/test.txt")){
            while (true){
                int len = inputStream.read();
                if(len == -1){
                    break;
                }
                System.out.println(len);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

文件里面的内容:
在这里插入图片描述
输出结果:
在这里插入图片描述
在这个代码中,没有显式的调用close但是try 会帮我们自动调用。
当代码执行完这里的try语句块之后,就会自动的调用close。
得符合一定的条件,才能放到try ( )中.实现Closeable 这个interface,所有的流对象,都实现了Closeable,所以就可以直接放了.

读文件–一次读取若干个文件

package File;

import java.io.\*;

public class Test02 {
    public static void main(String[] args) {
        try(InputStream inputStream = new FileInputStream("g:/test.txt")){

            while (true){
                //一次读取若干个字节
                //这个操作是把读出来的结果放到 buffer这个数组中了.
                //相当于是使用参数来表示方法的返回值.这种做法称为“输出型参数"
				//这种操作在Java中比较少见.C++中遍地都是~~
                byte[] buffer = new byte[1024];
                int len = inputStream.read(buffer);
                if(len == -1){
                    break;
                }
                for (int i = 0; i < len; i++) {
                    System.out.println(buffer[i]);
                }
            }

        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

使用字节流写文件

package File;

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

public class Test03 {
    public static void main(String[] args) {
        try(OutputStream outputStream = new FileOutputStream("g:/test.txt")){
            //一次写入一个字节
// outputStream.write(97);
// outputStream.write(98);
// outputStream.write(99);

			//一次写入多个字节
            byte[] buffer = new byte[]{97,98,99,100};
            outputStream.write(buffer);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

使用字符来读

package File;

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

public class Test04 {
    public static void main(String[] args) {
        try(Reader reader = new FileReader("g:/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]);
// }
                String s = new String(buffer,0,len);
                System.out.println(s);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

输出结果:
在这里插入图片描述

按照字符来写

package File;

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


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

应用1:实现查找文件并删除

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

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

/\*\*
 \* 扫描指定目录,并找到名称中包含指定字符的所有普通文件(不包含目录),
 \* 并且后续询问用户是否要删除该文件
 \*/
public class Test06 {
    private static void scanDir(File rootDir,String toDeleteName){
        //列出rootDir中的内容
        File[] files = rootDir.listFiles();
        if(files == null){
            return;
        }
        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/y");
            Scanner sc = new Scanner(System.in);
            String str = sc.nextLine();
            if(str.equals("Y") || str.equals("y")){
                f.delete();
                System.out.println("文件删除成功!");
            }else {
                System.out.println("文件取消删除!");
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    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 );
    }
}


文件原来存放位置为G盘下 test.txt.
输出结果:
在这里插入图片描述

img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以戳这里获取

b20aca3cd14b2794020da23810bed1.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5p2l5a2m5Lmg55qE5bCP5byg,size_12,color_FFFFFF,t_70,g_se,x_16)

[外链图片转存中…(img-o7yBV9HT-1715563955799)]
[外链图片转存中…(img-3wTUDB8c-1715563955799)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以戳这里获取

  • 12
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值