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类

构造方法

 方法

返回值类型方法名解释
StringgetParent()返回File对象的父目录文件路径
StringgetName()返回File对象的纯文件名称
StringgetPath()返回File对象的文件路径
StringgetAbsolutePath()返回File对象的绝对路径
StringgetCanonicalPath()返回File对象修饰过的绝对路径
booleanexists()判断File对象是否存在
booleanisDirectory()判断File对象是否是目录
booleanisFile()判断File对象是否是文件
booleancreateNewFile()根据File对象,创建空文件,成功创建返回true
booleandelete()根据File对象,删除文件,成功删除返回true
voiddeleteOnExit()根据File对象,标注文件被删除,删除会到JVM运行结束才进行
String[]list()返回File对象目录下的所有文件名
File[]listFiles()返回File对象目录下的所有文件,以File对象表示
booleanmkdir()创建File对象代表的目录
booleanmkdirs()创建File对象代表的多级目录
booleanrenameTo(File dest)进行文件改名
booleancanRead()判断是否对文件有可读权限
booleancamWrite()判断是否对文件有可写权限

具体方法代码演示

 

 

 

 

 文件的读写操作

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

1.字节流   InputStream OutPutStream 

2.字符流   Reader         Writer

读文件

InputStream/FileInputStream

Reader/FileReader

Scanner

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

 代码

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

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

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

try with resources

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

写文件

OutPutStream/FileOutputStream

Writer/FileWriter

PrintWriter

 

 

 程序练习

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中文件操作有关的问题了,希望对你有帮助,还请点赞 评论 蟹蟹!!!

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值