Java基础教程——File类、Paths类、Files类

File类

File类在java.io包中。io代表input和output,输入和输出。

代表与平台无关的文件和目录。
可以新建、删除、重命名,但不能访问文件内容。

File类里的常量:

import java.io.File;
public class TestFileConst {
    public static void main(String[] args) {
        String s = "";
        // 文件分隔符:win反斜杠(\)linux正斜杠(/)
        s = File.separator;
        System.out.println(s);
        // 路径分隔符:win分号(;)linux冒号(:)
        s = File.pathSeparator;
        System.out.println(s);
    }
}

File的构造方法里的参数——路径:
|--可以是文件,也可以是文件夹
|--可以是相对路径,也可以是绝对路径
|--可以存在,也可以不存在(只是把路径封装成File对象,而已)

import java.io.*;
/**
 * File类的基本方法
 */
public class T010File基本方法 {
    public static void main(String[] args) throws IOException {
        String userDir = System.getProperty("user.dir");
        System.out.println(userDir);
        File file = new File(userDir);
        System.out.println("是文件吗?" + file.isFile());
        System.out.println("是目录吗?" + file.isDirectory());
        System.out.println("文件多少字节?" + file.length());
        System.out.println("文件名【getName】" + file.getName());//文件夹返回0
        System.out.println("绝对路径【getAbsoluteFile】" + file.getAbsoluteFile());
        System.out.println("上层路径【getParent】" + file.getParent());
        System.out.println("=====临时文件=====");
        File fileTemp = File.createTempFile("tmp_", ".txt", file);
        System.out.println("临时文件:" + fileTemp.getAbsolutePath());
        System.out.println("临时文件【exists】:" + fileTemp.exists());
        System.out.println("JVM退出时删除临时文件");
        fileTemp.deleteOnExit();
    }
}

递归扫描文件夹

import java.io.*;
public class folderScanner {
    public static void main(String[] args) {
        try {
            getFiles("C:\\Program Files\\Java");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    private static void getFiles(String path_src) throws IOException {
        File pathS_Files = new File(path_src);
        if (!pathS_Files.isDirectory()) {
            System.out.println("输入的文件夹路径有误!");
            return;
        }
        File[] listFiles = pathS_Files.listFiles();
        for (int i = 0; i < listFiles.length; i++) {
            File f1 = listFiles[i];
            if (f1.isDirectory()) {
                // 如果是文件夹,继续往下找
                getFiles(f1.getAbsolutePath());
            } else if (f1.isFile()) {
                System.out.println(f1.getAbsolutePath());
            }
        }
    }
}

升级:过滤文件

public File[] listFiles(FileFilter filter)方法,可以过滤获取到的文件,需要实现FileFilter接口。

下面示例大部分代码和上例一样,只是加入了FileFilter,

import java.io.*;
/**
 * ↓↓↓用于抽象路径名(即File对象)的过滤器。
 */
class MyFileFilter implements FileFilter {
    @Override
    // accept:过滤文件的方法
    // 参数:遍历目录得到的每一个文件(File对象)
    public boolean accept(File pathname) {
        if (pathname.isDirectory()) {
            // 是文件夹,放行
            return true;
        } else if (pathname.getName().toLowerCase().endsWith(".txt")) {
            // 是匹配的文件,放行
            return true;
        } else {
            // 其它文件,过滤掉
            return false;
        }
    }
}
public class folderScanner {
    public static void main(String[] args) {
        try {
            getFiles("C:\\Program Files\\Java");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    private static void getFiles(String path_src) throws IOException {
        File pathS_Files = new File(path_src);
        if (!pathS_Files.isDirectory()) {
            System.out.println("输入的文件夹路径有误!");
            return;
        }
        // ↓↓↓
        // 本例核心代码:两个版本(其实还能写个匿名内部类版本)
        // File[] listFiles = pathS_Files.listFiles(new MyFileFilter());
        // * FileFilter接口只有一个方法,于是可以采用Lambda表达式写法:
        File[] listFiles = pathS_Files.listFiles((pathname) -> {
            if (pathname.isDirectory()) {
                // 是文件夹,放行
                return true;
            } else if (pathname.getName().toLowerCase().endsWith(".txt")) {
                // 是匹配的文件,放行
                return true;
            } else {
                // 其它文件,过滤掉
                return false;
            }
        });
        // ↑↑↑
        for (int i = 0; i < listFiles.length; i++) {
            File f1 = listFiles[i];
            if (f1.isDirectory()) {
                // 如果是文件夹,继续往下找
                getFiles(f1.getAbsolutePath());
            } else if (f1.isFile()) {
                System.out.println(f1.getAbsolutePath());
            }
        }
    }
}

练习:在控制台输入路径,扫描该文件夹,并统计一共有多少个文件、多少个文件夹、多少个java代码文件。

创建和删除相关

package day0422;
import java.io.File;
import java.io.IOException;
public class TestNewFile {
    public static void main(String[] args) {
        File f = new File("2.txt");
        try {
            // 创建新文件,成功为true,不覆盖
            // 文件夹必须存在,否则抛异常
            boolean create = f.createNewFile();
            System.out.println(create);
        } catch (IOException e) {
            e.printStackTrace();
        }
        // ----------------------------
        // 创建单层文件夹
        f = new File("2");
        boolean mkdir = f.mkdir();
        System.out.println(mkdir);
        // 创建多层文件夹(“4.txt”作为文件夹名而创建)
        f = new File("2\\3\\4.txt");
        boolean mkdirs = f.mkdirs();
        System.out.println(mkdirs);
        // 删除文件或文件夹(最后一层)
        // |--最后一层文件夹中有内容,不删,返回false
        // |--路径不存在,返回false
        // |--不走回收站
        boolean delete = f.delete();
        System.out.println(delete);
    }
}

应用:创建文件,若有同名文件,删之。

import java.io.*;
public class T011File无则建有则删 {
    public static void main(String[] args) {
        File f1 = new File("tmp_File有则删.txt");
        if (f1.exists()) {
            boolean delete = f1.delete();
            System.out.println("删除同名文件:" + delete);
        }
        try {
            boolean ret = f1.createNewFile();
            System.out.println("创建文件:" + ret);
        } catch (IOException e1) {
            e1.printStackTrace();
        }
    }
}

Java 7的nio.file包

Paths类

和File类比较像

import java.nio.file.Path;
import java.nio.file.Paths;
public class T031nioPaths {
    public static void main(String[] args) throws Exception {
        String _user_dir = System.getProperty("user.dir");
        // 获取Path对象
        Path _path = Paths.get(_user_dir);
        System.out.println(".toAbsolutePath()【】" + _path.toAbsolutePath());
        // 根路径
        System.out.println(".getRoot()【】" + _path.getRoot());
        // 包含的路径(不含根路径)
        int nameCount = _path.getNameCount();
        for (int i = 0; i < nameCount; i++) {
            System.out.println("\t" + _path.getName(i));
        }
        System.out.println(".getNameCount()包含的路径数量【】" + nameCount);
        // 以多个String来构建Path对象
        Path path2 = Paths.get("g:", "publish", "codes");
        System.out.println(path2);
    }
}

Files类

import java.io.FileOutputStream;
import java.io.OutputStream;
import java.nio.charset.*;
import java.nio.file.FileStore;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.List;
public class T032nioFiles {
    public static void main(String[] args) throws Exception {
        System.out.println("=====Files.copy:复制文件=====");
        Path _path源文件 = Paths.get("testRead.dat");
        OutputStream os = new FileOutputStream("Files.copy.txt");// 工作路径下
        long copy = Files.copy(_path源文件, os);
        System.out.println("Files.copy() return value = " + copy);
        System.out.println("Files.size(源文件):" + Files.size(_path源文件));
        System.out.println("=====Files.readAllLines:读文件=====");
        List<String> lines = Files.readAllLines(_path源文件, Charset.forName("utf-8"));
        System.out.println("Files.readAllLines()读到的行数——" + lines.size());
        System.out.println("=====Files.write:写文件=====");
        List<String> _list = new ArrayList<>();
        _list.add("我西牛贺洲者,不贪不杀,养气潜灵,虽无上真,人人固寿;");
        _list.add("但那南赡部洲者,贪淫乐祸,多杀多夺,正所谓口舌凶场,是非恶海。");
        Path _pathW = Files.write(Paths.get("Files.write.txt"), _list, Charset.forName("gbk"));
        System.out.println("写入文件——" + _pathW.toAbsolutePath());
        System.out.println("=====FileStore:查看C盘空间=====");
        FileStore cStore = Files.getFileStore(Paths.get("C:"));
        System.out.println("C:共有空间:" + cStore.getTotalSpace());
        System.out.println("C:可用空间:" + cStore.getUsableSpace());
        // -------------------------------------
        System.out.println("=====使用Java 8的Stream API列出当前目录下所有文件和子目录=====");
        Files.list(Paths.get(".")).forEach(path -> System.out.println(path));
        // -------------------------------------
        System.out.println("=====使用Java 8的Stream API读取文件内容=====");
        Files.lines(_path源文件, Charset.forName("utf-8")).forEach(line -> System.out.print(line));
    }
}

原文地址:https://www.cnblogs.com/tigerlion/p/11179220.html

时间: 2024-10-04 01:13:38

Java基础教程——File类、Paths类、Files类的相关文章

Java基础之File类的使用

Java基础之File类的使用 1.File类的构造方法和常用方法 2.对File中listFile(FileNameFilter name)学习 3.与File文件类相关的实现 File类的构造方法和常用方法: 在Java中File类在IO流中被频繁使用,可以使用一个文件路径来表示在特定位置上的文件,但是需要注意的是这个路径只表示一个文件抽象的概念, 文件到底在不在这个路径下是不确定,换句话说,是不能通过文件路径来判断文件是否存在. 构造方法 File(File parent, String 

1.27 Java基础总结 ①访问修饰符访问权限②类和方法的基本声明和使用1.27 Java基础总结 ①访问修饰符访问权限②类和方法的基本声明和使用

1.27 Java基础总结 ①访问修饰符访问权限②类和方法的基本声明和使用 成员变量(属性)①类中添加成员变量 访问修饰符 类型 变量名 private String name ②实例化对象调用类的构造方法类构造对象,Teacher one = new Teacher(): 有static的可以直接调用,因为static是类级别的 ③JavaBean里边一般规则应该有公共的无参构造应该有符合命名规范的get/set方法 ④对象的回收:没有任何引用指向该对象时,GC会回收 主动回收:对象 = nu

Xamarin.FormsShell基础教程(9)Shell相关类体系

Xamarin.FormsShell基础教程(9)Shell相关类体系 在Shell中,最为主要的类是Shell类.Shell类实现了大多数应用程序所需的基本UI功能的页面.除此以外,常用的类还有ShellContent.Tab.FlyoutItem.MenuItem以及SearchHandler.以下是对这些类的介绍. ShellContent:应用程序的内容页,图1.2和图1.3中的中间内容就是使用该类实现的. Tab:标签,一般使用在标签栏和侧滑菜单中.图1.2和图1.3中标签栏中的标签就

Java基础(十一) Stream I/O and Files

Java基础(十一) Stream I/O and Files 1. 流的概念 程序的主要任务是操纵数据.在Java中,把一组有序的数据序列称为流.根据操作的方向,可以把流分为输入流和输出流两种.程序从输入流读取数据,向输出流写出数据. 文件 输入流 输出流 文件 内存 -------------> Java程序 ------------------> 内存 键盘 控制台 | | 数据源 数据目的地 Java I/O系统负责处理程序的输入和输出,I/O类库位于java.io包中,它对各种常见的

Java基础教程:JDBC编程

Java基础教程:JDBC编程 快速开始 什么是JDBC JDBC 指 Java 数据库连接,是一种标准Java应用编程接口( JAVA API),用来连接 Java 编程语言和广泛的数据库. JDBC API 库包含下面提到的每个任务,都是与数据库相关的常用用法. 制作到数据库的连接. 创建 SQL 或 MySQL 语句. 执行 SQL 或 MySQL 查询数据库. 查看和修改所产生的记录. 从根本上来说,JDBC 是一种规范,它提供了一套完整的接口,允许便携式访问到底层数据库,因此可以用 J

Java基础教程 - 组合

1. 什么是组合? 如果一个类的对象和另一个类满足"has-a"关系的话,我们就可以在一个类中,把另一个类的对象作为其对象成员. 什么是"has-a"关系,举个例子:现在有一个类LapTop.class,还有一个是Moniter.class.好显然,Laptop "has-a" Moniter,也就是说,他们是满足"has-a"关系的.这时候,我们就可以把Moniter作为Laptop的一个数据成员. class Laptop

Java基础教程:面向对象编程

Java基础教程:面向对象编程 Java语言概述 Java语言特点 1.Java为纯面向对象的语言,它能够直接反映现实生活中的对象.总之,Everything is object! 2.平台无关性.Java为解释型语言,编译器会把Java代码变成"""中间代码",然后在JVM上解释执行. 3.Java提供了很多内置的类库,这些类库简化了开发人员的程序设计工作,同时缩短了项目开发时间. 4.Java语言提供了对Web应用的支持. 5.Java语言提供了较好的安全性和健

Java基础教程:面向对象编程[2]

Java基础教程:面向对象编程[2] 三大特性 封装 封装(英语:Encapsulation)是指一种将抽象性函式接口的实现细节部份包装.隐藏起来的方法.封装可以被认为是一个保护屏障,防止该类的代码和数据被外部类定义的代码随机访问. 使用封装我们可以对成员变量进行更精确的控制,同时隐藏信息,实现细节等. 方法: public class Person{ private String name; private int age; ? public int getAge(){ return age;

Java基础教程:多线程基础(2)——线程间的通信

Java基础教程:多线程基础(2)--线程间的通信 使线程间进行通信后,系统之间的交互性会更强大,在大大提高CPU利用率的同时还会使程序员对各线程任务在处理的过程中进行有效的把控与监督. 线程间的通信 思维导图 等待中 等待/通知机制 不使用等待/通知机制 我们可以使用使用sleep()与 whle(true) 死循环来实现多个线程间的通信. 虽然两个线程实现了通信,但是线程B必须不断的通过while语句轮训机制来检测某一个条件,这样会浪费CPU资源. 如果轮询间隔较小,更浪费时间间隔.如果轮训