zoukankan      html  css  js  c++  java
  • File类和RandomAccessFile类

    File类

    File类是java.io包中唯一对文件本身进行操作的类。它可以进行创建、删除文件等操作。

     

    File类常用操作

    (1)创建文件

    可以使用 createNewFille() 创建一个新文件。
    注意:
    Windows 中使用反斜杠表示目录的分隔符""
    Linux 中使用正斜杠表示目录的分隔符"/"
    最好的做法是使用 File.separator 静态常量,可以根据所在操作系统选取对应的分隔符。
     

    (2)删除文件

    可以使用 delete() 删除一个文件。
    一般删除文件前,最好先使用 exists() 判断一下文件是否存在。 
    演示创建和删除文件操作
    复制代码
    import java.io.File;
    import java.io.IOException;
     
    public class FileDemo01 {
     
        public static void createFile(String filepath) {
            File f = new File(filepath);
            System.out.println("[Create File] " + f.getPath().toString());
            try {
                f.createNewFile(); // 创建文件,根据给定的路径创建
            } catch (IOException e) {
                e.printStackTrace(); // 输出异常信息
            }
        }
     
        public static void deleteFile(String filepath) {
            File f = new File(filepath);
            System.out.println("[Delete File] " + f.getPath().toString());
            if(f.exists()){    // 如果文件存在则删除
                f.delete(); // 创建文件,根据给定的路径创建
            }
        }
     
        public static void main(String args[]) {
            // 注意三种分隔符方式
            String path1 = "d:\test1.txt"; // Windows中使用反斜杠表示目录的分隔符""
            String path2 = "d:/test2.txt"; // Linux中使用正斜杠表示目录的分隔符"/"
            String path3 = "d:" + File.separator + "test3.txt"; // 最好的做法是使用File.separator,可以根据所在操作系统选取对应分隔符
     
            createFile(path1);
            createFile(path2);
            createFile(path3);
           
            deleteFile(path1);
        }
    };
    复制代码
    运行结果
    在D:盘符下,先创建了三个文件,又删除了第一个文件。最后剩下test2.txt和test3.txt两个文件。
     

    (3)创建文件夹

    可以使用 mkdir() 来创建文件夹,但是如果要创建的目录的父路径不存在,则无法创建成功
    如果要解决这个问题,可以使用 mkdirs(),当父路径不存在时,会连同上级目录都一并创建。 
    复制代码
    import java.io.File;

    public class FileDemo02 {
        public static void main(String args[]) {
            File f = new File("d:\abc\test"); // 实例化File类的对象
            f.mkdir(); // 创建文件夹
            // f.mkdirs(); // 创建文件夹,如果父路径不存在,会一并创建
        }
    };
    复制代码
    运行结果
    上面的例子中,如果用mkdir(),会发现创建目录失败;而用mkdirs()则成功。 
     

    (4)列出指定目录全部文件

    File中给出了两种列出文件夹内容的方法:
    list(): 列出全部名称,返回一个字符串数组。
    listFiles(): 列出完整的路径,返回一个File对象数组。
    复制代码
    import java.io.File;
     
    public class FileDemo03 {
        public static void testListFiles1(String path) {
            File f = new File(path); // 实例化File类的对象
            String str[] = f.list(); // 列出给定目录中的内容
            System.out.println("[list]");
            for (int i = 0; i < str.length; i++) {
                System.out.println(str[i]);
            }
        }
     
        public static void testListFiles2(String path) {
            File f = new File(path); // 实例化File类的对象
            File files[] = f.listFiles(); // 列出全部内容
            System.out.println("[listFiles]");
            for (int i = 0; i < files.length; i++) {
                System.out.println(files[i]);
            }
        }
     
        public static void main(String args[]) {
            String path = "d:" + File.separator;
            testListFiles1(path);
            testListFiles2(path);
        }
    };
    复制代码
     
     

    (5)删除目录

    可以使用 delete() 来删除目录。
    需要注意的是,如果这个目录不为空,直接用 delete() 删除会失败。 
    以下演示了一个删除指定目录,包括其所有子文件和子目录的范例
    复制代码
    import java.io.File;
     
    public class DeleteDirectory {
       
        /**
         * 删除空目录,如果目录不为空,无法删除
         * @param dir
         */
        private static void deleteEmptyDir(String dir) {
            File f = new File(dir);
            boolean success = f.delete();
            if (success) {
                System.out.println("Success to deleted " + dir);
            } else {
                System.out.println("Failed to delete " + dir);
            }
        }
     
        /**
         * 如果传入的是一个目录对象,遍历删除其所有子文件和子目录
         * @param dir
         * @return
         */
        private static boolean deleteDir(File dir) {
            if (dir.isDirectory()) {
                File[] children = dir.listFiles();// 递归删除目录中的子目录下
                for (int i = 0; i < children.length; i++) {
                    boolean success = deleteDir(children[i]);
                    if (!success) {
                        return false;
                    }
                }
            }
     
            // 目录此时为空,可以删除
            return dir.delete();
        }
     
        public static void main(String[] args) {
            String emptyDir = "d:\empty";
            String dir2 = "d:\test";
           
            deleteEmptyDir(emptyDir);
            boolean success = deleteDir(new File(dir2));
            if (success) {
                System.out.println("Success to deleted " + dir2);
            } else {
                System.out.println("Failed to delete  " + dir2);
            }
        }
    }
    复制代码
     

    RandomAccessFile类

    RandomAccessFile类是随机读取类,它是一个完全独立的类。

    适用于由大小已知的记录组成的文件,所以我们可以使用seek()将记录从一处转移到另一处,然后读取或者修改记录。

    文件中记录的大小不一定都相同,只要能够确定哪些记录有多大以及它们在文件中的位置即可。

    RandomAccessFile类可以实现对文件内容的读写操作,但是比较复杂。所以一般操作文件内容往往会使用字节流或字符流方式
     

    (1)写入数据

    当用 rw 方式声明RandomAccessFile对象时,如果要写入的文件不存在,系统将自行创建。 
    r 为只读;w 为只写;rw 为读写。 
    为了保证可以进行随机读取,所有写入的名字都是8个字节,写入的数字都是固定的4个字节。
    复制代码
    import java.io.File;
    import java.io.RandomAccessFile;
     
    public class RandomAccessFileDemo01 {
          // 所有的异常直接抛出,程序中不再进行处理
          public static void main(String args[]) throws Exception {
               File f = new File("d:" + File.separator + "test.txt"); // 指定要操作的文件
               RandomAccessFile rdf = null; // 声明RandomAccessFile类的对象
               rdf = new RandomAccessFile(f, "rw");// 读写模式,如果文件不存在,会自动创建
               String name = null;
               int age = 0;
               name = "zhangsan"; // 字符串长度为8
               age = 30; // 数字的长度为4
               rdf.writeBytes(name); // 将姓名写入文件之中
               rdf.writeInt(age); // 将年龄写入文件之中
               name = "lisi    "; // 字符串长度为8
               age = 31; // 数字的长度为4
               rdf.writeBytes(name); // 将姓名写入文件之中
               rdf.writeInt(age); // 将年龄写入文件之中
               name = "wangwu  "; // 字符串长度为8
               age = 32; // 数字的长度为4
               rdf.writeBytes(name); // 将姓名写入文件之中
               rdf.writeInt(age); // 将年龄写入文件之中
               rdf.close(); // 关闭
          }
    };
    复制代码
     

    (2)读取数据

    读取是直接使用 r 的模式即可,以只读的方式打开文件。
    读取时所有的字符串只能按照byte数组方式读取出来,而且长度必须和写入时的固定大小相匹配。 
    复制代码
    import java.io.File;
    import java.io.RandomAccessFile;

    public class RandomAccessFileDemo02{
        // 所有的异常直接抛出,程序中不再进行处理
        public static void main(String args[]) throws Exception{
            File f = new File("d:" + File.separator + "test.txt") ;    // 指定要操作的文件
            RandomAccessFile rdf = null ;        // 声明RandomAccessFile类的对象
            rdf = new RandomAccessFile(f,"r") ;// 以只读的方式打开文件
            String name = null ;
            int age = 0 ;
            byte b[] = new byte[8] ;    // 开辟byte数组
            // 读取第二个人的信息,意味着要空出第一个人的信息
            rdf.skipBytes(12) ;        // 跳过第一个人的信息
            for(int i=0;i<b.length;i++){
                b[i] = rdf.readByte() ;    // 读取一个字节
            }
            name = new String(b) ;    // 将读取出来的byte数组变为字符串
            age = rdf.readInt() ;    // 读取数字
            System.out.println("第二个人的信息 --> 姓名:" + name + ";年龄:" + age) ;
            // 读取第一个人的信息
            rdf.seek(0) ;    // 指针回到文件的开头
            for(int i=0;i<b.length;i++){
                b[i] = rdf.readByte() ;    // 读取一个字节
            }
            name = new String(b) ;    // 将读取出来的byte数组变为字符串
            age = rdf.readInt() ;    // 读取数字
            System.out.println("第一个人的信息 --> 姓名:" + name + ";年龄:" + age) ;
            rdf.skipBytes(12) ;    // 空出第二个人的信息
            for(int i=0;i<b.length;i++){
                b[i] = rdf.readByte() ;    // 读取一个字节
            }
            name = new String(b) ;    // 将读取出来的byte数组变为字符串
            age = rdf.readInt() ;    // 读取数字
            System.out.println("第三个人的信息 --> 姓名:" + name + ";年龄:" + age) ;
            rdf.close() ;                // 关闭
        }
    };
    复制代码

    运行结果

    第二个人的信息 --> 姓名:lisi    ;年龄:31
    第一个人的信息 --> 姓名:zhangsan;年龄:30
    第三个人的信息 --> 姓名:wangwu  ;年龄:32
     
  • 相关阅读:
    Combine 框架,从0到1 —— 4.在 Combine 中使用计时器
    Combine 框架,从0到1 —— 4.在 Combine 中使用通知
    Combine 框架,从0到1 —— 3.使用 Subscriber 控制发布速度
    Combine 框架,从0到1 —— 2.通过 ConnectablePublisher 控制何时发布
    使用 Swift Package Manager 集成依赖库
    iOS 高效灵活地配置可复用视图组件的主题
    构建个人博客网站(基于Python Flask)
    Swift dynamic关键字
    Swift @objcMembers
    仅用递归函数操作逆序一个栈(Swift 4)
  • 原文地址:https://www.cnblogs.com/jerrylz/p/5548840.html
Copyright © 2011-2022 走看看