• 【Java】文件读写和输入输出


    正文开始

    1. 文件操作 - File

    File用来表示文件系统中的一个文件或目录。

    使用 File 可以:

    1. 访问其表示的文件或目录的属性信息(名字,大小等信息)
    2. 创建或删除文件及目录
    3. 访问一个目录中的子项

    但是File不能访问文件数据。

    1.1 基本操作

    关于File的一些基本操作:

    • String getName()
      获取文件名称
    • long length()
      获取文件长度
    • boolean canRead()
      判断文件是否可读,可读返回true
    • boolean canWrite()
      判断文件是否可写,可写返回true
    • boolean isHidden()
      判断文件是否隐藏,隐藏返回true

    示例如下:

    package file;
    
    import java.io.File;
    
    /**
     * File用来表示文件系统中的一个文件或目录
     * @author returnzc
     */
    public class FileDemo {
        public static void main(String[] args) {
            //访问当前项目目录下的demo.txt文件
            File file = new File("./demo.txt");
            
            //获取名字
            String name = file.getName();
            System.out.println(name);
            
            //获取长度(单位是字节)
            long len = file.length();
            System.out.println(len);
            
            boolean cr = file.canRead();
            boolean cw = file.canWrite();
            System.out.println("可读:" + cr);
            System.out.println("可写:" + cw);
            
            boolean ih = file.isHidden();
            System.out.println("是否隐藏:" + ih);
        }
    }
    

    运行结果:

    demo.txt
    18
    可读:true
    可写:true
    是否隐藏:false
    

    1.2 创建、删除文件

    判断文件或目录是否存在:

    • boolean exists()
      判断当前 File 表示的文件或目录是否已经存在,存在返回 true

    创建文件:

    • boolean createNewFile() throws IOException
      创建新文件,需要处理异常

    创建文件示例:

    package file;
    
    import java.io.File;
    import java.io.IOException;
    
    /**
     * 使用File创建一个文件
     * @author returnzc
     *
     */
    public class CreateNewFileDemo {
        public static void main(String[] args) throws IOException {
            //在当前目录下创建名为 test.txt 的文件
            File file = new File("./test.txt");
            
            if (!file.exists()) {
                /*
                 * 创建该文件
                 * 需要注意,创建的文件所在的目录必须存在,否则会抛出异常。
                 */
                file.createNewFile();
                System.out.println("文件已创建");
            } else {
                System.out.println("文件已存在");
            }
        }
    }
    

    删除文件、目录:

    • boolean delete()
      删除文件和目录。删除目录时只能删除空目录,非空目录需要挨个把所有子项都删掉才能删除。

    删除文件:

    package file;
    import java.io.File;
    /**
     * 删除一个文件
     * @author returnzc
     *
     */
    public class DeleteFileDemo {
        public static void main(String[] args) {
            /*
             * 将当前项目目录下的test.txt文件删除
             * 在相对路径中,"./"是可以忽略不写的,默认就是从当前目录开始的。
             */
            File file = new File("./test.txt");
            if (file.exists()) {
                file.delete();
                System.out.println("文件已删除");
            } else {
                System.out.println("文件不存在");
            }
        }
    }
    

    1.3 创建、删除目录

    创建目录:

    • boolean mkdir()
      创建目录,要求创建的目录所在的父目录必须存在
    • boolean mkdirs()
      创建多级目录,会将不存在的父目录一同创建出来

    创建目录:

    package file;
    import java.io.File;
    /**
     * 创建一个目录
     * @author returnzc
     *
     */
    public class MkDirDemo {
        public static void main(String[] args) {
            //在当前目录下创建一个名为 demo 的目录
            File dir = new File("demo");
            if (!dir.exists()) {
                //创建该目录
                dir.mkdir();
                System.out.println("目录已创建");
            } else {
                System.out.println("目录已存在");
            }
        }
    }
    

    创建多级目录:

    package file;
    import java.io.File;
    /**
     * 创建一个多级目录
     * @author returnzc
     *
     */
    public class MkDirsDemo {
        public static void main(String[] args) {
            //在当前目录下创建 a/b/c/d/e/f 目录
            File dir = new File("a/b/c/d/e/f");
            if (!dir.exists()) {
                //mkdir()方法要求创建的目录所在的父目录必须存在
                //mkdirs()方法则会将不存在的父目录一同创建出来
                dir.mkdirs();
                System.out.println("创建完毕!");
            } else {
                System.out.println("目录已存在!");
            }
        }
    }
    

    删除目录:

    package file;
    import java.io.File;
    /**
     * 删除目录
     * @author returnzc
     *
     */
    public class DeleteDirDemo {
        public static void main(String[] args) {
            //将当前目录下的demo目录删除
            File dir = new File("a");
            if (!dir.exists()) {
                //delete方法在删除目录时要求该目录必须是一个空目录
                dir.delete();
                System.out.println("目录已删除");
            } else {
                System.out.println("目录不存在");
            }
        }
    }
    

    1.4 其他操作

    • boolean isDirectory()
      判断是否为目录
    • boolean isFile()
      判断是否为文件
    • File[] listFiles()
      列出所有文件

    列出指定目录的所有文件:

    package file;
    
    import java.io.File;
    
    public class FileDemo {
        public static void main(String[] args) {
            File dir = new File(".");
    
            File[] subs = dir.listFiles();
            System.out.println(subs.length);
            for (int i = 0; i < subs.length; i++) {
                System.out.println(subs[i].getName());
            }
        }
    }
    

    运行结果:

    6
    .classpath
    .project
    .settings
    bin
    demo.txt
    src
    

    获取一个目录中的所有子项:

    package file;
    import java.io.File;
    /**
     * 获取一个目录中的所有子项
     * @author returnzc
     *
     */
    public class ListFilesDemo {
        public static void main(String[] args) {
            //获取当前目录中的所有子项
            File dir = new File(".");
            
            if (dir.isDirectory()) {
                File[] subs = dir.listFiles();
                for (int i = 0; i < subs.length; i++) {
                    System.out.println(subs[i].getName());
                }
            }
        }
    }
    

    删除文件或目录(递归调用):

    package file;
    import java.io.File;
    /**
     * 完成方法,实现将给定的File对象表示的文件或目录删除
     * @author returnzc
     *
     */
    public class DeleteTestDemo {
        public static void main(String[] args) {
            File dir = new File("a");
            delete(dir);
        }
    
        public static void delete(File f) {
            if (f.isDirectory()) {
                //先将该目录清空
                File[] subs = f.listFiles();
                for (int i = 0; i < subs.length; i++) {
                    File sub = subs[i];
                    //先删除当前子项
                    delete(sub);
                }
            }
            f.delete();
        }
    }
    

    1.5 文件过滤器

    重载的ListFiles方法允许我们传入一个文件过滤器(作为参数),然后将目录中满足过滤器要求的子项返回。

    文件过滤器是一个接口,如果用的话要实现类:

    class MyFilter implements FileFilter {
        public boolean accept(File file) {
            String name = file.getName();
            return name.startsWith(".");
        }
    }

    示例:

    package file;
    
    import java.io.File;
    import java.io.FileFilter;
    
    /**
     * 重载的ListFiles方法,允许我们传入一个文件过滤器
     * 然后将目录中满足过滤器要求的子项返回
     */
    public class FileDemo {
        public static void main(String[] args) {
            /*
             * 获取当前目录下所有文字以"."开头的子项
             */
            File dir = new File(".");
    
            /*
             * FileFilter 文件过滤器
             */
            MyFilter filter = new MyFilter();
            File[] subs = dir.listFiles(filter);
            System.out.println(subs.length);
            for (int i = 0; i < subs.length; i++) {
                System.out.println(subs[i].getName());
            }
        }
    }
    
    class MyFilter implements FileFilter {
        public boolean accept(File file) {
            String name = file.getName();
            System.out.println("正在过滤:" + name);
            return name.startsWith(".");
        }
    }
    

    运行结果:

    正在过滤:.classpath
    正在过滤:.project
    正在过滤:.settings
    正在过滤:bin
    正在过滤:demo.txt
    正在过滤:src
    3
    .classpath
    .project
    .settings
    

    可以用匿名内部类:

    /*
    * FileFilter 文件过滤器
    */
    FileFilter filter = new FileFilter() {
        public boolean accept(File file) {
            String name = file.getName();
            System.out.println("正在过滤:" + name);
            return name.startsWith(".");
        }
    };
    

    能少写就少写:

    File[] subs = dir.listFiles(new FileFilter() {
        public boolean accept(File file) {
            String name = file.getName();
            System.out.println("正在过滤:" + name);
            return name.startsWith(".");
        }
    });
    

    JDK8后有lambda表达式

    File[] subs = dir.listFiles((file)->{
            String name = file.getName();
            System.out.println("正在过滤:" + name);
            return name.startsWith(".");
        }
    });
    

    简化为:

    File[] subs = dir.listFiles(
        (file)->file.getName().startsWith(".")
    );
    

    2. RandomAccessFile

    3. 基本 IO 操作

    4. 文件数据 IO 操作

  • 相关阅读:
    C++ 小心你的析构函数不会执行
    sqlserver同步服务报错和链接服务器总结
    第37周星期5小结
    代码审核学到的两个delphi内存泄漏问题
    第36周星期四小结如何测试sql服务是否安装并正常运行
    第37周星期日
    第37周星期六几篇文摘
    第36周星期五小结
    第37周星期一小结
    2012年第37周星期三小结
  • 原文地址:https://www.cnblogs.com/ryyy/p/14227897.html
Copyright © 2020-2023  润新知