Java_文件操作(IO)

今天这篇博客就是总结Java对于文件操作的一些知识点,一起来看

目录

文件

硬盘VS内存

Java操作文件

文件路径(path)

File类

 文件的读写操作

读文件

写文件

 程序练习

1.文件查找(文件名)

2.复制一个普通文件

3.遍历目录,看输入的词是否在文件中出现(文件名或者文件内容)


文件

针对硬盘这种持久化存储的 I/O 设备,当我们想要进行数据保存时, 往往不是保存成一个整体,而是独立成一个个的单位进行保存,这个独立的单位就被抽象成文件的概 念,就类似办公桌上的一份份真实的文件一般,我们知道文件是存储在硬盘中

硬盘VS内存

1.内存的存储空间小于硬盘

2.内存访问速度快过硬盘

3.内存的成本高于硬盘

4.内存数据掉电丢失,硬盘数据掉电还存在

Java操作文件

文件是被操作系统管理的,操作系统内核有专门的模块,文件系统,Java针对文件系统/文件进行了封装,Java提供了File类表示一个文件

文件路径(path)

绝对路径:以盘符开头的路径

D:\program\qq\Bin\QQ.exe

使用“\”或者“/”都可以分隔路径 

相对路径: 以.或者..开头的路径

File类

构造方法

Java_文件操作(IO)_第1张图片

 方法

返回值类型 方法名 解释
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) 进行文件改名
boolean canRead() 判断是否对文件有可读权限
boolean camWrite() 判断是否对文件有可写权限

具体方法代码演示

Java_文件操作(IO)_第2张图片

Java_文件操作(IO)_第3张图片

 Java_文件操作(IO)_第4张图片

 Java_文件操作(IO)_第5张图片

 Java_文件操作(IO)_第6张图片

Java_文件操作(IO)_第7张图片

 Java_文件操作(IO)_第8张图片

 文件的读写操作

在Java中关于文件读写提供了一些类

1.字节流   InputStream OutPutStream 

2.字符流   Reader         Writer

读文件

InputStream/FileInputStream

Reader/FileReader

Scanner

InputStream是一个抽象类,不能直接实例化需要使用子类FileInputStream来读文件,通过构造方法传入一个路径来打开文件,read()方法读文件,close()方法关闭文件

Java_文件操作(IO)_第9张图片

 代码

Java_文件操作(IO)_第10张图片

Java_文件操作(IO)_第11张图片

 可以看到输出结果都是字节,我们要是想输出字符还需要手动new String()转换比较麻烦,Java提供了字符流来读文件

Java_文件操作(IO)_第12张图片

 文本文件有没有更简单的方法呢答案是肯定的,就是通过Scanner

Java_文件操作(IO)_第13张图片

 这种明显是跟方便了,但是代码此时有BUG,就是触发异常可能执行不到close()方法来看解决方法

try with resources

Java_文件操作(IO)_第14张图片

 会在try执行结束之后,自动调用inputStream的close,前提条件就是这个类实现了Closeable接口才能实现

写文件

OutPutStream/FileOutputStream

Writer/FileWriter

PrintWriter

Java_文件操作(IO)_第15张图片

 Java_文件操作(IO)_第16张图片

 Java_文件操作(IO)_第17张图片

 程序练习

1.文件查找(文件名)

 public static void main(String[] args) {
        Scanner scanner=new Scanner(System.in);
        System.out.println("请输入要扫描的路径");
        String rootPath=scanner.next();
        File file=new File(rootPath);
        if(!file.exists()) {
            System.out.println("输入的路径不存在");
        }
        System.out.println("请输入要删除的文件名或者文件名中的一部分");
        String toDelete=scanner.next();
        scanDir(file,toDelete);
    }
    public static void scanDir(File root,String toDelete) {
        //递归寻找文件
       File[] files = root.listFiles();//将目录转换为数组
        if(files == null) {
            //空目录
            return;
        } 
        for (File f : files) {
            if (f.isDirectory()) {
            scanDir(f,toDelete);
           //是目录继续递归找文件
            } else {
                tryDelete(f,toDelete);
            }
        }
    }
    public static void tryDelete(File f,String toDelete) {
        //判断当前文件名是否包含要删除的内容
        if(f.getName().contains(toDelete)) {
            try {
                System.out.println("是否要删除文件(Y/N)"+f.getCanonicalPath());
                Scanner scanner=new Scanner(System.in);
                String choice=scanner.next();
                if(choice.equals("Y")) {
                    f.delete();//判断结果为Y删除
                }
            } catch (IOException e) {
                e.printStackTrace();
            }

        }
    }

2.复制一个普通文件

 public static void main(String[] args) {
        Scanner scanner=new Scanner(System.in);
        System.out.println("请输入要复制的文件路径");
        String srcPath=scanner.next();
        File srcFile=new File(srcPath);
        if(!srcFile.exists()) {
            System.out.println("要复制的文件不存在");
            return;
        }
        if(!srcFile.isFile()) {
            System.out.println("要复制的不是普通文件");
        }
        System.out.println("输入要复制的目标文件路径");
        String destPath=scanner.next();
        File destFile=new File(destPath);
        if(destFile.exists()) {
            System.out.println("要复制的文件不存在");
        }
        try(InputStream inputStream =new FileInputStream(srcFile)) {
            try(OutputStream outputStream=new FileOutputStream(destFile)) {
                byte[] buf=new byte[1024];//缓冲区使用
                while(true) {
                    int len=inputStream.read(buf);
                    if(len==-1){
                        break;
                    }
                    outputStream.write(buf,0,len);
                }
            }
        }catch (IOException e) {
            e.printStackTrace();
        }
    }

3.遍历目录,看输入的词是否在文件中出现(文件名或者文件内容)

  //遍历目录看输入的内容是否是文件名或者文件中的内容
    public static void main(String[] args) throws IOException {
        Scanner scanner=new Scanner(System.in);
        System.out.println("请输入要搜索的目录");
        String rootFile=scanner.next();
        File file=new File(rootFile);
        if(!file.exists()) {
            System.out.println("要查找的目录不存在");
            return;
        }
        if(!file.isDirectory()) {
            System.out.println("要扫描的不是目录");
            return;
        }
        //到这里知道是目录文件或者是普通文件
        System.out.println("请输入要搜索的词");
        String toFind=scanner.next();
        scaDir(file,toFind);
    }
    public static void scaDir(File rootFile,String toFind) throws IOException {
        File[] files=rootFile.listFiles();
        if(files==null) {
            return ;
        }
        for (File f :files) {
            if(f.isDirectory()) {
                scaDir(f,toFind);
            }else{
                tryFindInFile(f,toFind);
            }
        }
    }
    //判断toFind是文件名或者是文件内容的一部分
    public static void tryFindInFile(File f,String toFind) throws IOException {
        if(f.getName().contains(toFind)) {//文件名的一部分
            System.out.println("找到了文件"+f.getCanonicalPath());
        }
        try(InputStream inputStream=new  FileInputStream(f)) {//通过file对象实例化输入流对象
            StringBuilder stringBuilder=new StringBuilder();
            Scanner scanner=new Scanner(inputStream);
            while(scanner.hasNextInt()) {
                stringBuilder.append(scanner.nextLine());//字符串拼接一行数据
            }
            if(stringBuilder.indexOf(toFind)>=0);//找到相同会返回起始的下标
            System.out.println("找到文件内容匹配的文件"+f.getCanonicalPath());
        }
    }

好的通过上面3个程序练习的代码基本可以应对Java中文件操作有关的问题了,希望对你有帮助,还请点赞 评论 蟹蟹!!!

你可能感兴趣的:(Java,java,开发语言)