【java养成】:I/O(输入/输出操作)——>File类、字节流、字符流

本文详细介绍了Java中的IO流,包括File类的使用、字节流和字符流的概念及操作。通过实例展示了如何创建、读写文件,遍历目录,以及临时文件和删除文件的操作。同时,讲解了如何使用FilenameFilter过滤指定类型的文件。内容覆盖了文件的创建、删除、遍历以及文件系统的交互,是学习Java I/O操作的重要参考资料。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

学习背景:

        在Java中,将这种通过不同输入输出设备(键盘,内存,显示器,网络等)之间的数据传输抽象表述为“流”,程序允许通过流的方式与输入输出设备进行数据传输。Java中的“流”都位于java.io包中,称为IO(输入输出)流。

学习目标:java的I/O(输入/输出操作)

        此文参照书本知识,本文章只供大家学习,希望能对大家有所帮助,提高学习速度,不要在学习的海洋迷路。

Java的输入/输出分类为:

  1.             熟悉如何使用File类访问文件系统
  2.             掌握字节流和字符流读写文件的操作

根据三个类我们将File类单独写一篇文章,字节流和字符流合并成一篇文章,供大家学习。


字节流和字符流文章链接如下:

        等待更新!


学习内容:熟悉如何使用File类访问文件系统

输入输出操作分类

File类常用的构造方法,如表所示:

方法声明

功能描述

File(String pathname)

通过指定的一个字符串类型的文件路径来创建一个新的File对象

File(String parent,String child)

根据指定的一个字符串类型的父路径和一个字符串类型的子路径

(包括文件名称)创建一个File对象

File(File parent,String child)

根据指定的File类的父路径和字符串类型的子路径(包括文件名称)

创建一个File对象

注意:所有的构造方法都需要传入文件路径。

  1.     程序只处理一个目录或文件,并且知道该目录或文件的路径,第一个File构造方法比较简单。
  2.     程序处理一个公共目录中的若干子目录或文件,用其余两个File构造方法更方便。

实操(注意看注释):

package io.Filetest;

import java.io.File;

public class Main {
    public static void main(String[] args) {
        File f = new File("E:\\file\\a.txt");//使用绝对路径构造File对象
        File f1 = new File("src\\Hello.java");//使用相对路径构造File对象  就是当前项目路径下创建路径
        System.out.println(f);
        System.out.println(f1);
    }
}

大家要清楚绝对路径和相对路径的区别!

        注意:在创建File对象时传入的路径使用了“\\”,这是因为在Windows中的目录符号为反斜线“\”,但反斜线“\”在Java中是特殊字符,表示转义符。

        所以使用反斜线“\”时,前面应该再添加一个反斜线,即为“\\”。

        除此之外,目录符号还可以用正斜线“/”表示,如“E:/file/a.txt”。


 File类中提供了一系列方法,用于操作其内部封装的路径指向的文件或者目录,例如判断文件/目录是否存在、创建、删除文件/目录等。
操作如下:

       方法声明

功能描述

boolean exists()

判断File对象对应的文件或目录是否存在,若存在则返回ture,否则返回false

boolean delete()

删除File对象对应的文件或目录,若成功删除则返回true,否则返回false

boolean createNewFile()

File对象对应的文件不存在时,该方法将新建一个此File对象所指定的新文件,若创建成功则返回true,否则返回false

String getName()

返回File对象表示的文件或文件夹的名称

String getPath()

返回File对象对应的路径

String getAbsolutePath()

返回File对象对应的绝对路径(Unix/Linux等系统上,如果路径是以正斜线/开始,则这个路径是绝对路径;在Windows等系统上,如果路径是从盘符开始,则这个路径是绝对路径)

String getParentFile()

返回File对象对应目录的父目录(即返回的目录不包含最后一级子目录)

boolean canRead()

判断File对象对应的文件或目录是否可读,若可读则返回true,反之返回false

boolean canWrite()

判断File对象对应的文件或目录是否可写,若可写则返回true,反之返回false

boolean isFile()

判断File对象对应的是否是文件(不是目录),若是文件则返回true,反之返回false

boolean isDirectory()

判断File对象对应的是否是目录(不是文件),若是目录则返回true,反之返回false

boolean isAbsolute()

判断File对象对应的文件或目录是否是绝对路径

long lastModified()

返回197011000秒到文件最后修改时间的毫秒值;

long length()

返回文件内容的长度

String[] list()

列出指定目录的全部内容,只是列出名称

File[] listFiles()

返回一个包含了File对象所有子文件和子目录的File数组

     注:以上方法中 String getParentFile方法的  返回值是File类型并不是String。

功能描述:在E盘根目录的  hello、hello1  文件夹中分别创建dome.txt文件

package io.Filetest;

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

public class Main {
    public static void main(String[] args) throws IOException {
        //磁盘下创建文件
        File file=new File("E:\\hello\\demo.txt");
        if(file.exists()){ //如果存在这个文件就删除,否则就创建
            file.delete();
        }else{
            System.out.println(file.createNewFile());
        }
        //在磁盘下创建一层目录,并且在目录下创建文件文件
        File fileDemo=new File("E:\\hello1\\demo.txt");
        if(!(fileDemo.getParentFile().exists())){ //判断d:\demo目录是否存在
            fileDemo.getParentFile().mkdir();//在父目录创建文件
        }
        if(fileDemo.exists()){ //如果存在这个文件就删除,否则就创建
            fileDemo.delete();
        }else{
            System.out.println(fileDemo.createNewFile());
        }
    }
}

运行结果截图:

         

   

功能描述:临时文件操作

        createTempFile()   ——   创建一个临时文件

        deleteOnExit()   ——   Jvm退出时自动删除该文件

package io.Filetest;

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

public class Main {
    public static void main(String[] args) throws IOException {
        // 提供临时文件的前缀和后缀
        File f = File.createTempFile("itcast-", ".txt");
        f.deleteOnExit(); // JVM退出时自动删除
        System.out.println(f.isFile());
        System.out.println(f.getPath());
    }
}

以上代码会在当前项目文件根目录创建临时文件 itcast-  后缀 .txt 

运行结果截图示例:

功能描述:list()方法遍历目录下所有的文件

package io.Filetest;

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

public class Main {
    public static void main(String[] args) throws Exception {
        // 创建File对象
        File file = new File("E://比赛");
        if (file.isDirectory()) { // 判断File对象对应的目录是否存在
            String[] names = file.list(); // 获得目录下的所有文件的文件名
            for (String name : names) {
                System.out.println(name); // 输出文件名
            }
        }
    }
}

运行流程描述:

  1.         首先创建了一个File对象,并指定了一个路径,通过File的方法判断路径指向的是否为存在的目录。
  2.         如果存在就调用list方法,获得一个string类型的数组names,数组中包含目录下所有文件名。
  3.         最后循环遍历打印输出每个文件的文件名。

运行结果截图示例:

 

功能描述:遍历得到指定类型(格式)的文件

如果需要获取指定类型文件,针对这些,需要使用list(FilenameFilter filter)方法。

list(FilenameFilter filter):

        1.该方法接收一个一个FilenameFilter类型的参数;

        2.FilenameFilter是一个接口,是一个文件过滤器

        3.定义了一个抽象方法accept(File dir,String name)。在调用list()方法时,需要实现文件过滤器FilenameFilter,并在accept()方法中做出判断,从而获得指定类型的文件

list(FilenameFilter filter) —> 工作原理:

        1.调用list()方法传入FilenameFilter文件过滤器对象

        2.取出当前File对象所代表目录下的所有子目录和文件。

        3.对于每一个子目录或文件,都会调用文件过滤器对象的accept(File dir,String name)方法,并把代表当前目录的File对象以及这个子目录或文件的名字作为参数dir和name传递给方法。

        4.如果accept()方法返回true,就将当前遍历的这个子目录或文件添加到数组中,如果返回false,则不添加。

package io.Filetest;

import java.io.File;
import java.io.FilenameFilter;

public class Main {
    public static void main(String[] args) throws Exception {
        // 创建File对象
        File file = new File("E://比赛");
        // 创建过滤器对象
        FilenameFilter filter = new FilenameFilter() {
            // 实现accept()方法
            public boolean accept(File dir, String name) {
                File currFile = new File(dir, name);
                // 如果文件名以.java结尾返回true,否则返回false
                if (currFile.isFile() && name.endsWith(".zip")) {
                    return true;
                } else {
                    return false;
                }
            }
        };
        if (file.exists()) { // 判断File对象对应的目录是否存在
            String[] lists = file.list(filter); // 获得过滤后的所有文件名数组
            for (String name : lists) {
                System.out.println(name);
            }
        }
    }
}

运行结果截图示例:

功能描述:遍历目录下文件的文件名、子目录

        需要使用File类提供的另一个方法listFiles()。listFiles()方法返回一个File对象数组,当对数组中的元素进行遍历时,如果元素中还有子目录需要遍历,则需要使用递归。

package io.Filetest;

import java.io.File;

public class Main {
    public static void main(String[] args) {
        // 创建一个代表目录的File对象
        File file =
                new File("E:\\比赛\\技能大赛");
        fileDir(file);					 // 调用FileDir方法
    }
    public static void fileDir(File dir) {
        File[] files = dir.listFiles(); // 获得表示目录下所有文件的数组
        for (File file : files) {		 // 遍历所有的子目录和文件
            if (file.isDirectory()) {
                fileDir(file);			 // 如果是目录,递归调用fileDir()
            }
            System.out.println(file.getAbsolutePath()); // 输出文件的绝对路径
        }
    }
}

运行结果截图示例:

 

功能描述:删除文件及目录

File的delete()方法,使用delete()方法删除文件或文件夹。

package io.Filetest;

import java.io.File;

public class Main {
    public static void main(String[] args) {
        File file = new File("E:\\比赛\\技能大赛\\新建文件夹");
        if (file.exists()) {
            System.out.println(file.delete());
        }
    }
}

运行结果截图示例:

 

 注意:假如File对象代表目录,并且目录下包含子目录或文件,则File类的delete()方法不允许对这个目录直接删除。在这种情况下,需要通过递归的方式将整个目录以及其中的文件全部删除。

以下代码解决注意事项问题:

package io.Filetest;

import java.io.File;

public class Main {
    public static void main(String[] args) {
        File file = new File("E:\\比赛\\技能大赛");
        deleteDir(file); // 调用deleteDir删除方法
    }
    public static void deleteDir(File dir) {
        if (dir.exists()) { // 判断传入的File对象是否存在
            File[] files = dir.listFiles(); // 得到File数组
            for (File file : files) { // 遍历所有的子目录和文件
                if (file.isDirectory()) {
                    deleteDir(file); // 如果是目录,递归调用deleteDir()
                } else {
                    // 如果是文件,直接删除
                    file.delete();
                }
            }
            // 删除完一个目录里的所有文件后,就删除这个目录
            dir.delete();
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

嵌入式up

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

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

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

打赏作者

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

抵扣说明:

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

余额充值