Java实现文件操作

目录

一、文件概述

二、常见文件操作 

1、获取文件路径 

2、判断文件存在以及判断类型

3、文件的创建与删除 

4、展示文件夹的文件 

5、创建文件夹 

三、用数据流来读取文件内容 

1、操作字节流文件

a、读取字节流文件

b、写字节流文件

2、操作字符流对象 

a、读取字符流文件

b、写字符流文件 

四、常见题目

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

2、复制普通文件 

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


一、文件概述

在计算机中,通常都需要文件系统来管理文件,文件系统中通过“树形” 组织文件和目录,文件可以分为文本文件和二进制文件,如果文件记事本打开出现乱码就是二进制文件,否则就是文本文件,常见的二进制文件有:.txt,.c,.java等;常见的文本文件有:.doc,.jpg,.class以及office系列的一些文件。

在文件系统中,文件的路径可以分为绝对路径和相对路径。

绝对路径:就是从根目录开始到文件,也就是从盘符开始的文件,例如:D:\bin\aa\c.txt

相对路径:以./或者../开头的路径,./代表当前目录,../代表父目录(上级目录),在相对路径中必须有一个基准目录,例如:./c.txt

二、常见文件操作 

1、获取文件路径 

getParent():获取File对象的父目录的文件路径。

getPath():返回File对象的文件路径,就是在创建File对象时指定的路径。

getAbsolutePath():返回File对象的绝对路径,该方法在返回时会将绝对路径中的./和../理解成正确路径。

getCanonicalPath():返回File对象修饰过的绝对路径。

例如:利用相对路径和绝对路径创建文件。 

public static void main(String[] args) throws IOException {
        File file = new File("D:/test/test.doc");
        System.out.println(file.getParent());
        System.out.println(file.getPath());
        System.out.println(file.getAbsoluteFile());
        System.out.println(file.getCanonicalFile());
        System.out.println("____________________________");
        File file1=new File("./test.txt");
        System.out.println(file1.getParent());
        System.out.println(file.getPath());
        System.out.println(file1.getAbsoluteFile());
        System.out.println(file1.getCanonicalFile());
    }

运行结果:

2、判断文件存在以及判断类型

exists():判断File对象是否存在。

isFile():判断File对象是否为一个普通文件。

isDirectory():判断File对象是否为一个目录文件。

操作演示:

 public void static void main(String[] args){
    File file = new File("D:/test/test.doc");
    System.out.println(file.exists());
    System.out.println(file.isFile());
    System.out.println(file.isDirectory());
}

 运行结果:

3、文件的创建与删除 

createNewFile():会根据File对象自动地创建一个空文件。

delete():删除文件,删除成功后,返回true;

deleteOnExit():根据File对象,标注文件将会被删除,删除动作会到JVM运行结束时才会进行。也就是说在程序运行结束时才会执行删除操作。

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

运行结果:

4、展示文件夹的文件 

list():返回值是String[],返回的是目录文件下的所有文件名。

listFiles():返回值是File(),返回的是目录文件下的所有的文件。 

public static void main(String[] args) throws IOException {
        File file=new File("d:/test");
        String[] fileNames=file.list();
        for(int i=0;i< fileNames.length;i++){
            System.out.print(fileNames[i]+" ");
        }
        System.out.println();
        File[] files=file.listFiles();
        for(int i=0;i<files.length;i++){
            System.out.print(files[i] + " ");
        }
}

运行结果:

5、创建文件夹 

mkdir():创建单个目录文件。

mkdirs():创建多个嵌套的目录文件。

 public static void main(String[] args) throws IOException {
        File file=new File("D:/test/a");
        file.mkdir();
        System.out.println(file.getAbsolutePath());
        File file2=new File("D:/test/sa/wq/a/c");
        file.mkdirs();
        System.out.println(file2.getAbsolutePath());
}

运行结果:

三、用数据流来读取文件内容 

 在Java标准库中提供了一组类来进行文件操作:
字节流文件:也就是二进制文件,以字节的方式进行读写,利用InputStream和OutputStream类进行操作。

字符流文件:以字符的方式进行读取,利用Reader和Writer类进行操作。

但是上述的四个类都是抽象类,在真正实现时采用FileInputStream、FileOutputStream、FileReader和FileWriter。

1、操作字节流文件

a、读取字节流文件

需要创建一个FileinputStream流对象,利用read方法读取字符流文件时使用byte[]字节数组进行接收,最后对byte数组进行遍历输出。

注意:在读取文件以及关闭文件时可能都会出现IOException,于是在try()的括号中构建实例,这样就不用在finally中关闭流对象,会自动关闭。

try(InputStream inputStream=new FileInputStream("D:\\one-question-per-day\\src\\test.txt")){
            byte[] buffer=new byte[1024];
            int len;
            while(true){
                len=inputStream.read(buffer);
                if(len==-1){
                    break;
                }
                System.out.println(Arrays.toString(buffer));

            }

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

b、写字节流文件

需要创建一个FileOutputStream流对象,然后同样也是try—catch处理异常,然后利用write()方法向指定文件写入内容。

try(OutputStream outputStream=new FileOutputStream("D:\\one-question-per-day\\src\\test.txt")){
            outputStream.write(11);
            outputStream.write(90);
            outputStream.write(23);
        }catch(IOException e){
            e.printStackTrace();
        }

2、操作字符流对象 

a、读取字符流文件

需要创建一个FileReader对象,再创建一个char[]型数组用于接收文件的字符,最后再对char数组进行遍历。

try(Reader reader=new FileReader("D:\\one-question-per-day\\src\\test.txt")){
            char[] chars=new char[1024];
            int len;
            while(true){
                len=reader.read(chars);
                if(len==-1){
                    break;
                }
                for(int i=0;i<len;i++){
                    System.out.println(chars[i]);
                }

            }

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

b、写字符流文件 

需要创建一个FileWriter对象,再用write()方法写入指定文件。

try(Writer writer=new FileWriter("D:\\one-question-per-day\\src\\test.txt")){
            writer.write(99);
            writer.write('x');
            writer.write('a');
        }catch (IOException e){
            e.printStackTrace();
        }

四、常见题目

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

解题思路:首先输入要指定的目录文件的路径和指定字符,首先需要判断路径是否有效,接着再利用listFiles()列出目录中的文件存放到files数组中,对数组进行遍历,若是普通文件则询问删除,若是目录文件,则递归调用本身方法。

public static void deleteFile(String path,String name){
        File file=new File(path);
        if(!file.exists()){
            System.out.println("指定路径的文件不存在");
        }
        File[] files=file.listFiles();
        if(files==null){
            return;
        }
        for(File f:files){
            if(f.isDirectory()){
                deleteFile(f.getAbsolutePath(),name);
            }
            if(f.isFile()){
                if(f.getName().contains(name)){
                    System.out.println(f.getAbsolutePath()+"确认删除吗?(y/n)");
                    Scanner sc=new Scanner(System.in);
                    char option=sc.next().charAt(0);
                    if(option=='y'){
                        f.delete();
                    }else if(option!='n'){
                        System.out.println("输入有误");
                    }
                }
            }
        }
    }


    public static void main(String[] args) {
       System.out.println("请输入要检索的文件路径");
        Scanner sc=new Scanner(System.in);
        String str=sc.next();
        System.out.println("请输入要删除的文件名包含的信息");
        String str2=sc.next();
        deleteFile(str,str2);
    }

2、复制普通文件 

解题思路:分别创建输入流对象和输出流对象,然后定义byte数组,对原文件进行读取,将读取的内容写入新复制的文件。

public static File copyFile(File file) throws IOException {
        if(!file.exists()){
            System.out.println("文件不存在");
        }
        File dFile=new File("dFile.txt");
        try(InputStream inputStream=new FileInputStream(file)){
            try(OutputStream outputStream=new FileOutputStream(dFile)){
                byte[] buffer=new byte[1024];
                int len=0;
                while(true){
                    len= inputStream.read(buffer);
                    if(len==-1){
                        break;
                    }
                    outputStream.write(buffer,0,len);
                }
            }
        }
        return dFile;
    }

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

解题思路:该题与第一题类似,也需要用到递归思想,本题着重在于如何确定文件内容中是否含有指定字符。可以利用StringBuilder对象,将每次读到的内容添加进去,再在StringBuilder对象中检索是否包含指定字符。

public static void scanFile(File file,String massage) throws FileNotFoundException {
        if(!file.exists()){
            System.out.println("文件不存在");
        }
        File[] files=file.listFiles();
        if(files==null){
            return;
        }

        for(File f:files){
            if(f.isFile()){
                if(f.getName().contains(massage)||content(f,massage)){
                    System.out.println(f.getName());
                }
            }
            if(f.isDirectory()){
                scanFile(f,massage);
            }
        }
    }
    public static boolean content(File file,String massage) throws FileNotFoundException {
        StringBuilder stringBuilder=new StringBuilder();
        try(Reader reader=new FileReader(file)) {
            char[] chars=new char[1024];
            int len=0;
            while(true){
                len=reader.read(chars);
                if(len==-1){
                    break;
                }
                stringBuilder.append(chars,0,len);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return stringBuilder.indexOf(massage)==-1;
    }
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

过✪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值