文件API及其操作

这里介绍两类文件操作、三个文件类。包括文件系统操作(File类)、文件内容操作(操作字节流、操作字符流)

1.文件类File

1.1.认识File类

(1)什么是File类呢?其实就是可以操作文件的一个类。通过File类构造一个文件对象,此时就得到了一个文件对象的引用,通过该引用,可以得到该文件的路径、名字;判断该文件对象是文件目录还是目标文件

(2)构造方法

签名说明
File(File parent,String child)根据父目录+孩子文件路径,创建一个新的File实例
File(String pathname)根据文件路径创建一个新的File实例,路径可以是绝对/相对路径
File(String parent,String child)根据父目录+孩子文件路径,创建一个新的File实例,父目录用路径表示

我们常用第二个,pathname就是一个文件路径,绝对路径或者相对路径都可以。

值得注意的点:以上创造的File对象,里面的文件路径,表示的是目录还是最终文件,无论在你的硬盘中是否存在,都不影响,都可以创造出来。

1.2.认识File类的方法

这个有什么用呢?就是在构建好一个文件对象之后,可以通过File类中的方法去操作文件。

(1)返回路径型

返回值类型方法签名说明
StringgetParent()返回File对象的父目录文件路径
StringgetName()返回File对象的纯文件名称
StringgetPath()返回File对象的文件路径
StringgetAbsolutePath()返回File对象的绝对路径
StringgetCanonicalPath()返回File对象的修饰过的绝对路径

(2)返回boolean型

返回值类型方法签名说明
booleanexists()判断File对象描述的文件是否真实存在
booleanisDirectory()判断File对象代表的文件是否是一个目录
booleanisFile()判断File对象代表的文件是否是一个普通文件
booleancreateNewFile()根据File对象,自带创建一个空文件。成功创建后返回true
booleandelete()根据File对象,删除该文件。成功删除后返回true
booleanmkdirs()创建File对象代表的目录,如果必要,会创建中间目录
booleanrenameTo(File dest)进行文件改名,也可以视为我们平时的剪切、粘贴操作

(3)其他类型

返回值类型方法签名说明
voiddeleteOnExit()根据File对象,标注文件将删除,删除动作会到JVM运行结束时
String[ ]list()返回File对象代表的目录下的所有文件名
File[ ]listFiles()返回File对象代表的目录下的所有文件,以File对象表示

在标准库中,还有许多方法,这里就不一一展示了。

很多方法在后续也都会使用到,这里也不做使用的展示,我们接着看后续。

1.3.实例化文本对象

下面介绍三种创造File对象的方式,可以说是不同的情况创造File对象 

(1)文件不存在-以相对路径

这个test666.txt文件在实例化对象时,是不存在的,所以最后一行是显示false。其他的路径是因为我们在创造的时候是以一个相对路径,相对路径的现在位置就是该.java文件的位置。

 public static void main(String[] args) throws IOException {
        File f = new File("./text666.txt");
        System.out.println("该文件名字:"+f.getName());
        System.out.println("这级目录的名字:"+f.getParent());
        System.out.println("文件的路径:"+f.getPath());
        System.out.println("文件的绝对路径:"+f.getAbsolutePath());
        System.out.println("文件的绝对路径2:"+f.getCanonicalPath());//这个需要抛出异常
        System.out.println("文件是否真是存在:"+f.exists());
    }

(2)文件不存在--以绝对路径

(3)文件存在--以绝对路径

我们先在d盘上面创造一个文件

然后以创造文件类的方式打开

 public static void main(String[] args) throws IOException {
        File f = new File("d:/test999.txt");
        System.out.println("该文件名字:"+f.getName());
        System.out.println("这级目录的名字:"+f.getParent());
        System.out.println("文件的路径:"+f.getPath());
        System.out.println("文件的绝对路径:"+f.getAbsolutePath());
        System.out.println("文件的绝对路径2:"+f.getCanonicalPath());//这个需要抛出异常
        System.out.println("文件是否真是存在:"+f.exists());
    }

然后以相对路径打开:

第一个绝对路径就是当前的基准路径(在当前项目运行代码)+相对路径拼接而成

绝对路径2就是:拼接后并进行了一些优化操作。

1.4.创造文件

如果文件不存在,我们创造文件要根据下面的方法 

 

(1)相对路径创造文件

 public static void main(String[] args) throws IOException {
        File f = new File("./test222.txt");
        f.createNewFile();//需要抛出异常
    }

需要抛出异常的原因:(1)给出的路径非法(2)路径权限不足

(2)以绝对路径创造

public static void main(String[] args) throws IOException {
        File f = new File("d:/tttttt.txt");
        boolean bool = f.createNewFile();
        System.out.println(bool);
    }

程序运行后:

文件被真正的创造了出来,如果再运行一次代码,就是返回false,原因是该文件已经存在,无法再创造。

(3)判断文件是目录还是普通文件

 public static void main(String[] args) throws IOException {
        File f = new File("d:/tttttt.txt");
        f.createNewFile();
        System.out.println("文件是否真实存在:"+f.exists());
        System.out.println("文件是否代表目录:"+f.isDirectory());
        System.out.println("文件是否为普通问题:"+f.isFile());
    }

1.5.删除文件

删除文件有两个方法,下面一一介绍如果使用,及使用后的结果。

(1)直接删除文件

 public static void main(String[] args) throws IOException {
        File f = new File("d:/tttttt.txt");
        f.createNewFile();
        boolean bool = f.delete();
        System.out.println(bool);
    }

文件已被删除。

(2)延迟删除

 public static void main(String[] args) throws IOException {
        File f = new File("d:/tttttt.txt");
        f.createNewFile();
        f.deleteOnExit();//等进程结束后再删除文件
        System.out.println("进程结束前"+f.exists());
        Scanner in = new Scanner(System.in);
        in.next();//阻塞进程结束
        System.out.println("进程结束后:"+f.exists());
    }

当输入后,进程就会马上结束

文件也就不存在了。这就是延迟删除,当程序彻底结束后文件才会被删除。

接下来的部分是针对文件的内容进行操作。 操作文件内容的三个固定步骤:以二进制/文本方式打开文件--->读文件/写文件--->关闭文件

2.字节流

这样的意思就是:以二进制的方式打开文件,以字节为单位进行读取数据/写数据。

2.1.以字节流读取文件

所谓读取文件,就是读取文件中的数据,但是不会改变里面的内容

(1)打开文件

要读取数据,第一步就是打开文件。这里需要使用两个类,实例化好了对象,就相当于拿到了一个“流”对象,通过流,就可以随时读取文件数据。

 InputStream file = new FileInputStream("d:/dog111.txt");//以二进制打开文件(文件必须存在)

使用到两个类:

InputStream//抽象父类
FileInputStream//子类

注意点:

1)文件路径代表的文件必须真实存在,否则会抛出异常

2)必须在方法后面声明异常

(2)读取文件内容

打开了文件,接下来就读取文件内容的操作,读取文件内容有下面三种方式:

返回值类型方法签名说明
intread()读取一个字节的数据,返回-1代表读取结束(内容已读取完)
intread(byte[ ] b)最多读取b.length字节的数据到b中,返回时机读到的数量;-1代表读取完
intread(byte[ ],int off,int len)最多读取len-off个字节到b中,从b的off位置开始存放;-1读取完

第一种读取方式:每次读取一个字节

 public static void main(String[] args) throws IOException {
        //1.打开文件
        InputStream file = new FileInputStream("d:/dog111.txt");//以二进制打开文件(文件必须存在)
        //2.读文件
        while (true) {
            int n = file.read();
            if(n==-1) {
                System.out.println("文件读取完毕");
                break;
            }
            System.out.printf("%d ",n);
        }

    }

运行结果 

文件内容:

代码解释:我们采取循环读取的方式进行读取,当读取到-1的时候,说明文件里面的内容都已经被读取完毕了,就可以结束循环。

第二种读取方式:每次读取一个字节数组的数据

 public static void main(String[] args) throws IOException{
        InputStream file = new FileInputStream("d:/dog111.txt");
        byte[] bytes = new byte[1024];
        while (true) {
            int n = file.read(bytes);
            if(n==-1) break;
            for (int i = 0; i < n; i++) {
                System.out.printf("%c ",bytes[i]);
            }
            System.out.println();
        }
    }

这种方法读取数据会比第一种快,而且效率也高,

第三种方式:特定场景使用

 public static void main(String[] args) throws IOException{
        InputStream inputStream = new FileInputStream("d:/dog111.txt");
        byte[] bytes = new byte[1024];
        while (true) {
            int n = inputStream.read(bytes,0,1024);
            if(n==-1) {
                break;
            }
            for (int i = 0; i < n; i++) {
                System.out.printf("%c ",bytes[i]);
            }
        }

    }

上述都只是打开了流和读取数据,并没有关闭流,下面介绍关闭流。

2.2.关闭流

第一种方式:

使用try finally,目的是防止程序发生特殊情况,导致没有关闭流。但是这样子冗余,不好看。

 public static void main(String[] args) throws IOException{
        InputStream inputStream = new FileInputStream("d:/dog111.txt");
       try{
           byte[] bytes = new byte[1024];
           while (true) {
               int n = inputStream.read(bytes,0,1024);
               if(n==-1) {
                   break;
               }
               for (int i = 0; i < n; i++) {
                   System.out.printf("%c ",bytes[i]);
               }
           }
       }finally {
           inputStream.close();
       }

    }

第二种方式:

 public static void main(String[] args) throws IOException{
        try (InputStream file = new FileInputStream("d:/dog111.txt")){
            byte[] bytes = new byte[1024];
            while (true) {
                int n = file.read(bytes);
                if(n==-1) break;
                for (int i = 0; i < n; i++) {
                    System.out.print((char) bytes[i]+" ");
                }
            }
        }
    }

将打开流的操作,放在try中。当执行完后,会自动关闭流,也就不不需要在后面加上finally了

2.3.以字节流写文件

 (1)第一次写

public static void main(String[] args)  throws IOException{
        //写文件
        try(OutputStream outputStream = new FileOutputStream("d:/dog111.txt")) {
            outputStream.write(97);
            outputStream.write(98);
            outputStream.write(99);
            outputStream.write(100);
            outputStream.write(101);
        }
    }

再写一次:

第二次写时会覆盖掉文件内的内容。

原因是:打开文件就会把文件原有的内容给覆盖掉。为了解决这个问题,可以使用追加的方式进行打开文件。

3.字符流

接下来的读取/写文件,都是以字节为单位的。 

3.1.读文件

对于读文件,依旧是有三种方式,和上述的字节流类似

 (1) 第一种方式:

 public static void main(String[] args) throws IOException {
        Reader reader = new FileReader("d:/dog111.txt");
        while (true) {
            int n = reader.read();
            if(n==-1) break;
            System.out.print((char)n+" ");
        }
    }

可以读取文字

当去read()的时候,读到的是三个字符的数据,但是返回的时候,会转化成两个字节去接收。

(2)第二种方式: 

3.2.写文件

写文件,和上述是一样的。

 如果直接打开文件,然后去写文件,就会将原有的内容覆盖,所以要使用追加的方式去写。

(1)不追加写

原有内容被覆盖了。也就是第一次写入的时候,接着往下写是不会被覆盖的。

(2)追加写

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

STM32数字示波器+详细注释+上位机程序+硬件

目录 1、设计指标&#xff1a; 2、功能&#xff1a; 3、上位机的程序 ​4、测试的照片 5、PCB 6、模拟电路板 7、程序 资料下载地址&#xff1a;STM32数字示波器详细注释上位机程序硬件 1、设计指标&#xff1a; 主控: STM32…

【面试经典 150 | 字典树】添加与搜索单词 - 数据结构设计

文章目录 写在前面Tag题目来源解题思路方法一&#xff1a;字典树 写在最后 写在前面 本专栏专注于分析与讲解【面试经典150】算法&#xff0c;两到三天更新一篇文章&#xff0c;欢迎催更…… 专栏内容以分析题目为主&#xff0c;并附带一些对于本题涉及到的数据结构等内容进行回…

大功率双向直流电源的输出电压和电流

双向直流电源&#xff08;Bidirectional DC Power Supply&#xff09;是一种具有双向输出电能的直流电源。与传统的直流电源相比&#xff0c;双向直流电源在输出电能的同时&#xff0c;还具备一定的电流输入能力&#xff0c;从而使其应用范围更加广泛。大功率双向直流电源作为电…

【开发技巧 | 第二篇】IDEA新增作者信息、方法参数返回值

文章目录 2.IDEA新增作者信息、方法参数返回值2.1类新增作者信息2.2方法新增参数返回信息2.3测试2.3.1新建类2.3.2新建方法 2.IDEA新增作者信息、方法参数返回值 2.1类新增作者信息 打开IDEA的Settings&#xff0c;Editor->Code Style->File and Code Templates->Inc…

使用 ORPO 微调 Llama 3

原文地址&#xff1a;https://towardsdatascience.com/fine-tune-llama-3-with-orpo-56cfab2f9ada 更便宜、更快的统一微调技术 2024 年 4 月 19 日 ORPO 是一种新的令人兴奋的微调技术&#xff0c;它将传统的监督微调和偏好校准阶段合并为一个过程。这减少了训练所需的计算…

思科防火墙查如何查看现有ipsec隧道信息

环境&#xff1a; 思科ASA5555 问题描述&#xff1a; 思科防火墙查如何看现有ipsec隧道信息 解决方案&#xff1a; 1.进入特权模式&#xff1a; enable 查看isakmp信息 show crypto isakmp sa2.查看ipsec信息 show crypto ipsec sa上述命令将显示当前的ISAKMP安全关联…

设计模式之组合实体模式

在编程的奇幻森林里&#xff0c;树木与枝叶错综复杂&#xff0c;如何让代码世界井然有序&#xff1f;组合实体模式&#xff08;Composite Pattern&#xff09;就像一位高明的园艺师&#xff0c;它以一种巧妙的方式&#xff0c;将个体与整体统一管理&#xff0c;让无论是单个对象…

【Conda】解决使用清华源创建虚拟环境不成功问题

文章目录 问题描述&#xff1a;清华源创建不成功解决步骤1 添加官方源步骤2 删除C:/user/你的用户名/的 .condarc 文件步骤3 再次创建 问题描述&#xff1a;清华源创建不成功 本地配置了清华源&#xff0c;但是在创建虚拟环境时不成功&#xff0c;报错如下。 图片若看不清&…

直流屏电源模块HK22010/T2充电模块HK11010/T2说明

直流屏整流模块HK22010/T2电源模块HK11010/T2充电机HK22005/T2&#xff0c;HK11020/T2&#xff0c;HK22020/T2以及各种电源型号介绍 产品名称&#xff1a;直流屏电源模块HK22005/T2充电机HK11020/T2整流模块HK11005/T2&#xff0c;HK22020/T2 技术参数 交流输入额定电压&…

AI大模型探索之路-训练篇11:大语言模型Transformer库-Model组件实践

系列篇章&#x1f4a5; AI大模型探索之路-训练篇1&#xff1a;大语言模型微调基础认知 AI大模型探索之路-训练篇2&#xff1a;大语言模型预训练基础认知 AI大模型探索之路-训练篇3&#xff1a;大语言模型全景解读 AI大模型探索之路-训练篇4&#xff1a;大语言模型训练数据集概…

一觉醒来 AI科技圈发生的大小事儿 05月03日

&#x1f4f3;马斯克刚回美国&#xff0c;旋风裁掉了这个部门 特斯拉CEO马斯克裁撤超充团队&#xff0c;开除两名高管&#xff0c;转向AI领域&#xff0c;集中精力发展FSD&#xff1b;裁员举措引发合作伙伴担忧&#xff0c;特斯拉放缓充电站建设&#xff0c;影响整个行业&…

./build.sh:行1: g++: 未找到命令的错误问题在centos操作系统下面如何解决

目录 g: 未找到命令报错解释g: 未找到命令解决方法 centos操作系统&#xff0c;执行一个bash&#xff0c;bash命令很简单&#xff0c;就是用g编译一个C的程序。报告错误&#xff1a; ./build.sh:行1: g: 未找到命令 g: 未找到命令报错解释 这个错误表明在执行名为 build.sh 的…

一文了解复杂度

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、算法效率二、时间复杂度1.定义2.大O的渐进表示法3.一般常见复杂度4.实例 三、空间复杂度1.定义2.空间复杂度计算3.实例 总结 前言 计算复杂性理论&#xf…

LWIP+TCP客户端

一、TCP API函数 其中tcp_poll()函数的第三个参数表示隔几秒调用一次这个周期性函数 二、修改服务器的IP 三、TCP客户端编程思路 申请套接字绑定服务器IP和端口号等待客户端连接 进入连接回调函数在连接回调函数中 配置一些回调函数&#xff0c;如接收回调函数&#xff0c;周期…

FIFO Generate IP核使用——AXI接口FIFO简介

AXI接口FIFO是从Native接口FIFO派生而来的。AXI内存映射接口提供了三种样式&#xff1a;AXI4、AXI3和AXI4-Lite。除了Native接口FIFO支持的应用外&#xff0c;AXI FIFO还可以用于AXI系统总线和点对点高速应用。 AXI接口FIFO不支持Builtin FIFO和 Shift Register FIFO配置。 当…

UG NX二次开发(C#)-获取Part中对象创建时的序号(*)

文章目录 1、前言2、UG NX的对象序号讲解3、采用UG NX二次开发或者建模序号4、注意事项1、前言 在UG NX中,我们创建任意一个对象,都会在模型历史中添加一个创建对象的编号,即是对象序号,这个是递增的,当删除中间产生的对象时,其序号会重新按照建模顺序重新排布。今天一个…

34.基础乐理-简谱需要移调吗?

首先需要具备 首调 与 固定调的知识&#xff0c;才能理解&#xff0c;以两只老虎为例子&#xff0c;如下图&#xff1a; 首调&#xff1a;可以看到C大调、D大调、E大调三种方式的乐谱&#xff0c;记录的数字&#xff0c;记录的唱名&#xff0c;都是1231&#xff0c;唯一不同的…

Zookeeper服务

一、什么是Zookeeper Zookeeper 是一个分布式应用程序的协调服务&#xff0c;它提供了一个高性能的分布式配置管理、分布式锁服务和分布式协调服务。它是 Apache 软件基金会的一个项目&#xff0c;被设计用来处理大规模的分布式系统中的一些关键问题。 Zookeeper的组成员关系&…

论文辅助笔记:Tempo 之 model.py

0 导入库 import math from dataclasses import dataclass, asdictimport torch import torch.nn as nnfrom src.modules.transformer import Block from src.modules.prompt import Prompt from src.modules.utils import (FlattenHead,PoolingHead,RevIN, )1TEMPOConfig 1.…

在编程的世界里,我相信每一行代码都是一次对未来的投资

&#x1f600;前言 突然有感而发也是激励自己互勉 &#x1f3e0;个人主页&#xff1a;尘觉主页 文章目录 在编程的世界里&#xff0c;我相信每一行代码都是一次对未来的投资类似句子编程的本质代码的价值构建可持续的未来结语 在编程的世界里&#xff0c;我相信每一行代码都是一…