javaSE(文件操作)

狭义的文件,指的是文件和文件夹
广义的文件则是泛指计算机的软硬件资源.操作系统把许多硬件设备和软件资源抽象成了文件,按照文件的格式进行管理.
路径可以使用/和,但是优先使用/ 因为\有转义字符的问题.

1.1路径

路径分为绝对路径和相对路径
相对路径: 以当前所在的目录为基准(,/ 就表示当前的目录即工作目录)
…/ 当前路径的上一级路径
比如定位到d:/tmp/111
工作目录是d:/ 相对路径就是 ./tmp/111
工作目录是d:/tmp 相对路径就是 ./111
工作目录是d:/tmp/222 相对路径就是 …/111
工作目录是d:/tmp/222/bbb 相对路径就是 …/…/111
即上一级目录可以叠加

文件

文件的类型:二进制文件和文本文件
文本文件:是字符串构成的.每个字符都是由ASCII码构成的.
二进制文件:没有任何限制.
如何区分文本文件和二进制文件?
随便一个文件使用记事本打开,如果乱码了就是二进制文件.
java对文件的操作:
1对文件系统进行操作(增删改)
2对文件内容进行操作(读和写)

1 对文件系统进行操作

File:

在这里插入图片描述

  File file = new File("d:/a/test.txt");
  //不要求这个文件真的存在
        file.createNewFile();
		file.mkdir();
		file.delete
		file.mkdirs(): 创建多级目录
		
		重命名:
		    File file = new File("./test");
        File dest = new File("./dest");
        file.renameTo(dest);
        

IO流

在这里插入图片描述

1打开文件(构造对象)
2关闭文件close
3读文件 read 针对inputStream和Reader
4写文件 write 针对OutputStream 和Writer
1字节流
InputStream FileInoutStream(读文件,文件不存在就异常)
OutputStream FileOutputStream(写文件,文件不存在就自动创建)
处理二进制文件
用字符流打印文本,读出来的是一个一个的字符的acsii码

public class Demo2 {
    public static void main(String[] args) throws IOException {
        InputStream inputStream = new FileInputStream("./test.txt");
        while (true){

            int a = inputStream.read();
            if (a == -1){
                break;
            }
            System.out.println(" "+(byte)a);
        }
        inputStream.close();
    }
}
//单次IO操作是比较消耗时间的,如此频繁的操作,耗时是会增大的,所以应该缩短IO次数.

 try(OutputStream outputStream = new FileOutputStream("./text.txt")){
            outputStream.write(97);
            outputStream.write(98);

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

2字符流
Reader(读文件)
Writer

package io;

import java.io.*;

public class Demo3 {
    public static void main(String[] args) throws FileNotFoundException {
        try(Reader reader = new FileReader("./text.txt")){
            while (true) {
                char[] buffer = new char[1024];

                int read = reader.read(buffer);
                if (read == -1){
                    break;
                }
                for (int i = 0; i < read; i++) {
                    System.out.println(buffer[i]);
                }
            }

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

练习

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

package io;

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

public class Select {
    private static    Scanner scanner = new Scanner(System.in);

    public static void main(String[] args) {
        /**
         * 给定一个目录和关键词  查看是否有匹配结果
         * 如果有匹配结果就进行删除
         */
        //用户输入指定的目录和要搜索的关键词   判断是文件则删除  是目录就递归
        System.out.println("亲输入目录名");
        String path = scanner.next();//输入根目录  next空格换行都可以  nextLine只能是换行  比较不方便
        File root = new File(path);   //构造根节点
        if (!root.isDirectory()){    //如果不是文件夹就没办法递归
            System.out.println("您输入的目录有误");
            return;
        }
        System.out.println("请输入要删除的关键词");
        String nameToDelete = scanner.next();//要删除的关键词
        scanDir(root,nameToDelete); //递归根目录


        //如果有就放入结果集  之后继续遍历

    }

    private static void scanDir(File root, String nameToDelete) {
        File[] files = root.listFiles();  //相当于打开文件夹 把里面的文件取出
            if (files == null){
                return;  //结束递归
            }
            //遍历目录  判断是不是目录  不是目录就判断是不是关键词
        for (File file: files) {
            if (file.isDirectory()){
                scanDir(file,nameToDelete); //如果是目录  就进一步递归
            }else {
                //不是目录  就判断有没有关键词
                String name = file.getName();
                if (name.contains(nameToDelete)){
                    //如果文件包含关键词就删除
                    System.out.println("确认删除  Y/N"+file.getAbsolutePath());
                    String choice = scanner.next();
                    if (choice.equals("Y") || choice.equals("y")){
                        file.delete();
                        System.out.println("删除成功");
                    }else {
                        System.out.println("删除取消");
                    }
                }
            }
        }
    }
}

2文件复制

package io;

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

public class CopyDemo {
    public static void main(String[] args) {
        //文件复制
        /**
         * 输入两个路径  源  目标
         * 源文件要存在  目标文件不能存在
         *
         */
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入要拷贝的文件");
        String srcPath = scanner.next();
        System.out.println("请输入目标地址");
        String destPath = scanner.next();
        File srcfile = new File(srcPath);
        //校验
        if (!srcfile.isFile()){
            //如果输入的源地址不是一个文件 则返回
            System.out.println("输入的源地址有误");
            return;
        }
        File destFile = new File(destPath);
        if (destFile.isFile()){
            //如果目标文件已经存在则认为u不能拷贝
            System.out.println("您输入的目标地址有误");
            return;
        }
        try (InputStream inputStream = new FileInputStream(srcfile);
             OutputStream outputStream = new FileOutputStream(destFile)){
            while (true){
                byte[] buffer = new byte[1024];
                int b = inputStream.read(buffer);
                if (b == -1){
                    break;
                }
                outputStream.write(buffer);
            }
        }  catch (IOException e) {
            e.printStackTrace();
        }


    }
}

附件

追加

OutputStream outputStream = new FileOutputStream("./test.txt",true);
        Writer writer = new FileWriter("./test.txt",true);  //true就是追加  
        false就是覆盖
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值