文件IO (File对象, 文件读写)

文件

狭义的文件: 硬盘上的文件和目录(文件夹)
广义的文件: 泛指计算机中的很多 软硬件资源

  • OS 中, 把很多硬件设备和软件资源抽象成了文件, 按照文件的方式来统一管理
  • 网络编程中, OS 把网卡当成了一个文件来操作

路径

绝对路径: 以盘符**(c: d: e:)**开头的路径
相对路径: 以 当前所在目录 为基准, 或者以 . 或者 开头的路径 (当前所在目录 => 工作目录)


文件类型

文本文件: 存的是被字符集编码过的文本
二进制文件: 保存的是按照标准格式保存的非被字符集编码过的文件(存的是二进制数据, 不一定是字符串, 可以存任何类型数据 [图片, 音频 …])

如何区分 文本文件 和 二进制文件

用记事本打开文件
如果乱码, 就是二进制文件
如果不乱码, 就是文本文件


Java 对于文件的操作

  1. 针对文件系统的操作 (文件的创建, 删除, 重命名 …)
  2. 针对文件内容的操作 (文件的读和写)

针对文件系统的操作 (文件的创建, 使用, 重命名 …)

Java 标准库提供了 File 类方便我们对文件的操作


常见构造方法有两个

在这里插入图片描述

File(String pathname): 参数是文件对应的目录
下图为例: File file = new File("e:/test/b.txt"); 或者 File file = new File("e:\\test\\b.txt"); (注意转义字符)

File(String parent, String child): parent 表示当前文件所在目录, child 表示自身的文件名
下图为例: File file = new File("e:/test", "b.txt");

在这里插入图片描述


常用 API 分析

在这里插入图片描述


根据 FIle 对象创建删除文件和文件夹

	public static void main(String[] args) throws IOException {
        File context = new File("./test/aaa/bbb");

        // 创建目录(只能创建一级, 如果中间目录不存在, 则创建失败)
        context.mkdir();
        // 创建目录(如果中间目录不存在, 会创建中间目录)
        context.mkdirs();
        
        File file = new File("./test/aaa/bbb/a.txt");

        // 如果文件不存在就把它创建出来, 如果已存在则不进行任何操作
        // 如果创建成功返回 true, 创建失败返回 false
        file.createNewFile();

        //根据 File对象删除文件, 成功删除返回 true
        file.delete();
    }

获取文件的信息

public static void main(String[] args) {
    File file = new File("./test/aaa/bbb/a.txt");
    // 判断 File 对象描述的文件是否存在
    System.out.println("file.exists(): " + file.exists());
    // 获取 File 对象的文件名称(不含路径)
    System.out.println("file.getName(): " + file.getName());
    // 获取 File 对象的父目录文件路径
    System.out.println("file.getParent(): " + file.getParent());
    // 获取 File 对象的文件路径
    System.out.println("file.getPath(): " + file.getPath());
    // 获取 File 对象的绝对路径
    System.out.println("file.getAbsolutePath(): " + file.getAbsolutePath());

    // 判断 File 对象是否是一个文件
    System.out.println("file.isFile(): " + file.isFile());
    // 判断 File 对象是否是一个目录
    System.out.println("file.isDirectory(): " + file.isDirectory());
}

运行结果
在这里插入图片描述


获取目录下的文件名/文件

public static void main(String[] args) {
 	File file = new File("e:/test");
    // 获取 File 对象代表的目录下的所有文件名
    String[] fileName = file.list();
    // 获取 File 对象代表的目录下的所有文件, 以 File 对象表示
    File[] files = file.listFiles();

    for(String s : fileName) {
        System.out.println(s);
    }

    for (File f : files){
        System.out.println(f.toString());
    }
}

运行结果

在这里插入图片描述


文件改名/剪切/粘贴

public static void main(String[] args) {
    File file = new File("./test/aaa/bbb/a.txt");
    File file1 = new File("./test/aaa/bbb/b.txt");

    // 删除 file 对象对应的文件, 并将其放到 file2 中去 (并且重命名)
    file.renameTo(file1);
}

运行结果
在这里插入图片描述


针对文件内容的操作 (文件的读和写)

针对文件内容, 使用 “流对象” 进行操作.
attention: 文件的读写, 是针对文件来说的, 从文件读内容到内存, 从内存写内容到文件, 或者再简单一点, 从文件读, 写到文件里(~~这个玩意好长一段时间我傻傻分不清~~ )

Java 标准库的流对象, 分为两个大类

  1. 字节流 (操作二进制数据)
  • InputStream FileInputStream
  • OutputStream FileOutputStream
  1. 字符流 (操作文本数据)
  • Reader FileReader
  • Writer FileWriter

attention: 读文件的操作不会对文件内容产生影响, 但是写文件操作, 默认情况下, 流对象在打开文件的同时, 就会清空文件内容, 如果想要实现 "追加写", 可在打开文件时修改参数

上述类对象的核心操作如下:

  1. 打开文件 (构造对象)
  2. 关闭文件 (close)
  3. 读文件(read) => 针对 InputStream / Reader
  4. 写文件(write) => 针对 OutputStream / Writer

InputStream

read:用来读取字节
read(): 无参版本, 一次读一个字节, 返回值为读到的字节, 当读不到内容时(EOF) , 返回值为 -1.
read(byte[] b):尽可能多的将数据读取到 b 数组里, 返回值为读取到字节的数量, 当读取完毕后再读取, 返回值为 -1.
read(byte[] b, int off, int len): 读取 len 长度的字节到 b 数组里, 从off 下标开始填充.

在这里插入图片描述


read()

public static void main(String[] args) throws IOException {
    File file = new File("./test/aaa/bbb/b.txt");
    InputStream inputStream = new FileInputStream(file);

    // 单个字符, 进行读操作
    while(true) {
        int b = inputStream.read();
        if(b == -1) break;
        System.out.print(b + " ");
    }

    inputStream.close();
}

在这里插入图片描述


read(byte[] b) & read(byte[] b, int off, int len)

public static void main(String[] args) throws IOException {
   File file = new File("./test/aaa/bbb/b.txt");
    InputStream inputStream = new FileInputStream(file);

   while(true) {
       byte[] buffer = new byte[1024];
       // 读取的数据填充到 buffer 数组中
       // 从下标 0 开始填充, 尽可能填充满 buffer.length 的容量
       int len = inputStream.read(buffer, 0, buffer.length);
       if(len == -1) break;
       System.out.println(new String(buffer));

   }

    inputStream.close();
}

在这里插入图片描述


Scanner

Scanner 搭配流对象进行使用 (InputStream 也是流对象)

public static void main(String[] args) throws IOException {
   try (InputStream inputStream = new FileInputStream("./test/aaa/bbb/b.txt")) {
        Scanner scanner = new Scanner(inputStream);
        System.out.println(scanner.next());
    }
}

在这里插入图片描述


OutputStream

各参数版本同上, 不再赘述

在这里插入图片描述


write()

public static void main(String[] args) throws IOException {
    try (OutputStream outputStream = new FileOutputStream("./test/aaa/bbb/b.txt")) {
        outputStream.write(97);
        outputStream.write(98);
        outputStream.write(99);
    }
}

在这里插入图片描述


write(byte[] b) & write(byte[] b,int off, int len)

public static void main(String[] args) throws IOException {
    try (OutputStream outputStream = new FileOutputStream("./test/aaa/bbb/b.txt")) {
        byte[] buffer = "hello 朱睿杰".getBytes(StandardCharsets.UTF_8);
        outputStream.write(buffer,0 ,buffer.length);
    }
}

在这里插入图片描述


Reader

在这里插入图片描述


read()

public static void main(String[] args) throws IOException {
    try (Reader reader = new FileReader("./test/aaa/bbb/b.txt")) {
        while(true) {
            int ch = reader.read();
            if(ch == -1) break;
            System.out.print((char)ch);
        }
    }
}

在这里插入图片描述


read(char[] cbuf) & read(char[] cbuf, int off, int len)

    public static void main(String[] args) throws IOException {
        try (Reader reader = new FileReader("./test/aaa/bbb/b.txt")) {
            char[] buffer = new char[1024];
            while(true) {
                int ch = reader.read(buffer, 0 , buffer.length);
                if(ch == -1) break;
                System.out.print(buffer);
            }
        }
    }

在这里插入图片描述


Writer

在这里插入图片描述

public static void main(String[] args) throws IOException {
    try (Writer writer = new FileWriter("./test/aaa/bbb/b.txt")) {
        String str = "abcdefg";
        char[] cbuf = "朱睿杰".toCharArray();
        writer.write(97);
        writer.write("\n");

        writer.write(str);
        writer.write("\n");
        writer.write(str, 0, 3); //读取str, 往文件里写, 从下标 0开始, 到下标 3结束
        writer.write("\n");

        writer.write(cbuf);
        writer.write("\n");
        writer.write(cbuf,0, 2);
        writer.write("\n");
    }
}

在这里插入图片描述

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

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

相关文章

HarmonyOS ArkTS 通用事件(二十三)

通用事件目录 点击事件事件ClickEvent对象说明EventTarget8对象说明示例 触摸事件事件TouchEvent对象说明TouchObject对象说明示例 挂载卸载事件事件示例 点击事件 组件被点击时触发的事件。 事件 ClickEvent对象说明 从API version 9开始,该接口支持在ArkTS卡片中…

C++:继承:面向对象编程的重要特性

(❁◡❁)(●◡●)╰(*▽*)╯(*/ω\*)(^///^)(❁◡❁)(❁◡❁)(●◡●)╰(*▽*)╯(*/ω\*)(❁◡❁)(●’◡’●)╰(▽)╯(/ω\)(///) C:继承:面向对象编程的重要特性 前言**继承**1.继承的概念及定义1.1继承的概念1.2继…

学完Python的7大就业方向,哪个赚钱最多?

“ 我想学Python,但是学完Python后都能干啥 ?” “ 现在学Python,哪个方向最简单?哪个方向最吃香 ?” “ …… ” 相信不少Python的初学者,都会遇到上面的这些问题。大家都知道Python很吃香,薪资…

英伟达 V100、A100/800、H100/800 GPU 对比

近期,不论是国外的 ChatGPT,还是国内诸多的大模型,让 AIGC 的市场一片爆火。而在 AIGC 的种种智能表现背后,均来自于堪称天文数字的算力支持。以 ChatGPT 为例,据微软高管透露,为 ChatGPT 提供算力支持的 A…

slab分配器

什么是slab分配器? 用户态程序可以使用malloc及其在C标准库中的相关函数申请内存;内核也需要经常分配内存,但无法使用标准库函数;linux内核中,伙伴分配器是一种页分配器,是以页为单位的,但这个…

【考研数学】零基础全年可实操规划+网课资料分析

我理解的零基础就是一点基础也没有,甚至来呢最基础的求极限都不会 其实大家可以参照我的经验,零基础数学二,经过一年的学习学习,最后考了122分 首先大家要有自信,我都行你们肯定也可以!其实考研数学真的没…

XCode升级错误:Command CompileC failed with a nonzero exit code 解决办法

升级完XCode之后,bulid失败,出现如下错误: 问题1: xcrun: error: invalid active developer path (/Library/Developer/CommandLineTools), missing xcrun at: /Library/Developer/CommandLineTools/usr/bin/xcrunCommand Compi…

【性能测试】JMeter:集合点,同步定时器的应用实例!

一、集合点的定义 在性能测试过程中,为了真实模拟多个用户同时进行操作以度量服务器的处理能力,可以考虑同步虚拟用户以便恰好在同一时刻执行操作或发送请求。 通过插入集合点可以较真实模拟多个用户并发操作。 (注意:虽然通过加入集合点可…

2024藏在身边的冷门暴利行业,普通人掌握这个方式也能轻松加入赚取100万!适合普通人轻资产创业项目!2024新的创业机会

如果说2024创业圈流传最多的话是什么,那一定是:“阶级固化了,翻身太难”、“2024机会太少了,赚不到钱”、“经济大环境不好,创业寒冬”云云。 其实这些抱怨都是毫无道理的,无论是国内还是国外,对…

突破图神经网络技术瓶颈!新阶段3大创新方向大幅提高模型性能

针对传统的图神经网络在处理非结构化数据、捕捉高阶关系等方面的局限性,研究者们提出了众多优化方案。 这其中,超图神经网络、几何图神经网络、动态图神经网络作为GNN发展的前沿方向,不仅提供了更加丰富和灵活的方法来处理各种复杂的图数据&…

基于ssm的航空售票系统

基于SSM的航空订票系统根据功能设计划分为管理员用户和注册用户,从这两种用户的功能所需展开设计,管理员对注册用户管理、航班管理、航班时刻管理、通知公告管理、订票管理、退票管理等;注册用户主要是注册成功后登录,机票查询&am…

基于 Vue3打造前台+中台通用提效解决方案(中)

33、实现全屏展示功能 我们知道在原生dom上,提供了一些方法来供我们开启或关闭全屏: Element.requestFullscreen()Document.exitFullscreen()Document.fullscreenDocument.fullscreenElement一般浏览器 使用requestFullscreen()和exitFullscreen()来实现 早期版本Chrome浏…

异常:程序出现的问题

目的:为了以后发现异常后怎么去处理 异常的作用

学点儿Java_Day7_在实体类当中IDEA无法进行单元测试(@Test没有启动按钮)

在敲代码体会继承和访问修饰符的时候忽然遇到了单元测试不管用的情况,表现为没有启动按钮   经过一番折腾,发现我的测试是在具有构造函数的实体类Person当中进行的,当我把所有的构造函数删除后,启动按钮又出来了,加…

鸿蒙开发实战:【文件管理】

介绍 本示例主要展示了文件管理相关的功能,使用[ohos.multimedia.medialibrary]、[ohos.filemanagement.userFileManager] 、[ohos.fileio] 、[ohos.file.fs]、[ohos.app.ability.contextConstant] 等接口,实现了增添文件、删除文件、查找指定类型文件…

Java基础夯实——八股文【2024面试题案例代码】

1、Java当中的基本数据类型 Java中常见的数据类型及其对应的字节长度和取值范围如下: byte:1字节,取值范围为-128到127。short:2字节,取值范围为-32,768到32,767。int:4字节,取值范围为-2,147…

【Linux】初识进程

目录 操作系统是什么 设计操作系统的目的 操作系统的定位 如何理解管理 管理的本质 管理的例子 计算机的管理概念图 操作系统管理逻辑的六字真言 系统调用和库函数的概念 进程 进程的概念 什么是PCB? PCB的主要内容 如何查看进程? 通过系统…

数据结构与算法----复习Part 17 (图(Graph)初步)

本系列是算法通关手册LeeCode的学习笔记 算法通关手册(LeetCode) | 算法通关手册(LeetCode) (itcharge.cn) 目录 一,图(Graph) 图的分类 顶点的度 环形图和无环图 连通图和非连通图 强连…

远程服务器安装portainer —— docker的可视化工具

可视化工具(了解即可) 最常用的工具是 portainer portainer 是一个开源的容器管理平台,它提供了一个简单易用的用户界面,用于管理和监控 docker 容器集群。通过 portainer,用户可以轻松地进行容器的部署、启动、停止…

C++_回文串

目录 回文子串 最长回文子串 分割回文串 IV 分割回文串 II 最长回文子序列 让字符串成为回文串的最少插入次数 回文子串 647. 回文子串 思路,i j表示改范围内是否为回文串, ②倒着遍历是为了取出dp[i 1][j - 1] ③i j 只有一对,不会重复…