IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> Java-IO File -> 正文阅读

[Java知识库]Java-IO File

Java-IO File学习

File对象

java 的标准库 java.io 提供了 File 对象来操作文件和目录。
构建 File 对象,需要传入一个路径,可以是绝对路径,也可以是相对路径。

package io;

import java.io.File;

public class FileDemo {
    public static void main(String[] args) throws IOException {
        // Windows平台使用 \\ 代表 \
        File winFile = new File("D:\\mydemo\\test.text");
        System.out.println(winFile);

        // Linux平台使用 / 作为路径分隔符
        // 可以用.表示当前目录,..表示上级目录
        File linuxFile = new File("../src/js");
        System.out.println(linuxFile);
    }
}

输出:

D:\mydemo\test.text
../src/js

构建 File 对象时,即使传入的文件或目录不存在,代码也不会报错,因为构造时并不会导致磁盘操作。当在调用 File 对象的一些方法时,才开始进行磁盘操作。

File对象有3种形式表现的路径。

  • getPath() :返回构造方法传入的路径,该路径可能是相对的,也可能不是相对的。
  • getAbsolutePath():返回绝对路径。
  • getCanonicalPath:返回规范路径,规范路径就是把.和…转换成标准的绝对路径后的路径,这是文件的唯一绝对路径。

注意:可能有大量指向同一文件的绝对路径,但只有一个规范路径。

package io;

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

public class FileDemo {
    public static void main(String[] args) throws IOException {
        File linuxFile = new File("../src/js");

        // File表示路径的形式
        System.out.println(linuxFile.getPath());
        System.out.println(linuxFile.getAbsolutePath());
        System.out.println(linuxFile.getCanonicalPath());
        System.out.println(File.separator); // 根据当前平台打印"\"或"/"
    }
}

输出:

../src/js
/Users/xxdemo/IdeaProjects/LearnJava/../src/js
/Users/xxdemo/IdeaProjects/src/js
/

文件和目录

1. 创建文件或目录

package io;

import java.io.File;

public class FileDemo {
    public static void main(String[] args) throws IOException {
        // 创建一个文件
        File newFile = new File("../test.txt");
        // 如果创建成功,则返回ture,如果文件已经存在则返回false
        boolean fvar = newFile.createNewFile();
        if (fvar){
            System.out.println("created successfully");
        }
        else {
            System.out.println("already exist");
        }
    }
}

在程序需要使用临时文件时,File对象可以创建临时文件:

package io;

import java.io.File;

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

和文件操作类似,File对象如果表示一个目录,可以通过以下方法创建目录:

  • boolean mkdir():创建当前File对象表示的目录;
  • boolean mkdirs():创建当前File对象表示的目录,并在必要时将不存在的父目录也创建出来;
package io;

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

public class FileDemo {
    public static void main(String[] args) throws IOException {
        // 创建一个目录
        File newDir = new File("/tmp/test");
        boolean flag = newDir.mkdirs();
        if (flag){
            System.out.println("created successfully");
        }
        else {
            System.out.println("error");
        }
    }
}

2. 判断文件或目录

调用isFile(),判断该File对象是否是一个已存在的文件;
调用isDirectory(),判断该File对象是否是一个已存在的目录。

用File对象获取到一个文件时,还可以进一步判断文件的权限和大小:

  • boolean canRead():是否可读;
  • boolean canWrite():是否可写;
  • boolean canExecute():是否可执行;
  • long length():文件字节大小。
    对目录而言,是否可执行表示能否列出它包含的文件和子目录。

3. 删除文件和目录

package io;

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

public class FileDemo {
    public static void main(String[] args) throws IOException {
        // 创建一个文件
        File newFile = new File("../test.txt");
        // 如果创建成功,则删除
        if ( newFile.createNewFile()){
            boolean dvar = newFile.delete();
            if (dvar){
                System.out.println("deleted successfully");
            }
        }
    }
}

删除目录:

  • boolean delete():删除当前File对象表示的目录,当前目录必须为空才能删除成功。

4. 遍历文件和目录

package io;

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

public class FileDemo {
    public static void main(String[] args) throws IOException {
        String dirname = "/Users/xxs/Documents";
        File f = new File(dirname);

        if (f.isDirectory()){
            System.out.println("directory: " + dirname);
            String s[] = f.list();
            for (String value : s) {
                File nf = new File(dirname + "/" + value);
                if (nf.isDirectory()) {
                    System.out.println("directory: " + value);
                } else {
                    System.out.println("file: " + value);
                }
            }
        } else {
            System.out.println("file: " + dirname);
        }
    }
}

当File对象表示一个目录时,可以使用 list() 和 listFiles() 列出目录下的文件和子目录名。
listFiles()提供了一系列重载方法,可以过滤不想要的文件和目录:

package io;

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

public class FileDemo {
    public static void main(String[] args) throws IOException {
        String dirname = "/Users/xxs/Documents";
        File f = new File(dirname);
        File[] fs = f.listFiles(); //列出所有文件和子目录
        
        printFiles(fs);
        File[] fs2 = f.listFiles(new FilenameFilter() {
            public boolean accept(File dir, String name){
                return name.endsWith(".xml"); // 返回true表示接受该文件
            }
        });
        printFiles(fs2);
    }
    
    static void printFiles(File[] files) {
        System.out.println("==========");
        if (files != null) {
            for (File f : files) {
                System.out.println(f);
            }
        }
        System.out.println("==========");
    }
}

运行结果:

==========
/Users/xxs/Documents/.rqd
/Users/xxs/Documents/.DS_Store
/Users/xxs/Documents/FlipClock.saver
/Users/xxs/Documents/appium_log
/Users/xxs/Documents/av_report_config.xml
/Users/xxs/Documents/com_tencent_imsdk_data
/Users/xxs/Documents/AirCloud
/Users/xxs/Documents/av_config.xml
==========
==========
/Users/xxs/Documents/av_report_config.xml
/Users/xxs/Documents/av_config.xml
==========

5.拓展

上面2个遍历中,使用了list()和listFiles()和两个方法,这里说下他们的区别。

  • list(): 会返回一个String类型数组,仅仅是把指定路径下的文件或文件夹名字存储到数组中。
  • listFiles(): 返回的是File类型的对象,所以具有其全部的属性和方法。有以下两种重载方式:
    String[] list()
    String[] list(FilenameFilter filter)

下面说下String[] list(FilenameFilter filter)和其匿名类的用法。

FilenameFilter filter是一个目录过滤器。list(FilenameFilter filter)方法会选择符合条件的文件或文件夹。

查看源码如下:

 public String[] list(FilenameFilter filter) {
        String names[] = normalizedList(); //获取到指定目录下的所有文件(或目录)名字,并转化为标准格式
        if ((names == null) || (filter == null)) { //没有过滤条件时直接返回
            return names;
        }
        List<String> v = new ArrayList<>();
        for (int i = 0 ; i < names.length ; i++) {
            if (filter.accept(this, names[i])) { //如果accept() 方法返回真,则添加到新的ArrayList v中
                v.add(names[i]);
            }
        }
        return v.toArray(new String[v.size()]); //ArrayList转换成String[]类型返回
    }

可以看出, list(FilenameFilter filter)方法保存的是那些能够使filter.accept()方法返回true的文件名。

现在需要知道 filter.accept() 可以看出是 FilenameFilter 中的方法,查看源码如下:

public interface FilenameFilter {
    /**
     * Tests if a specified file should be included in a file list.
     *
     * @param   dir    the directory in which the file was found.
     * @param   name   the name of the file.
     * @return  <code>true</code> if and only if the name should be
     * included in the file list; <code>false</code> otherwise.
     */
    boolean accept(File dir, String name);
}

从这可以看出,FilenameFilter 是一个接口,使用 list(FilenameFilter filter) 方法就必须实现FilenameFilter接口,accept方法由我们自己定义。

参考文章:
https://blog.csdn.net/lj_pyt/article/details/44830761
https://www.liaoxuefeng.com/wiki/1252599548343744/1298069154955297
https://www.runoob.com/java/java-files-io.html

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-03-30 18:09:58  更:2022-03-30 18:11:35 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 6:27:02-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码