文件:IO流

news2024/11/23 15:19:26

1. 什么是IO

  •  /O 即输入Input/ 输出Output的缩写,其实就是计算机调度把各个存储中(包括内存和外部存储)的数据写入写出的过程;
  • java中用“流(stream)”来抽象表示这么一个写入写出的功能,封装成一个“类”,都放在http://java.io这个包里面。

2. 如何理解这个 '流'

通过“流”的形式允许java程序使用相同的方式来访问不同的输入/输出源。stream是从起源(source)到接收的(sink)的有序数据。我们这里把输入/输出源对比成“水桶”,那么流就是“管道”,这个“管道”的粗细、单向性等属性也就是区分了不同“流”的特性。

 3.  认识文件

1.什么是文件

针对硬盘这种持久化存储的I/O设备,当我们想要进行数据保存时,往往不是保存成一个整体,而是独立成一个个的单位进行保存,这个独立的单位就被抽象成文件的概念,这就叫做文件

文件管理 采用的是树形结构,是N叉树,至于目录,其实就是文件夹

2. 文件路径

路径分为绝对路径和相对路径:

绝对路径:从树的根部开始查找

相对路径:从树的某一个节点为基准进行查找

文件分为文本文件和二进制文件:

文本文件就是放在记事本上能看懂的,比如.txt文件

二进制文件就是放在记事本上看不懂的,比如.docx,.jpg,.image等

4. 文件操作类

Java标准库为我们提供了 File 这个类;

File 对象是文件操作的一个抽象表示:文件是存储在硬盘上的,不太方便。直接在内存中创建一个对应的对象,操作到这个内存对象,就可以间接的影响到硬盘的文件情况了。

File 类的属性:

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

File 类的构造方法:

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

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 运行结束时才会进行

还有其他的方法,我们要用到时,可以自己去查,而且我们看名字其实就可以知道这些方法的作用了。

具体的代码演示我在这里不过多演示。

文件内容操作:

计算机对文件操作有很多种操作,我们将其分为很多组类。

  1. 针对文本文件操作提供了一组类,统称为 " 字符流 "(典型代表:Reader、Writer)读写的基本单位是字符。
  2. 针对二进制文件操作提供了一组类,统称为 " 字节流 "(典型代表:InputStream、OutputStream) 读写的基本单位是字节。

流的原理解析:

流其实我们可以想象成一个“水管”,源端和目的端就是两个“水桶”,数据是通过这个“水管”进行流动传输的,以InputStream和Reader为例,水管的每个“水滴”就是具体的数据,如果是字节流,那么一个“水滴”就是一个字节,如果是字符流,那么一个“水滴”就是一个字符。

当创建一个流对象的时候,如fis=new FileInputStream(“…\xx\xx.txt”),记录指针来表示当前正准备从哪个“水滴”开始读取,每当程序从InputStream或者Reader里面取出一个或者多个“水滴”后,记录指针自定向后移动;除此之外,InputStream和Reader里面都提供了一些方法来控制记录指针的移动。

如果是处理流的话,就相当于在这个水管上面装了一些“控制阀门”,最终用户只要关心“阀门”具备的能力就行

 

 按照流的流向来分,可以分为输入流和输出流。输入,输出都是从程序运行所在内存的角度来划分的。

  1. 输入流:只能从中读取数据,而不能向其写入数据,由InputStream和Reader作为基类。
  2. 输出流:只能向其写入数据,而不能从中读取数据。由OutputStream和Writer作为基类。

按照流的角色来分,可以分为节点流和处理流。

  1. 节点流:可以从向一个特定的IO设备(如磁盘、网络)读/写数据的流。也被称为低级流。
  2. 处理流:用于对一个已存在的流进行连接或封装,通过封装后的流来实现数据读/写功能。也称为高级流

java.io 这个包下有很多流,我们不需要一个个去看,很多时候知道原理,直接去查就可以了,我去抄一张人家大佬总结出来的图:

接下来介绍四种常见的流。

Java IO流四大家族:

四大家族的首领:

  • java.io.InputStream 字节输入流
  • java.io.OutputStream 字节输出流
  • java.io.Reader 字符输入流
  • java.io.Writer 字符输出流

四大家族的首领都是抽象类。(abstract class):

 所有的流都实现了:

java.io.Closeable接口,都是可关闭的,都有close()方法: 

有的输出流都实现了:

java.io.Flushable接口,都是可刷新的,都有flush()方法。刷新一下。这个刷新表示将通道/管道当中剩余未输出的数据。作用就是清空管道。没有flush()可能会导致丢失数据。

在java中只要“类名”以Stream结尾的都是字节流。以“Reader/Writer”结尾的都是字符流。

四大家族首领常用方法:

1.InputStream(字节输入流)

  1. void close() 关闭此输入流并释放与该流关联的所有系统资源。
  2. abstract int read() 从输入流读取下一个数据字节。
  3. int read(byte[] b) 从输入流中读取一定数量的字节并将其存储在缓冲 区数组 b 中。
  4. int read(byte[] b, int off, int len) 将输入流中最多 len 个数据字节读入字节数组。

2.OutputStream(字节输出流)

  1. void close() 关闭此输出流并释放与此流有关的所有系统资源。
  2. void flush() 刷新此输出流并强制写出所有缓冲的输出字节。
  3. void write(byte[] b) 将 b.length 个字节从指定的字节数组写入此输出 流。
  4. void write(byte[] b, int off, int len) 将指定字节数组中从偏移量 off 开始的 len 个字 节写入此输出流。
  5. abstract void write(int b)将指定的字节写入此输出流。

3.Reader(字符输入流)

  1. abstract void close() 关闭该流。
  2. int read() 读取单个字符。
  3. int read(char[] cbuf) 将字符读入数组。
  4. abstract int read(char[] cbuf, int off, int len) 将字符读入数组的某一部分

4.Writer(字符输出流)

  1.  Writer append(char c) 将指定字符追加到此 writer。
  2. abstract void close() 关闭此流,但要先刷新它。
  3. abstract void flush() 刷新此流。
  4. void write(char[] cbuf) 写入字符数组。
  5. abstract void write(char[] cbuf, int off, int len) 写入字符数组的某一部分。
  6. void write(int c) 写入单个字符

具体的代码这里就不演示了。

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

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

相关文章

Vue学习笔记(7. axios异步请求)

1. axios请求方式 方式1:axios({method:"GET",url:"..."}) 方式2:axios({method:"POST",url:"...",data:"..."}) 方式3:axios.get("url...") 方式4:axios.post(…

Python中的35个关键字

✅作者简介:CSDN内容合伙人、阿里云专家博主、51CTO专家博主、新星计划第三季python赛道Top1🏆 📃个人主页:hacker707的csdn博客 🔥系列专栏:零基础入门篇 💬个人格言:不断的翻越一座…

【 Spring MVC 核心功能(二) - 获取参数(下)】

文章目录一、使用 RequestBody 接收JSON对象二、使用 RequestPart 上传⽂件三、获取 Cookie四、获取 Header五、存储和获取 Session5.1 存储 Session5.2 获取 Session一、使用 RequestBody 接收JSON对象 有时客户端会通过 post 方式发送 json 格式的请求,那后端就可…

2.3.5双链表

单链表vs双链表 就是既有前驱指针也有后继指针,由line改为double。 双链表的插入怎么实现? s->nextp->next; p->next->priors s->priorp //把p赋给s的前驱指针指向的位置 p->nexts; 如果p刚好是最后一个元素。 p->next->prio…

基于ArcGIS的电子地图矢量化方法

一、电子地图及纸质地图矢量化的目的 地图数据来源有很多,其中栅格数据数字化是地图数据的重要来源。栅格数据的矢量化包括地理配准以及矢量化。矢量化后的地图数据往往可以为我们的空间统计分析提供实验依据,从而探究地理分布的时空差异性。 空间参考&a…

完整指南:如何安装Man手册

Man手册简介 man手册是Unix和类Unix操作系统中的命令行工具,用于提供关于特定命令、函数和文件的帮助文档。它通常包含命令的语法、选项、参数、示例以及其他相关信息。man手册可以通过在终端输入"man"命令,后跟要查看的命令或函数名称来访问…

huggingface transformer模型介绍

总结: 模型提高性能:新的目标函数,mask策略等一系列tricks Transformer 模型系列 自从2017,原始Transformer模型激励了大量新的模型,不止NLP任务,还包括预测蛋白质结构,时间序列预测。 有些模…

灌区流量监测设备-中小灌区节水改造

系统概述 灌区信息化管理系统主要对对灌区的水情、雨情、土壤墒情、气象等信息进行监测,对重点区域进行视频监控,同时对泵站、闸门进行远程控制,实现了信息的测量、统计、分析、控制、调度等功能。为灌区管理部门科学决策提供了依据&#xf…

Python 无监督学习实用指南:6~10

原文:Hands-on unsupervised learning with Python 协议:CC BY-NC-SA 4.0 译者:飞龙 本文来自【ApacheCN 深度学习 译文集】,采用译后编辑(MTPE)流程来尽可能提升效率。 不要担心自己的形象,只关…

23年5月高项学习笔记12 —— 干系人管理

过程: 1. 识别干系人:定期识别干系人,分析和记录他们的利益,参与度、相互依赖性、影响力和对项目的潜在的影响 输入:立项管理文件、沟通管理计划、干系人参与计划、需求文件、变更日志、问题日志、协议(协…

今天给大家介绍一篇基于springboot的医院管理系统的设计与实现

临近学期结束,你还在做java程序网络编程,期末作业,老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。这里根据疫情当下,你想解决的问题,今天给大家介绍一篇基…

2023/4/10总结

线段树 线段树是一种二叉树,通俗易懂的来说就是对于一个线段,我们会用一个二叉树来表示。线段树是一种工具,她能把对区间(线段)的修改与维护从0(N)的时间复杂度变成0(logN)。 如图: 如上图,我…

MYSQL SQL语句优化技术技巧

MySQL是一种流行的关系型数据库管理系统,它提供了各种各样的SQL语句优化技术,下面是一些常见的优化技巧: 1. 使用索引 索引可以大大提高查询性能。在MySQL中,可以使用CREATE INDEX语句在列上创建索引。当查询包含WHERE子句并且…

Google SEO 搜索中心

在公司发展还没有那么成熟的时候,也许你的测试网站是外网可以公开访问的,也许你网站中的机密图片在测试环境(不小心上到正式环境)却被搜索引擎无情抓取,以及有些内部用户才能使用的网址,你并不想被搜索引擎…

明着呼吁暂停,暗着囤积GPU,马斯克暗度陈仓玩得溜

众所周知,此前马斯克纠集了上千名科技工作者对生成式人工智能的深度训练表示了质疑,呼吁暂停继续对深度人工智能的训练,哪怕先暂停六个月。呼吁的尘埃还没有彻底落地,就传出了马斯克已经悄悄地囤积了上万枚GPU,构建自己…

《花雕学AI》15:BingGPT桌面端——尝鲜体验ChatGPT4.0同源技术新Bing的最新成果

引言: 本文将介绍 BingGPT桌面端的开发背景和目的,以及它与新 Bing 的关系和区别。本文还将说明BingGPT桌面端的主要功能和特点,以及如何下载、安装和使用。最后,本文将评价 BingGPT桌面端对于新 Bing 的人工智能聊天功能的推广和…

dolphinscheduler资源中心

资源中心 资源中心介绍 资源中心提供文件管理,UDF管理,任务组管理。 文件管理可以访问要执行的hive的sql文件 UDF管理可以放置fllink执行的自定义udf函数jar包,hive自定义的UDF函数jar包 以上的*.sql,*.jar文件可以理解为资源&#xff0c…

三本小书的前言

所有的事情既是好事也是坏事,人工智能也不例外;所有的事情既是坏事也是好事,人类智慧也不例外。《追问人工智能:从剑桥到北京》前 言一个地方不在大小,关键看有无灵气,剑桥就是这样一个神奇的地方&#xff…

第三章_Redis的十大数据类型

which 10 官网:https://redis.io/docs/data-types/ 一图说明 提前声明 这里说的数据类型是value的数据类型,key的类型都是字符串 十大数据类型分别是 redis字符串(String) String(字符串)。 string是…

USRP B210同步采集

MIMO Multiple Input Multiple Output的缩写,通过多只天线同时进行收发,增加无线网络基地台的涵盖范围。 MIMO(多输入多输出)是一项关键的无线技术,它可以将一个传输信号分割成多个流,而这些流则分散地传…