文件IO

文章目录

文章目录

前言

一 . 文件

文件路径

文件类型

Java中操作文件

File 概述

属性

构造方法

方法

createNewFile

mkdir

二 . 文件内容的读写 - IO

InputStream 概述

FileInputStream 概述

利用 Scanner 进行字符读取

OutputStream 概述

PrintWriter封装OutPutStream

三 . 小程序练习

总结


前言

大家好,今天给大家介绍一下文件&IO这方面的内容


一 . 文件

文件是存储在计算机或其他电子设备中的数据集合,可以包含文本、图像、音频、视频等各种形式的信息。文件通常以特定的格式和扩展名来标识其内容和用途,例如.txt、.docx、.jpg、.mp3等。文件可以被创建、编辑、复制、移动、删除等操作,以便在计算机系统中进行管理和使用。

文件路径

如何在文件系统中如何定位我们的一个唯一的文件就成为当前要解决的问题,但这难不倒计算机科学 家,因为从树型结构的角度来看,树中的每个结点都可以被一条从根开始,一直到达的结点的路径所描 述,而这种描述方式就被称为文件的绝对路径(absolute path)。

除了可以从根开始进行路径的描述,我们可以从任意结点出发,进行路径的描述,而这种描述方式就被 称为相对路径(relative path),相对于当前所在结点的一条路径

文件类型

即使是普通文件,根据其保存数据的不同,也经常被分为不同的类型,我们一般简单的划分为文本文件 和二进制文件,分别指代保存被字符集编码的文本和按照标准格式保存的非被字符集编码过的文件。

文本文件 :文本文件包含的是人类可读的文本内容,通常使用ASCII或Unicode编码。这些文件可以被文本编辑器打开和编辑,如.txt、.doc、.html等。  

二进制文件:二进制文件包含的是以二进制形式编码的数据,通常是计算机程序、图像、音频、视频等。这些文件不是以文本形式存储,而是以特定的格式和结构存储数据,通常需要特定的应用程序才能打开和处理。 

Java中操作文件

File 概述

我们先来看看 File 类中的常见属性、构造方法和方法

属性

修饰符及类型属性说明
static StringpathSeparator依赖于系统的路径分隔符,String 类型的表示
static charpathSeparator依赖于系统的路径分隔符,char 类型的表示

构造方法

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

方法

返回值类型方法签名说明
StringgetParent()返回 File 对象的父目录文件路径
StringgetName()返回 FIle 对象的纯文件名称
StringgetPath()返回 File 对象的文件路径
StringgetAbsolutePath()返回 File 对象的绝对路径
StringgetCanonicalPath()返回 File 对象的修饰过的绝对路径
booleanexists()判断 File 对象描述的文件是否真实存在
booleanisDirectory()判断 File 对象代表的文件是否是一个目录
booleanisFile()判断 File 对象代表的文件是否是一个普通文件
booleancreateNewFile()根据 File 对象,自动创建一个空文件 成功创建后返回 true
booleandelete()根据 File 对象,删除该文件。成功删除后返回 true
voiddeleteOnExit()根据 File 对象,标注文件将被删除,删除动作会到 JVM 运行结束时才会进行
String[]list()返回 File 对象代表的目录下的所有文件名
File[]listFiles()返回 File 对象代表的目录下的所有文件,以 File 对象表示
booleanmkdir()创建 File 对象代表的目录
booleanmkdirs()创建 File 对象代表的目录,如果必要,会创建中间目录
booleanrenameTo(File dest)进行文件改名,也可以视为我们平时的剪切、粘贴操作
booleancanRead()判断用户是否对文件有可读权限
booleancanWrite()判断用户是否对文件有可写权限

把有细节的给大家列举一下,其他的了解就行,用到的时候再查,谁记得住啊!

createNewFile

创建一个新的文件

mkdir

二 . 文件内容的读写 - IO

文件 I/O(Input/Output)就是计算机程序读写文件的操作。比如,你可以用程序打开一个文本文件,读取其中的内容,或者把程序中的数据写入到文件里。这样的操作在很多应用中都很常见,比如处理文本文件、保存用户数据等等。

流的概念

输入输出流是计算机编程中用于处理输入和输出的抽象概念。流(Stream)代表了数据的顺序流动,输入输出流则分别用于从输入设备(如键盘、鼠标、文件等)读取数据和向输出设备(如显示器、打印机、文件等)写入数据。

输入设备  --->  输入流  --->  程序
程序  --->  输出流  --->  输出设备

InputStream 概述

InputStream(输入流)是Java编程语言中用于从数据源(如文件、网络连接、内存等)读取字节流的抽象类。它是所有字节输入流类的超类,提供了一系列方法来读取字节数据

方法

修饰符及返回值类型方法签名说明
intread()读取一个字节的数据,返回 -1 代表已经完全读完了
intread(byte[] b)最多读取 b.length 字节的数据到 b 中,返回实际读到的数量 -1 代表以及读完了
intread(byte[] b, int off, int len)最多读取 len - off 字节的数据到 b 中,放在从 off 开始,返 回实际读到的数量, -1 代表以及读完了
voidclose()

关闭字节流

FileInputStream 概述

构造方法

签名说明
FileInputStream(File file)利用 File 构造文件输入流
FileInputStream(String name)利用文件路径构造文件输入流

练习: 在根目录下准备一个目录 写入英文字母(不能写中文),随便什么都行,下面给出参考代码

/*
* 测试 FileInputStream
* */
public class TestDemo2 {public static void main(String[] args) throws IOException {InputStream inputStream = null;try {inputStream = new FileInputStream("./aaa");while(true){int len = inputStream.read();if(len == -1){break;}System.out.printf("%c",len);}} catch (IOException e) {throw new RuntimeException(e);}finally {inputStream.close();}}
}

IO操作是很消耗时间的,根据这一点我们可以给代码做点优化: 

/*
* 测试 FileInputStream
* */
public class TestDemo1 {public static void main(String[] args){try {InputStream inputStream = new FileInputStream("./aaa");/** 每次IO读取的内容为1024byte* */byte[] buff = new byte[1024];int len = 0;while(true){len = inputStream.read(buff);if(len == -1){break;}/** 在内存中的操作要远远大于IO操作* */for(int i = 0; i<len; i++){System.out.printf("%c",buff[i]);}}} catch (IOException e) {throw new RuntimeException(e);}}
}

根据上面的两个问题,整个流家族就算是浮出水面了,给大家介绍一下,但是没有代码,因为代码都是差不多的,给大家说一个体系即可

第一个问题: 为什么不能出现中文?

文件和程序之间之间的 流 传递的是二进制数据010101001,FileInputStream是字节流可以直接在流中进行传递,但是中文并不是二进制数据,想要传递必须通过一种规则将其转变成为二进制数据,并且在接收方将其按照相同的规则逆转化为中文(两种规则不同就会乱码),这就是字符流

字符流是对基本流的一种封装,在其上面加上了一套转换规则使其能够在流中进行传递


转换规则 <----> 字符集

字符集(Character Set)是一种将字符与数字之间进行映射的规则集合。在计算机中,所有的数据最终都是以数字的形式存储和处理的,包括字符数据。字符集定义了字符与数字之间的对应关系,使得计算机能够正确地存储、传输和显示各种语言的文本。

常见的字符集包括 ASCII(美国信息交换标准代码)、ISO-8859-1、UTF-8(Unicode转换格式-8位)、UTF-16等。ASCII是最早的字符集之一,它只包含了英文字母、数字和一些特殊符号,而且只使用了一个字节来表示一个字符。ISO-8859-1是ISO制定的字符集标准,包含了更多的字符,但仍然是单字节字符集。

而UTF-8和UTF-16则是Unicode字符集的实现方式之一。Unicode是一个用于表示世界上几乎所有字符的字符集,包括各种语言的文字、符号和表情等。UTF-8使用1到4个字节来表示一个字符,而UTF-16使用2或者4个字节来表示一个字符。


第二个问题: 说是问题其实也算不上,只能说是一种启示吧

什么启示呢? 我们都知道IO操作很浪费时间,那么开发java的那些大佬肯定也知道了,他们给出了一套解决方案 - 缓冲流

和字符流相同它也是对基础流的封装

还有一些其他的封装的流,就不过多介绍,大家可自行了解

利用 Scanner 进行字符读取

上述例子中,我们看到了对字符类型直接使用 InputStream 进行读取是非常麻烦且困难的,所以,我们 使用一种我们之前比较熟悉的类来完成该工作,就是 Scanner 类。

构造方法说明
Scanner(InputStream is, String charset)使用 charset 字符集进行 is 的扫描读取
import java.io.*;
import java.util.*;
// 需要先在项目目录下准备好一个 hello.txt 的文件,里面填充 "你好中国" 的内容
public class Main {public static void main(String[] args) throws IOException {try (InputStream is = new FileInputStream("hello.txt")) {try (Scanner scanner = new Scanner(is, "UTF-8")) {while (scanner.hasNext()) {String s = scanner.next();System.out.print(s);}}}}
}

上述代码使用了一种语法规则

try-with-resources语句是从Java 7版本开始引入的一种用于自动关闭资源的语法结构。通过try-with-resources语句,可以在try块中声明一个或多个资源,这些资源会在try块执行完毕后自动关闭,无需显式调用close()方法。

OutputStream 概述

OutputStream是Java中用于写入字节数据的抽象类。它是所有字节输出流类的超类,用于向各种目标(如文件、网络连接、内存缓冲区等)写入字节数据。

方法

修饰符及返回值类型方法签名说明
voidwrite(int b)写入要给字节的数据
voidwrite(byte[] b)将 b 这个字符数组中的数据全部写入 os 中
intwrite(byte[] b, int off, int len)将 b 这个字符数组中从 off 开始的数据写入 os 中,一共写 len 个
voidclose()关闭字节流
voidflush()重要:我们知道 I/O 的速度是很慢的,所以,大多的 OutputStream 为 了减少设备操作的次数,在写数据的时候都会将数据先暂时写入内存的 一个指定区域里,直到该区域满了或者其他指定条件时才真正将数据写 入设备中,这个区域一般称为缓冲区。但造成一个结果,就是我们写的 数据,很可能会遗留一部分在缓冲区中。需要在最后或者合适的位置, 调用 flush(刷新)操作,将数据刷到设备中。

和上面的inputStream相同,依然有FileOutputStream,Writer(字符流),BufferedOutputStream(缓冲流)

就不过多介绍了

PrintWriter封装OutPutStream

上述,我们其实已经完成输出工作,但总是有所不方便,我们接来下将 OutputStream 处理下,使用 PrintWriter 类来完成输出,因为 PrintWriter 类中提供了我们熟悉的 print/println/printf 方法

import java.io.*;
public class Main {public static void main(String[] args) throws IOException {try (OutputStream os = new FileOutputStream("output.txt")) {try (OutputStreamWriter osWriter = new OutputStreamWriter(os, "UTF8")) {try (PrintWriter writer = new PrintWriter(osWriter)) {writer.println("我是第一行");writer.print("我的第二行\r\n");writer.printf("%d: 我的第三行\r\n", 1 + 1);writer.flush();}}}}
}

三 . 小程序练习

1. 扫描指定目录,并找到名称中包含指定字符的所有普通文件(不包含目录),并且后续询问用户是否要 删除该文件

/*
*  遍历给定的目录,删除指定的文件
* */
public class SearchDirectory {private static final Scanner scanner = new Scanner(System.in);public static void main(String[] args) {// 1.让用户树入一个目录,后续的查找都是根据这个目录来进行的System.out.println("请输入你要查找的目录: ");File rootPath = new File(scanner.next());// 2.在让用户输入要搜索/删除的关键字System.out.println("请输入你要搜索/删除的关键字: ");String word = scanner.next();// 3.判断目录是否合法if(!rootPath.isDirectory()){System.out.println("您输入的目录不是合法目录!");return;}// 4.使用DFS遍历该目录scanDir(rootPath,word);}private static void scanDir(File rootPath, String word) {// 1.先列出当前目录包含哪些内容if(rootPath == null || rootPath.length() == 0){// 空目录或者非法目录return;}File[] files = rootPath.listFiles();for(File f : files){System.out.println(f.getAbsolutePath());if(f.isFile()){delete(f,word);}else{// 递归遍历scanDir(f,word);}}}private static void delete(File f, String word) {if(f.getName().contains(word)){System.out.println("是否要删除 "+f.getAbsolutePath()+" (Y/N)?");String next = scanner.next();if(next.equals("Y")||next.equals("y")){f.delete();}}}
}

2.进行普通文件的复制

/*
* 文件拷贝
* */
public class copyFile {public static void main(String[] args) throws IOException {// 1.输入源文件路径&&目标文件路径 并进行合法性判断Scanner sc = new Scanner(System.in);System.out.println("请输入源文件路径: ");File srcPath = new File(sc.next());if(!srcPath.isFile()){System.out.println("输入的源文件路径不合法!");return;}System.out.println("请输入目标文件路径: ");File destPath = new File(sc.next());// 不要求目标文件存在,但是必须保证目标文件的目录是存在的if(!destPath.getParentFile().isDirectory()){System.out.println("输入的目标文件路径不合法!");return;}// 2.开始拷贝try(InputStream inputStream = new FileInputStream(srcPath);OutputStream outputStream = new FileOutputStream(destPath)){while(true){byte[] bytes = new byte[1024];int n = inputStream.read(bytes);if(n == -1){break;}outputStream.write(bytes,0,n);}}}
}

总结

以上就是这篇博客的主要内容了,大家多多理解,下一篇博客见!

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

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

相关文章

gin框架使用系列之五——表单校验

系列目录 《gin框架使用系列之一——快速启动和url分组》《gin框架使用系列之二——uri占位符和占位符变量的获取》《gin框架使用系列之三——获取表单数据》《gin框架使用系列之四——json和protobuf的渲染》 一 、表单验证的基本理论 在第三篇中&#xff0c;我们介绍了如何…

Flink1.17实战教程(第四篇:处理函数)

系列文章目录 Flink1.17实战教程&#xff08;第一篇&#xff1a;概念、部署、架构&#xff09; Flink1.17实战教程&#xff08;第二篇&#xff1a;DataStream API&#xff09; Flink1.17实战教程&#xff08;第三篇&#xff1a;时间和窗口&#xff09; Flink1.17实战教程&…

C# LINQ

一、前言 学习心得&#xff1a;C# 入门经典第8版书中的第22章《LINQ》 二、LINQ to XML 我们可以通过LINQ to XML来创造xml文件 如下示例&#xff0c;我们用LINQ to XML来创造。 <Books><CSharp Time"2019"><book>C# 入门经典</book><…

uniapp 输入手机号并且正则校验

1.<input input“onInput” :value“phoneNum” type“number” maxlength“11”/> 3. method里面写 onInput(e){ this.phoneNum e.detail.value }, 4.调用接口时候校验正则 if (!/^1[3456789]\d{9}$/.test(this.phoneNum)) {uni.showToast({title: 请输入正确的手机号…

对于c++的总结与思考

笔者觉得好用的学习方法&#xff1a;模板法 1.采用原因&#xff1a;由于刚从c语言面向过程的学习中解脱出来&#xff0c;立即把思路从面向过程转到面向对象肯定不现实&#xff0c;加之全新的复杂语法与操作&#xff0c;着实给新手学习这门语言带来了不小的困难。所以&#xff…

【动画视频生成】

转自&#xff1a;机器之心 动画视频生成这几天火了&#xff0c;这次 NUS、字节的新框架不仅效果自然流畅&#xff0c;还在视频保真度方面比其他方法强了一大截。 最近&#xff0c;阿里研究团队构建了一种名为 Animate Anyone 的方法&#xff0c;只需要一张人物照片&#xff0…

数据结构与算法教程,数据结构C语言版教程!(第一部分、数据结构快速入门,数据结构基础详解)二

第一部分、数据结构快速入门&#xff0c;数据结构基础详解 数据结构基础&#xff0c;主要研究数据存储的方式。 本章作为数据结构的入门课程&#xff0c;主要让读者明白&#xff0c;数据结构到底是什么&#xff0c;常用的数据存储结构有哪些&#xff0c;数据结构和算法之间到底…

钉钉机器人接入定时器(钉钉API+XXL-JOB)

钉钉机器人接入定时器&#xff08;钉钉APIXXL-JOB&#xff09; 首先需要创建钉钉内部群 在群设置中找到机器人选项 选择“自定义”机器人 通过Webhook接入自定义服务 创建完成后会生成一个send URL和一个加签码 下面就是干货 代码部分了 DingDingUtil.sendMessageByText(webho…

【Python】ubuntu python>3.9编译安装,及多个Python版本并存的使用方法

【Python】ubuntu python3.9编译安装&#xff0c;及多个Python版本并存的使用方法 1. 安装依赖2. 编译与安装2.1 依赖与源获取2.2 配置2.3 编译2.4 安装2.5 链接动态库 3. 多版本兼容 1. 安装依赖 更新系统软件 在正式开始之前&#xff0c;建议首先检查系统软件是否均为最新&a…

构建高效数据中台:集群规划与搭建的最佳实践指南

架构设计 Rack(机架)配置建议 大数据集群规划 安装细节见配套文档 YARN资源管理平台队列调度策略 Capacity Scheduler 默认配置下,Capacity Scheduler 将尝试保证每个队列在其分配的容量内公平地使用资源。 然而,Hadoop 也支持通过调整队列的权重和使用抢占策略来优化资…

《Spring Cloud学习笔记:微服务保护Sentinel》

Review 解决了服务拆分之后的服务治理问题&#xff1a;Nacos解决了服务治理问题OpenFeign解决了服务之间的远程调用问题网关与前端进行交互&#xff0c;基于网关的过滤器解决了登录校验的问题 流量控制&#xff1a;避免因为突发流量而导致的服务宕机。 隔离和降级&#xff1a…

微信小程序开发系列-04获取用户图像和昵称

这个功能的实现对于我这个新手来说可谓是一波三折。该功能的实现经历了三个“版本”的迭代&#xff0c;我的运气不是很好&#xff0c;从第一个“版本”开始尝试&#xff0c;这篇文章也是记录下这个过程&#xff0c;以便其他新手能快速找到解决方案。 Gen1-getUserInfo 第一个…

音视频学习(二十二)——rtmp发流(tcp方式)

前言 本文主要介绍自研的RtmpStreamSender.dll&#xff0c;rtmp库提供接口接收裸流数据&#xff0c;支持将裸流数据封装为flv格式并通过rtmp协议发流。 关于rtmp协议基础介绍可查看&#xff1a;https://blog.csdn.net/www_dong/article/details/131026072 关于rtmp收流介绍可…

可视化云监控/安防监控系统EasyCVR视频管理平台播流失败的原因(端口篇)

安防视频监控EasyCVR平台兼容性强&#xff0c;可支持的接入协议众多&#xff0c;包括国标GB28181、RTSP/Onvif、RTMP&#xff0c;以及厂家的私有协议与SDK&#xff0c;如&#xff1a;海康ehome、海康sdk、大华sdk、宇视sdk、华为sdk、萤石云sdk、乐橙sdk等。平台能将接入的视频…

XIAO ESP32S3之物体检测加入视频流

一、前言 由于XIAO ESP32S3开发套件没有显示屏配件&#xff0c;因此加入http视频流功能&#xff0c;可通过浏览器请求ESP32S3上的视频流。 二、思路 1、XIAO ESP32S3启动后通过wifi连接到AP&#xff1b; 2、启动http服务器&#xff0c;注册get_mjpeg处理函数&#xff1b; 3…

ChatGPT在地学、GIS、气象、农业、生态、环境等领域中的高级应用

目录 ​专题一 开启大模型 专题二 基于ChatGPT大模型提问框架 专题三 基于ChatGPT大模型的数据清洗 专题四 基于ChatGPT大模型的统计分析 专题五 基于ChatGPT大模型的机器学习 专题六 基于ChatGPT大模型的科研绘图 专题七 基于ChatGPT大模型的GIS应用 专题八 基于基于C…

FTP原理与配置

FTP是用来传送文件的协议。使用FTP实现远程文件传输的同时&#xff0c;还可以保证数据传输的可靠性和高效性。 FTP的应用 FTP 提供了一种在服务器和客户机之间上传和下载文件的有效方式。在企业网络中部署一台FTP服务器&#xff0c;将网络设备配置为FTP客户端&#xff0c;则可…

在Ubuntu20.04配置PX4环境

目录 1.下载PX4源码2.安装PX4所有工具链3.编译PX4工程1.下载PX4源码 打开Ubuntu,Ctrl+Alt+T打开终端输入下面代码: git clone https://github.com/PX4/PX4-Autopilot.git --recursive出现上图中出现“Command ‘git’ not found, but can be installed with”,使用以下代码…

蓝桥杯嵌入式KEY

1.按键原理图 2.按键GPIO引脚设置成输入&#xff0c;上拉模式 3.设置TIM4时钟源为外部时钟源 PSC为80-1 Period为10000-1 打开NVIC 中断时间为10ms 4.在bsp文件中添加interrupt.c文件 5.按键单击代码 6.长按键 7.按键过程和显示过程

c语言结构体(初阶)

1. 结构体的声明 1.1 结构体的基础知识 结构是一些值的集合&#xff0c;这些值被称为成员变量。结构的每个成员可以是不同类型的变量。 1.2 结构的声明 struct tag {member - list; }variable-list; 例&#xff1a;描述一个人的信息&#xff1a;名字电话性别身高 //声明的…