文件操作和IO流(Java版)

前言

我们无时无刻不在操作文件。可以说,我们在电脑上能看到的图片、视频、音频、文档都是一个又一个的文件,我们需要从文件中读取我们需要的数据,将数据运算后也需要将结果写入文件中长期保存。可见文件的重要性,今天我们就来简单介绍一下Java中关于文件的操作和读写。

什么是文件

我们日常生活中也有关于文件的概念,它们一般是这样的:

计算机中文件的概念完全可以从日常生活中的文件类比出来。我们知道计算机可以存储多种多样的数据类型,可以是图片,可以是音频……但不同形式的数据如何更加高效的管理呢,我们就抽象出文件的概念,上面提及到的类型都可以从属于文件这个大的体系下,我们不在关注我们操作的具体是什么,因为我们操作的都是文件。这大大降低了学习和使用的成本。当然文件存储的除了数据以外也存储了维护文件的信息,被称为文件源信息。

随着文件的越积越多,文件的管理和组织方式成为一个让人头疼的东西。最终我们从日常的文件管理中获得灵感,选取文件夹/目录的形式管理文件,其中的数据结构使用的是多叉树的树形结构

路径(Path)

如何定位到唯一的文件,这就是路径的概念。路径可以分为绝对路径和相对路径。

绝对路径指的是从系统根目录出发到达目标文件的完整路径,它是唯一的

相对路径指的是从源位置到目标文件的路径,选取不同的源位置路径也是不同的

就好比学校的位置,如果是绝地路径指的是它的经纬度,相对路径指的是从家到学校的路径,所有人的家在不一样的位置这个相对路径也不同,但这个经纬度对于任何位置都是唯一的

文件的分类

文件可以分为二进制文件和文本文件。常见的二进制文件有图片,视频……文本文件有txt文件。两者的本质区别就在于,文本文件中存储的字符,二进制文件存储的是01。但文本文件在硬盘上本质上存储的依然是二进制01,只不过在逻辑上文本文件会将字符转换成对应的二进制进行存储。

快速区分这两者的办法就是用记事本打开,看得懂的是文本文件,看不懂的是二进制文件。

其他

Windows系统用文件的后缀标识文件的类型和默认的打开方式。Windows系统可以为文件设置权限。Windows还有一类特殊的文件,就是快捷方式,本质上就是文件引用。为了操作方便,很多操作系统将所有I/O设备都抽象成文件

文件操作(File类)

文件操作我们只需要介绍一个类——File

Java 中通过 java.io.File 类来对一个文件(包括目录)进行抽象的描述。注意,有 File 对象,并不
代表真实存在该文件,File不涉及文件的读写

属性

pathSeparatorChar(char)和 pathSeparator(String) 代表文件的路径分隔符,自动获取

构造方法

其中,如果需要使用相对路径,一般用 . 表示本目录 用 .. 表示上级目录。

 方法

package www.Zheng;

import java.io.File;
import java.io.IOException;
import java.util.Arrays;

/**
 * @Title: Demo1
 * @Author zyh
 * @Package www.Zheng
 * @Date 2024/7/7 16:41
 * @description: 文件操作方法
 */
public class Demo1 {
    public static void main7(String[] args) {
        File file = new File("./test.txt");
        System.out.println(file.canRead());//boolean canRead()判断是否有读取权限
        System.out.println(file.canWrite());//boolean canWrite()判断是否有写入权限
    }
    public static void main(String[] args) {
        File file = new File("./test.txt");
        File file2 = new File("./test/ttt.txt");
        System.out.println(file.renameTo(file2));//  boolean renameTo文件改名,逻辑是将源文件剪切,在目标位置粘贴在重命名
    }
    public static void main5(String[] args) {
        File f = new File("./test");
        System.out.println(f.mkdir());// boolean mkdir() 创建一级目录
        File file = new File("./test/test1");
        System.out.println(file.mkdirs());//boolean mkdirs() 创建多级目录
    }
    public static void main4(String[] args) throws IOException {
        File parent = new File("./");
        for (String s: parent.list()) {// String[] list()得到本目录下所有的文件名
            System.out.println(s);
        }
        System.out.println(Arrays.toString(parent.list()));
        for (File file : parent.listFiles()) {//File[] listFiles()得到本目录下所有的文件
            System.out.println(file.getCanonicalPath());
        }


    }
    public static void main3(String[] args) throws InterruptedException {
        File parent = new File("./");
        File file = new File(parent,"/test.txt");
        file.delete();// boolean delete()将文件立即删除
        file.deleteOnExit();// void deleteOnExit()将文件标记未删除,JVM运行结束后删除
        Thread.sleep(2000);
        System.out.println("程序结束");
    }
    public static void main2(String[] args) throws IOException {
        File parent = new File("./");
        File file = new File(parent,"/test.txt");
        System.out.println(file.exists());
        System.out.println(file.isDirectory());//boolean isDirectory() 判断文件是否未文件夹/目录
        System.out.println(file.isFile());//  boolean isFile()判断文件是否未普通文件

        file.createNewFile();//boolean createNewFile()新建file指定路径的文件

        System.out.println(file.exists());
        System.out.println(file.isDirectory());
        System.out.println(file.isFile());
    }
    public static void main1(String[] args) throws IOException {
        File parent = new File("./");
        File file = new File(parent,"/test.txt");
        System.out.println(file.exists());//  boolean exists() 判断File文件是否真是存在
        System.out.println(file.getParent()); //String getParent() 返回 File 对象的父目录文件路径
        System.out.println(file.getName());  //String getName()返回 File 对象的文件名称
        System.out.println(file.getPath()); //  String getPath() 获得文件的路径,如果初始化使用的是相对路径得到的是相对路径,如果初始化使用的是绝对路径得到的是绝对路径
        System.out.println(file.getAbsolutePath());//String getAbsolutePath() 获得绝对路径,未修饰
        System.out.println(file.getCanonicalPath());//  String getCanonicalPath()获得绝对路径,修饰
        //修饰和未修饰在初始化传入绝对路径时没有区别,在传入相对路径时修饰会将 ./ 删除
    }
}

什么是流

流是什么?流其实就是对IO设备的封装。我们可能会向不同的IO设备上读写数据,这显然是件很麻烦的事情,意味着我们需要为不同的IO设备都设计一种代码。这时候我们就引入了流的概念,将所有的IO设备都封装在流里面,这时候我们只需要向流内读写数据即可

文件的读写操作(流操作)

我们根据操作文件的类型可以分为字节流和字符流,再根据读写可分为字节输入流,字节输出流,字符输入流,字符输出流。主要对应的是四个抽象类,分别是

InputStream//字节输入流
OutputStream//字节输出流
Reader//字符输入流
Writer//字符输出流

上面四个都是抽象类,使用我们需要使用它们的实现类。这里我们只关心文件,用的都是File相关的实现类,理论上不同的IO设备都会有具体的实现类。

        InputStream inputStream = new FileInputStream();
        OutputStream outputStream = new FileOutputStream();
        Reader reader = new FileReader();
        Writer writer = new FileWriter();

上面四个实现类均需要传入File或者文件路径以定位到操作文件

下面我们来简单的认识一下这四个实现类

FileInputStream

读取

public int read() throws IOException 读取一个字节,返回值-1则代表读完否则代表读到的内容
public int read(byte b[]) throws IOException 将读取的内容尽量填满数组,返回值代表读到的有效数,-1则代表读完
public int read(byte b[], int off, int len) throws IOException 将读取的内容尽量填满数组从off后len个元素,返回值代表读到的有效数,-1则代表读完

关闭

public void close() throws IOException 资源回收

FileOutputStream()

写入

public void write(int b) throws IOException 写入一个字节的数据
public void write(byte b[]) throws IOException 将数组内的数据写入
public void write(byte b[], int off, int len) throws IOException 将数组从off往后len个元素的数据写入
public void close() throws IOException 资源回收
public void flush() throws IOException 刷新缓存区。因为IO操作的速度很慢,为了提高效率,一般将数据填满一块区域或者触发其他机制会将数据刷新到硬盘上。这块区域就叫缓冲区,机制之一就是flash

FileReader 和 FileWriter

这两个字符流的使用和字节流的使用极为类似,只不过就是字节流的操作单位是字节和字节数组,字符流的操作单位是字符和字符串,甚至方法名和使用都是相同的不过传入的参数类型不同。这里就不在展开

字节流转字符流

我们在这里再介绍两个方法,分别是字节输入流转字符输入流,字节输出流转字符输出流

package www.Zheng;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.util.Scanner;

/**
 * @Title: Demo6
 * @Author zyh
 * @Package www.Zheng
 * @Date 2024/7/7 23:29
 * @description: 字节输入转换为字符输入的简单实现
 */
public class Demo6 {
    public static void main(String[] args) {
        try (InputStream stream = new FileInputStream()){
            Scanner scanner = new Scanner(stream);
            System.out.println(scanner.nextLine());
        } catch (FileNotFoundException e) {
            throw new RuntimeException(e);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
}
package www.Zheng;

import java.io.*;
import java.util.Scanner;

/**
 * @Title: Demo7
 * @Author zyh
 * @Package www.Zheng
 * @Date 2024/7/7 23:39
 * @description: 字节输出流转字符输出流
 */
public class Demo7 {
    public static void main(String[] args) throws IOException {
        try (OutputStream stream = new FileOutputStream()){
            PrintWriter writer = new PrintWriter(stream);
            writer.printf("哈哈");
            writer.flush();
        }
    }
}
//PrintWriter 类中提供了我们熟悉的 print/println/printf 方法
//同样也有flash方法

结语

以上便是今天的全部内容。如果有帮助到你,请给我一个免费的赞。

因为这对我很重要。

编程世界的小比特,希望与大家一起无限进步。

感谢阅读!

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

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

相关文章

Gemma2——Google 新开源大型语言模型完整应用指南

0.引言 Gemma 2以前代产品为基础,提供增强的性能和效率,以及一系列创新功能,使其在研究和实际应用中都具有特别的吸引力。Gemma 2 的与众不同之处在于,它能够提供与更大的专有模型相当的性能,但其软件包专为更广泛的可…

北斗防爆手持终端在化工厂的安全性能分析

北斗防爆手持终端在化工厂中的应用显著提升了安全性能,其卓越的防爆设计、高精度定位与监控功能、实时通信能力以及多功能集成特性,共同构筑了化工厂安全生产的坚实防线,确保了巡检人员与设备在复杂环境下的安全作业与高效管理。 北斗防爆手持…

[Linux][Shell][Shell基础] -- [Shebang][特殊符号][变量][父子Shell]详细讲解

目录 0.前置知识1.Shebang2.Linux特殊符号整理3.变量4.环境变量5.父子shell0.概念1.创建进程列表(创建子shell执行命令) 6.内置命令 vs 外置命令 0.前置知识 #用于注释shell脚本语⾔属于⼀种弱类型语⾔:⽆需声明变量类型,直接定义使⽤shell三剑客&#…

148. 排序链表

https://leetcode.cn/problems/sort-list/description/https://leetcode.cn/problems/sort-list/description/ 解题思路: 归并排序,先拿到链表长度,每次遍历到一半,进行分割,后序双指针合并。 /*** Definition for sin…

图论---匈牙利算法求二分图最大匹配的实现

开始编程前分析设计思路和程序的整体的框架,以及作为数学问题的性质: 程序流程图: 数学原理: 求解二分图最大匹配问题的算法,寻找一个边的子集,使得每个左部点都与右部点相连,并且没有两条边共享…

操作系统|day1.了解操作系统

文章目录 了解操作系统定义目的操作系统体系结构功能特征操作系统的区别(64位与32位)操作系统的地址内存管理缓存 了解操作系统 定义 操作系统是控制管理计算机系统的硬软件,分配调度资源的系统软件 目的 方便性,有效性(提高系统资源的利用率,提高系统的吞吐量) 操作系统体…

android13 固定U盘链接 SD卡链接 TF卡链接 硬盘链接

1.前言 有些客户使用的应用并不带有自动监听U盘 sd卡广播的代码,使用的代码是固定的地址,这样的话,就需要我们将系统的挂载目录固定了。 原始路径 /storage/3123-19FA 增加链接 /storage/upan_000 -> /storage/3123-19FA 2. 首先如果是应用本身监听的话,使用的是 /…

Linux Mac 安装Higress 平替 Spring Cloud Gateway

Linux Mac 安装Higress 平替 Spring Cloud Gateway Higress是什么?传统网关分类Higress定位下载安装包执行安装命令执行脚本 安装成功打开管理界面使用方法configure.shreset.shstartup.shshutdown.shstatus.shlogs.sh Higress官网 Higress是什么? Higress是基于阿里内部的…

CentOS 8升级gcc版本

1、查看gcc版本 gcc -v发现gcc版本为8.x.x,而跑某个项目的finetune需要gcc-9,之前搜索过很多更新gcc版本的方式,例如https://blog.csdn.net/xunye_dream/article/details/108918316?spm1001.2014.3001.5506,但执行指令 sudo yu…

S32V234平台开发(一)快速使用

快速使用 准备供电复位选择串口通信启动选择显示登陆系统 准备供电 s32v234可以使用两种电源供电 一种是左边电源端子,一种是右边电源适配器(12V 3A) 注意:不要同时使用两种电源同时供电 复位选择 Pressing POR RESET pulls active low EXT_POR signal on S32V2…

使用bypy丝滑传递百度网盘-服务器文件

前言 还在为百度网盘的数据集难以给服务器做同步而痛苦吗,bypy来拯救你了!bypy是一个强大而灵活的百度网盘命令行客户端工具。它是基于Python开发的开源项目,为用户提供了一种通过命令行界面与百度网盘进行交互的方式。使用bypy,…

自动驾驶AVM环视算法--540度全景的算法实现和exe测试demo

参考:金书世界 540度全景影像是什么 540度全景影像是在360度全景影像基础上的升级功能,它增加了更多的摄像头来收集周围的图像数据。通常,这些摄像头分布在车辆的更多位置,例如车顶、车底等,以便更全面地捕捉车辆周围…

C++ | Leetcode C++题解之第226题翻转二叉树

题目: 题解: class Solution { public:TreeNode* invertTree(TreeNode* root) {if (root nullptr) {return nullptr;}TreeNode* left invertTree(root->left);TreeNode* right invertTree(root->right);root->left right;root->right …

内网信息收集:手动、脚本和工具查IP、端口

1.手动查IP和端口 2.工具查IP 3.工具查端口 我们在内网中拿下目标机器后,需要进行一系列的信息收集,以下为总结的收集方法 1.手动信息收集: 以下命令在CS执行时命令前须加shell,如:shell ipconfig 1.收集IP网卡: ip…

【UE5.3】笔记9

1、如何将BSP笔刷转换为静态网格体? 在笔刷的细节的高级里面找到创建静态网格体; 2、如何将自己创建的一个由多个网格体或其他组件组合成的道具转换为个整体即蓝图类?---即把多个Actor转换成蓝图类 选中所要整合的对象,要全选中…

基于Spring Boot的旅游信息推荐信息系统设计与实现(源码+lw+部署+讲解)

技术指标 开发语言:Java 框架:Spring BootJSP JDK版本:JDK1.8 数据库:MySQL5.7 数据库工具:Navicat16 开发软件:IDEA Maven包:Maven3.6.3 浏览器:IE浏览器 功能描述 旅游信…

压缩感知3——重构算法正交匹配追踪算法

算法流程 问题的实质是&#xff1a;AX Y 求解&#xff08;A是M维&#xff0c;Y是N维且N>>M并且稀疏度K<M&#xff09;明显X有无穷多解&#xff0c;重构过程是M次采样得到的采样值升维的过程。OMP算法的具体步骤&#xff1a;(1)用X表示信号&#xff0c;初始化残差e0 …

bash: redi-cli: 未找到命令...

问题描述 在执行命令&#xff1a;redi-cli --bigkeys 提示&#xff1a;bash: redi-cli: 未找到命令... 确定服务器是否有Redis进程 ps -ef | grep redis查找Redis 文件信息 find / -name "redis-*"进入到当前目录 cd /usr/bin/再次执行命令 涉及redis-cli 连…

GOJS去除水印

GOJS gojs 去除水印 **查找go.js库搜索下面这段文本 String.fromCharCode(a.charCodeAt(g)^b[(b[c]b[d])%256]) 加入这段文本 if(f.indexOf(GoJS 2.1 evaluation)>-1|| f.indexOf(© 1998-2021 Northwoods Software)>-1|| f.indexOf(Not for distribution or produ…

最新知识付费系统3.0整站+自动采集同步插件

支持分类替换 将主站同步过来的文章分类进行替换 支持自定义文章作者&#xff08;选择多个作者则同步到的文章作者将会随机分配&#xff09; 支持添加黑名单分类 添加后 如果同步过来的文章包含黑名单分类将不会发布文章 自动检测同步&#xff0c;无需人工值守以及挂采集软件…