JavaIO操作-File

1、File类

1.1 File类说明

存储在变量,数组和对象中的数据是暂时的,当程序终止时他们就会丢失.为了能够永

久的保存程序中创建的数据,需要将他们存储到硬盘或光盘的文件中.这些文件可以移动,传送,亦可以被其他程序使用.由于数据存储在文件中,所以我们需要学习一个和文件有密切关系的类,叫做File类,将要掌握获取文件的属性以及删除和重命名文件.最终如何向文件中写入数据和从文件中读取数据.

那么File类关心的是在磁盘上文件的存储.

File类描述的是一个文件或文件夹。(文件夹也可以称为目录)

该类的出现是对文件系统的中的文件以及文件夹进行对象的封装。可以通过对象的思想来操作文件以及文件夹。

   可以用面向对象的处理问题,通过该对象的方法,可以得到文件或文件夹的信息方便了对文件与文件夹的属性信息进行操作。

   文件包含很多的信息:如文件名、创建修改时间、大小、可读可写属性等。

1.2 体验File类

检验指定路径下是否存在指定的目录或者文件.

// 检验指定路径下是否存在指定的目录或者文件.

        File file = new File("c:\\a.txt");

        System.out.println(file.exists());

// File对象是否是目录

        System.out.println(file.isDirectory());

// 对象是否是文件

        System.out.println(file.isFile());

结论:File对象也可以表示不存在的文件。其实代表了一个抽象路径

构建一个File类的实例并不会在机器上创建一个文件.不管文件是否存在都可以创建任意文件名的File实例,可以调用File实例的exists方法判断文件或目录是否存在

1.3 构造一个File类实例:

new File(String pathname);

       通过将给定路径来创建一个新File实例。

new File(String parent, String child);

       根据parent路径名字符串和child路径名创建一个新File实例。

         parent是指上级目录的路径,完整的路径为parent+child.

new File(File parent, String child);

       根据parent抽象路径名和child路径名创建一个新File实例。

       parent是指上级目录的路径,完整的路径为parent.getPath()+child.

说明:

      如果指定的路径不存在(没有这个文件或是文件夹),不会抛异常,这时file.exists()返回false。

   新建File对象File file=new File();

public static void main(String[] args) {

        File file = new File();

    }

1:创建File对象需要导包, import java.io.File

2:File对象没有无参数构造.创建对象需要传参.

   根据API文档提示,传入一个文件的字符串路径. String path="c:/a.txt";

(a.txt 文件在c盘下已经存在)

//file 是一个文件对象

        String path = "c:/a.txt";

        File file = new File(path);

File类的对象,既可以代表文件也可以代表文件夹。

public static void main(String[] args) {

        //file 是一个文件夹

        String path = "c:/test";

        File file = new File(path);

    }

1.4 路径

   路径就是文件或文件夹所在的位置。

      1. 路径分割符:

   上下级文件夹之间使用分隔符分开:

   在Windows中分隔符为'\',在Unix/Linux中分隔符为'/'。

跨平台的目录分隔符

   更专业的做法是使用File.separatorChar,这个值就会根据系统得到的相应的分割符。

例:new File("c:" + File.separatorChar + "a.txt");

注意,如果是使用"\",则需要进行转义,写为"\\"才可以,如果是两个"\",则写为"\\\\"。

实验:

在以下代码的path处写不同的路径试一下,并观察输出结果。

         File file = new File(path);

         System.out.println(file.getAbsolutePath());

      1. 绝对路径与相对路径:

对于UNIX平台,绝对路径名的前缀是"/"。相对路径名没有前缀。

对于Windows平台,绝对路径名的前缀由驱动器号和一个":"组成,例"c:\\..."。相对路径没有盘符前缀。

相对路径:

   相对路径是指相对于某位置的路径,是指相对于当前目录。

   在执行Java程序时,相对路径为执行java命令时当前所在的目录。

实验:

在不同的路径下执行java命令运行以下程序,并观察输出结果。

      File file = new File("a.txt");

      System.out.println(file.getAbsolutePath());

一般在使用时,建议用绝对路径,因为相对路径容易出问题,不好确定到底在什么地方。

//相对路径

//File file = new File("src/a.txt");

1.5 File类中常用的方法:

   创建:

   createNewFile()  在指定位置创建一个空文件,成功就返回true,如果已存在就不创建然后返回false

      mkdir()         在指定位置创建目录,这只会创建最后一级目录,如果上级目录不存在就抛异常。

      mkdirs()     在指定位置创建目录,这会创建路径中所有不存在的目录。

      renameTo(File dest) 重命名文件或文件夹,也可以操作非空的文件夹,文件不同时相当于文件的剪切。移动/重命名成功则返回true,失败则返回false。

   删除:

delete()     删除文件或一个空文件夹,如果是文件夹且不为空,则不能删除,成功返回true,失败返回false。

      deleteOnExit()   在虚拟机终止时,请求删除此抽象路径名表示的文件或目录,保证程序异常时创建的临时文件也可以被删除

判断:

exists()     文件或文件夹是否存在。

      isFile()     是否是一个文件,如果不存在,则始终为false。

      isDirectory() 是否是一个目录,如果不存在,则始终为false。

      isHidden()      是否是一个隐藏的文件或是否是隐藏的目录。

      isAbsolute() 测试此抽象路径名是否为绝对路径名。

获取:

getName()    获取文件或文件夹的名称,不包含上级路径。

getPath()       将此抽象路径名转换为一个路径名字符串。

getAbsolutePath()   获取文件的绝对路径,与文件是否存在没关系

length()     获取文件的大小(字节数),如果文件不存在则返回0L,如果是文件夹也返回0L。

getParent()     返回此抽象路径名父目录的路径名字符串;如果此路径名没有指定父目录,则返回null。

lastModified()   获取最后一次被修改的时间。

   文件夹相关:

staic File[] listRoots()   列出所有的根目录(Window中就是所有系统的盘符)

list()                返回目录下的文件或者目录名,包含隐藏文件。对于文件这样操作会返回null。

list(FilenameFilter filter)   返回指定当前目录中符合过滤条件的子文件或子目录。对于文件这样操作会返回null。

listFiles()              返回目录下的文件或者目录对象(File类实例),包含隐藏文件。对于文件这样操作会返回null。

listFiles(FilenameFilter filter) 返回指定当前目录中符合过滤条件的子文件或子目录。对于文件这样操作会返回null。

1.6 案例

   1,列出指定目录中所有的子文件名与所有的子目录名。

   2,列出指定目录中所有的子文件名与所有的子目录名,要求目录名与文件名分开列出,格式如下:

      子目录:

         ...

         ...

      子文件:

         ...

         ...

   3,列出指定目录中所有扩展名为.java的文件。

   4,列出指定目录中所有扩展名为.class的文件。

   5,思考第3与第4题,代码是不是重复呢,如果想要列出其中的所有.txt文件,是不是要再写一个类呢?

      a, 请自行设计一个工具方法,可以传递指定的扩展名,工具方法会过列出指定目录中指定扩展名的所有子文件与子文件夹。

      b, 请利用FilenameFilter接口写一个工具类,可以传递指定的过滤规则。

      1. 练习一

解题: 列出指定目录中所有的子文件名与所有的子目录名。

需求1:获取所有的c:/test 即test目录下的所有文件和文件夹

解题思路:

   代码需要封装,就需要创建方法,并在main方法中调用和测试. 方法名要有意义: listAllFilesAndDirs

第一步:创建File对象

   第二步:查找File类中可用的方法,想要获取该目录下的所有子文件和子目录

    第三步:显示这些文件和文件夹的名称

实现:

/**

     * 列出指定目录中所有包含的子文件与子目录

     */

    public static void listAllFilesAndDirs(String path) {

        // 1.创建File对象,表示这个目录

        File dir = new File(path);

        // 2.通过list方法得到所包含的所有子目录与子文件名称

        String[] names = dir.list();

        // 3显示这些名称

        for (int i = 0; i < names.length; i++) {

            System.out.println(names[i]);

        }

    }

      1. 练习二

列出指定目录中所有的子文件名与所有的子目录名,要求目录名与文件名分开列出

解题: 列出指定目录中所有的子文件名与所有的子目录名,要求目录名与文件名分开列出

案例1把文件和文件夹都列了出来,但是无法区分文件和文件夹.File类有判断文件和文件夹的方法,但是list方法返回的是String数组,这个list() 方法无法满足我们的需求.继续查找File的方法.查看api找到 File[] listFiles()  发现该方法返回的是一个File数组。

思路:

第一步:创建listAllFilesAndDirs(String path)方法,接受路径

第二步: 创建File对象表示这个目录

第三步: 通过listFiles方法得到所包含的所有子目录与子文件名称

第四步: 得到所有的文件名集合,与所有的文件夹名集合

第五步: 分别显示文件名与文件夹名

实现

public static void listAllFilesAndDirs2(String path) {

        // 1.创建File对象,表示这个目录

        File dir = new File(path);

        // 2通过listFiles方法得到所包含的所有子目录与子文件名称

        File[] names = dir.listFiles();

        // 3,分别显示文件名与文件夹名

        for (int i = 0; i < names.length; i++) {

            File file = names[i];

            if (file.isFile()) {

                System.out.println(("子文件:"));

                System.out.println("\t" + file.getName());

            } else if (file.isDirectory()) {

                System.out.println(("子目录:"));

                System.out.println("\t" + file.getName());

            }

        }

    }

实现二:

public static void listAllFilesAndDirs(String path) {

        //1创建File对象表示这个目录

        File dir = new File(path);

       

        //2通过listFiles方法得到所包含的所有子目录与子文件名称

        File[] names = dir.listFiles();

       

        //3,得到所有的文件名集合,与所有的文件夹名集合

        List<File> filesList = new ArrayList<File>();

        List<File> dirsList = new ArrayList<File>();

        for (int i = 0; i < names.length; i++) {

            File file = names[i];

            if (file.isFile()) {

                filesList.add(file);

            } else if (file.isDirectory()) {

                dirsList.add(file);

            }

        }

        //4,分别显示文件名与文件夹名

        System.out.println("子文件:");

        for (int i = 0; i < filesList.size(); i++) {

            System.out.println("\t" + filesList.get(i).getName());

        }

        System.out.println("子目录:");

        for (int i = 0; i < dirsList.size(); i++) {

            System.out.println("\t" + dirsList.get(i).getName());

        }

    }

      1. 练习三

列出指定目录中所有扩展名为.java的文件。

需求: 从指定目录中找到指定扩展名的文件,并列出来

思路

第一步: 创建listAllFiles方法,接受路径和文件后缀名

第二步: 获取所有的子文件和子文件夹

第三步: 从中找出符合条件的文件并显示出来

注意:不同系统对于路径的 windows系统使用斜线作为路径分隔符 "\" linux 系统使用反斜线作为路径分隔符"/"java是跨平台的语言,java程序如果部署到linux系统上,如果程序中有File对象, 可以使用File类separatorChar (字段)

public class FileTest2 {

    public static void main(String[] args) {

        String path = "c:" + File.separatorChar + "test";

        File file = new File(path);

        listtAllFiles(file, "java");

    }

    /**

     * 从指定目录中找到指定扩展名的文件,并列出来

     *

     */

    public static void listtAllFiles(File dir, String extension) {

        // 1.获取所有的子文件和子文件夹

        File[] files = dir.listFiles();

        // 2.从中找出符合条件的文件并显示出来

        for (int i = 0; i < files.length; i++) {

            File file = files[i];

            // 3.需要以指定文件后缀结尾才算符合条件

            if (file.getName().endsWith(extension)) {

                System.out.println(file.getName());

            }

        }

    }

}

      1. 练习四

列出指定目录中所有扩展名为.class的文件。

public class FileTest2 {

    public static void main(String[] args) {

        String path = "c:" + File.separatorChar + "test";

        File file = new File(path);

        listtAllFiles2(file, "txt");

    }

    /**

     * FilenameFilter接口写一个工具类,可以传递指定的过滤规则。

     *  从指定目录中找到指定扩展名的文件,并列出来

     *

     * */

    public static void listtAllFiles2(File dir, String name) {

        // 1.获取所有的子文件和子文件夹

        String[] files = dir.list(new DirFilter("txt"));

        // 2显示名称

        for (int i = 0; i < files.length; i++) {

            System.out.println(files[i]);

        }

    }

}

class DirFilter implements FilenameFilter {

    private String extension;

    public DirFilter() {

    }

    public DirFilter(String extension) {

        this.extension = extension;

    }

    @Override

    public boolean accept(File dir, String name) {

        return name.endsWith(extension);

    }

}

注意: DirFilter 就是实现了accept 方法.提供给File类的list方法使用.

2、 IO流体验与简介

File对象可以表示存在的文件或文件夹,也可以表示不存在的。

我们想要得到文件的内容怎么办,File只是操作文件,文件的内容如何处理就需要使用io流技术了。

例如在C盘下有一个名称为a.txt的文本文件.想要通过Java程序读出来文件中的内容,需要使用IO流技术.同样想要将程序中的数据,保存到硬盘的文件中,也需要IO流技术.

读和写文件文件示例:

public class IoTest {

    public static void main(String[] args) throws FileNotFoundException,

            IOException {

        writFileTest();

        readFileTest();

    }

    private static void writFileTest() throws FileNotFoundException,

            IOException {

        // 创建文件对象

        File file = new File("c:\\a.txt");

        // 创建文件输出流

        FileOutputStream fos = new FileOutputStream(file);

        fos.write('g');

        fos.write('z');

        fos.write('i');

        fos.write('t');

        fos.write('c');

        fos.write('a');

        fos.write('s');

        fos.write('t');

        fos.close();

    }

    private static void readFileTest() throws FileNotFoundException,

            IOException {

        // 创建文件对象

        File file = new File("c:\\a.txt");

        // 创建文件输入流

        FileInputStream fis = new FileInputStream(file);

        // 有多长,就读多少字节。

        for (int i = 0; i < file.length(); i++) {

            System.out.print((char) fis.read());

        }

        fis.close();

    }

}

IO流简介:(Input/Output)

   Java对设备中数据的操作是通过IO流的方式。IO流用来处理设备之间的数据传输。设备是指硬盘、内存、键盘录入、网络等。

   Java用于操作流的对象都在IO包中。IO流技术主要用来处理设备之间的数据传输。

   由于Java用于操作流的对象都在IO包中。所以使用IO流需要导包如:import java.io.*;

IO流的分类

   流按操作数据类型的不同分为两种:字节流与字符流。

   流按流向分为:输入流,输出流(以程序为参照物,输入到程序,或是从程序输出)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/824399.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

openharmony 编译源码及docker相关操作

目录 一、环境搭建: 二、编译链下载及相关配置 三、编译及版本烧录 一、环境搭建: 1、拉取docker镜像,openharmony。默认版本为ubuntu 18.04

DDoS攻击愈演愈烈,谈如何做好DDoS防御

DDoS攻击是目前最常见的网络攻击方式之一&#xff0c;各种规模的企业包括组织机构都在受其影响。对于未受保护的企业来讲&#xff0c;每次DDoS攻击的平均成本为20万美元。可见&#xff0c;我们显然需要开展更多的DDoS防御工作。除考虑如何规避已发生的攻击外&#xff0c;更重要…

【LeetCode热题100】【动态规划】零钱兑换

题目链接&#xff1a;322. 零钱兑换 - 力扣&#xff08;LeetCode&#xff09; 要拿硬币凑钱&#xff0c;硬币无限多&#xff0c;就是完全背包问题&#xff0c;定义dp[i]是要凑的钱i的硬币数&#xff0c;对于当前硬币来说&#xff0c;如果选择了这个硬币&#xff0c;要么要凑的…

【机器学习300问】72、神经网络的隐藏层数量和各层神经元节点数如何影响模型的表现?

评估深度学习的模型的性能依旧可以用偏差和方差来衡量。它们反映了模型在预测过程中与理想情况的偏离程度&#xff0c;以及模型对数据扰动的敏感性。我们简单回顾一下什么是模型的偏差和方差&#xff1f; 一、深度学习模型的偏差和方差 偏差&#xff1a;衡量模型预测结果的期望…

K8s的亲和、反亲和、污点、容忍

1 亲和与反亲和 亲和性的原理其实很简单&#xff0c;主要利用label标签结合nodeSelector选择器来实现 1.1 Pod和Node 从pod出发&#xff0c;可以分成亲和性和反亲和性&#xff0c;分别对应podAffinity和podAntiAffinity。从node出发&#xff0c;也可以分成亲和性和反亲和性&…

优雅的CPP——结构化绑定

C17 引入了结构化绑定&#xff08;Structured Binding&#xff09;这一强大的特性&#xff0c;它提供了一种简洁的语法&#xff0c;用于从容器、元组、数组等数据结构中解包并绑定其元素到多个变量中。结构化绑定不仅可以提高代码的可读性和简洁性&#xff0c;还能使代码更加灵…

Hbase的shell命令(详细)

一、help 1.help 显示命名的分组情况 2.help 命令名称 查看命令的具体使用&#xff0c;包括命令的作用和用法。 举例&#xff1a;help list 二、general 组&#xff08;普通命令组&#xff09; 命令 描述 …

Codeforces Round 814 (Div. 2) D2. Burenka and Traditions (hard version)

题目 思路&#xff1a; #include <bits/stdc.h> using namespace std; // #define int long long #define pb push_back #define fi first #define se second #define lson p << 1 #define rson p << 1 | 1 const int maxn 1e6 5, inf 1e9, maxm 4e4 5;…

实验室信息系统源码 saas模式java+.Net Core版开发的云LIS系统全套源码可二次开发有演示

实验室信息系统源码 saas模式java.Net Core版开发的云LIS系统全套源码可二次开发有演示 一、技术框架 技术架构&#xff1a;Asp.NET CORE 3.1 MVC SQLserver Redis等 开发语言&#xff1a;C# 6.0、JavaScript 前端框架&#xff1a;JQuery、EasyUI、Bootstrap 后端框架&am…

如何配置Postgres的自动扩展功能以应对数据增长

文章目录 解决方案1. 表空间管理2. 分区表3. 自动扩展配置4. 监控和告警5. 使用外部工具和服务 示例代码示例1&#xff1a;创建表空间示例2&#xff1a;创建分区表示例3&#xff1a;调整配置参数示例4&#xff1a;使用监控和告警工具 总结 在PostgreSQL中&#xff0c;随着数据的…

type-cDP输入转双type-cDP输出,加type-c接口充电管理同时接两台显示器或者VR投屏,龙迅LT8712SX方案,龙迅桥接芯片方案

type-c的应用在各种设备上更加广泛&#xff0c;包括手机&#xff0c;电脑&#xff0c;游戏掌机&#xff0c; 因为type-c的功能非常强大&#xff0c;可以做到PD快充&#xff0c;DP信号输出&#xff0c;USB信号输出&#xff0c;所以很多设备为了做得更简洁都开始把其他的如HDMI接…

Go诊断工具

Go 提供了一些出色的诊断工具,可帮助我们深入了解应用程序的执行情况。 1. 分析工具 分析工具可观测应用程序执行的各种指标。它使我们能够解决性能问题、检测争用、定位内存泄漏等。这些指标可以通过以下几个配置文件收集: CPU--确定应用程序将时间花在了哪里Goroutine--报…

【.Net动态Web API】背景与实现原理

&#x1f680;前言 本文是《.Net Core进阶编程课程》教程专栏的导航站&#xff08;点击链接&#xff0c;跳转到专栏主页&#xff0c;欢迎订阅&#xff0c;持续更新…&#xff09; 专栏介绍&#xff1a;通过源码实例来讲解Asp.Net Core进阶知识点&#xff0c;让大家完全掌握每一…

Text2sql的一些技巧

最近看到了一篇关于text2sql的文章&#xff0c;以及一些论文。对使用模型做text2sql给了一些不错的建议。 参考文章&#xff1a;24年大模型潜力方向&#xff1a;大浪淘沙后的Text-to-SQL和Agent - 知乎 论文&#xff1a;https://arxiv.org/pdf/2403.09732.pdf 关于模型的建议 …

Linux modinfo命令教程:深入理解Linux内核模块(附案例详解和注意事项)

Linux modinfo命令介绍 modinfo&#xff08;模块信息&#xff09;命令在Linux系统中用于显示Linux内核模块的信息。此命令从命令行给出的Linux内核模块中提取信息。如果模块名称不是文件名&#xff0c;则默认搜索/lib/modules/kernel-version目录。modinfo可以理解来自任何Lin…

Stm32-hal库串口教程

工程是在上一节的LED的基础上修改的。 串口原理图 串口配置 led参考 CubelMX点灯-CSDN博客https://blog.csdn.net/anlog/article/details/137830323生成工程 编写包含文件 编写重定向代码 编写发送 编译下载 串口没有收到数据 查找原因 少配置了下图 再编译下载 收到数据…

mac安装nvm详细教程

0. 前提 清除电脑上原有的node (没有装过的可以忽略)1、首先查看电脑上是否安装的有node,查看node版本node -v2、如果有node就彻底删除nodesudo rm -rf /usr/local/{bin/{node,npm},lib/node_modules/npm,lib/node,share/man/*/node.*}2、保证自己的电脑上有安装git,不然下载n…

Since Maven 3.8.1 http repositories are blocked.

编译maven 项目时候报错提示下面信息&#xff1a; Since Maven 3.8.1 http repositories are blocked.Possible solutions: - Check that Maven settings.xml does not contain http repositories - Check that Maven pom files do not contain http repository http://XXXXXX:…

Java web应用性能分析之客户端慢

客户端慢的原因包括&#xff1a; 终端设备老化&#xff08;手机、PAD、电脑年限久远、运行期间产生了很多垃圾未清除&#xff09;终端网络设备老化&#xff08;路由器、交换机老化&#xff09;跟我们使用的手机一样&#xff0c;路由器也需要及时更新换代&#xff0c;否则硬件跟…

分布式限流——Redis + Lua脚本实现令牌桶算法

主要思路概括如下&#xff1a; 定义数据结构&#xff1a; 使用Redis存储令牌桶的状态&#xff0c;包括当前令牌数&#xff08;KEYS[1]&#xff09;和上一次令牌填充的时间戳&#xff08;KEYS[1]:last&#xff09;。 计算新增令牌&#xff1a; 获取当前系统时间与上次令牌填充时…