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


    学习背景:

            在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构造方法更方便。

    实操(注意看注释):

    1. package io.Filetest;
    2. import java.io.File;
    3. public class Main {
    4. public static void main(String[] args) {
    5. File f = new File("E:\\file\\a.txt");//使用绝对路径构造File对象
    6. File f1 = new File("src\\Hello.java");//使用相对路径构造File对象 就是当前项目路径下创建路径
    7. System.out.println(f);
    8. System.out.println(f1);
    9. }
    10. }

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

            注意:在创建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文件

    1. package io.Filetest;
    2. import java.io.File;
    3. import java.io.IOException;
    4. public class Main {
    5. public static void main(String[] args) throws IOException {
    6. //磁盘下创建文件
    7. File file=new File("E:\\hello\\demo.txt");
    8. if(file.exists()){ //如果存在这个文件就删除,否则就创建
    9. file.delete();
    10. }else{
    11. System.out.println(file.createNewFile());
    12. }
    13. //在磁盘下创建一层目录,并且在目录下创建文件文件
    14. File fileDemo=new File("E:\\hello1\\demo.txt");
    15. if(!(fileDemo.getParentFile().exists())){ //判断d:\demo目录是否存在
    16. fileDemo.getParentFile().mkdir();//在父目录创建文件
    17. }
    18. if(fileDemo.exists()){ //如果存在这个文件就删除,否则就创建
    19. fileDemo.delete();
    20. }else{
    21. System.out.println(fileDemo.createNewFile());
    22. }
    23. }
    24. }

    运行结果截图:

             

       

    功能描述:临时文件操作

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

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

    1. package io.Filetest;
    2. import java.io.File;
    3. import java.io.IOException;
    4. public class Main {
    5. public static void main(String[] args) throws IOException {
    6. // 提供临时文件的前缀和后缀
    7. File f = File.createTempFile("itcast-", ".txt");
    8. f.deleteOnExit(); // JVM退出时自动删除
    9. System.out.println(f.isFile());
    10. System.out.println(f.getPath());
    11. }
    12. }

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

    运行结果截图示例:

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

    1. package io.Filetest;
    2. import java.io.File;
    3. //import java.io.IOException;
    4. public class Main {
    5. public static void main(String[] args) throws Exception {
    6. // 创建File对象
    7. File file = new File("E://比赛");
    8. if (file.isDirectory()) { // 判断File对象对应的目录是否存在
    9. String[] names = file.list(); // 获得目录下的所有文件的文件名
    10. for (String name : names) {
    11. System.out.println(name); // 输出文件名
    12. }
    13. }
    14. }
    15. }

    运行流程描述:

    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,则不添加。

    1. package io.Filetest;
    2. import java.io.File;
    3. import java.io.FilenameFilter;
    4. public class Main {
    5. public static void main(String[] args) throws Exception {
    6. // 创建File对象
    7. File file = new File("E://比赛");
    8. // 创建过滤器对象
    9. FilenameFilter filter = new FilenameFilter() {
    10. // 实现accept()方法
    11. public boolean accept(File dir, String name) {
    12. File currFile = new File(dir, name);
    13. // 如果文件名以.java结尾返回true,否则返回false
    14. if (currFile.isFile() && name.endsWith(".zip")) {
    15. return true;
    16. } else {
    17. return false;
    18. }
    19. }
    20. };
    21. if (file.exists()) { // 判断File对象对应的目录是否存在
    22. String[] lists = file.list(filter); // 获得过滤后的所有文件名数组
    23. for (String name : lists) {
    24. System.out.println(name);
    25. }
    26. }
    27. }
    28. }

    运行结果截图示例:

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

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

    1. package io.Filetest;
    2. import java.io.File;
    3. public class Main {
    4. public static void main(String[] args) {
    5. // 创建一个代表目录的File对象
    6. File file =
    7. new File("E:\\比赛\\技能大赛");
    8. fileDir(file); // 调用FileDir方法
    9. }
    10. public static void fileDir(File dir) {
    11. File[] files = dir.listFiles(); // 获得表示目录下所有文件的数组
    12. for (File file : files) { // 遍历所有的子目录和文件
    13. if (file.isDirectory()) {
    14. fileDir(file); // 如果是目录,递归调用fileDir()
    15. }
    16. System.out.println(file.getAbsolutePath()); // 输出文件的绝对路径
    17. }
    18. }
    19. }

    运行结果截图示例:

     

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

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

    1. package io.Filetest;
    2. import java.io.File;
    3. public class Main {
    4. public static void main(String[] args) {
    5. File file = new File("E:\\比赛\\技能大赛\\新建文件夹");
    6. if (file.exists()) {
    7. System.out.println(file.delete());
    8. }
    9. }
    10. }

    运行结果截图示例:

     

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

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

    1. package io.Filetest;
    2. import java.io.File;
    3. public class Main {
    4. public static void main(String[] args) {
    5. File file = new File("E:\\比赛\\技能大赛");
    6. deleteDir(file); // 调用deleteDir删除方法
    7. }
    8. public static void deleteDir(File dir) {
    9. if (dir.exists()) { // 判断传入的File对象是否存在
    10. File[] files = dir.listFiles(); // 得到File数组
    11. for (File file : files) { // 遍历所有的子目录和文件
    12. if (file.isDirectory()) {
    13. deleteDir(file); // 如果是目录,递归调用deleteDir()
    14. } else {
    15. // 如果是文件,直接删除
    16. file.delete();
    17. }
    18. }
    19. // 删除完一个目录里的所有文件后,就删除这个目录
    20. dir.delete();
    21. }
    22. }
    23. }
  • 相关阅读:
    ouster-32激光雷达使用---设备连接的网络配置
    Python实现并测试K-means聚类算法
    Java如何实现消费数据隔离?
    【无标题】
    hdlbits系列verilog解答(模块按名字)-22
    计算机中的数据存储规则
    【华为机试真题 JAVA】找出符合要求的字符串子串-100
    企业微信hook接口协议,ipad协议http,设置消息回调地址
    FPGA NVMe SSD SQ
    js事件轮询(event loop)
  • 原文地址:https://blog.csdn.net/oxygen23333/article/details/127740211