文件IO——01

1. 认识文件

1)文件概念

“文件”是一个广义的概念,可以代表很多东西

操作系统里,会把很多的硬件设备和软件资源抽象成“文件”,统一管理

但是大部分情况下的文件,都是指硬盘的文件(文件相当于是对“硬盘”数据的一种抽象)

机械硬盘(HDD)适合顺序读取(磁头移动需要时间)

固态硬盘(SSD)内部是集成程度很高的芯片

2)目录

 一台计算机上有很多文件,这些文件是通过“文件系统”(操作系统提供的模块)来进行组织的

操作系统,使用“目录”(文件夹)这样的结构来组织文件

目录内部可能还包含其他的文件/目录

3)文件路径

可以通过文件路径,来确定当前文件具体所在的位置

1. 绝对路径:以 C: D: 盘开头

2. 相对路径:先指定一个目录作为基准目录,从基准目录出发,看沿着怎样的路径能找到指定的文件。一般以 . 或者 .. 开头( . 的情况可省略)

 .  当前目录

 ..  当前目录的上一级目录

如果是命令行进行操作,基准目录,就是当前所处的目录

如果是图形化界面的程序,基准目录就不好判断了

对于IDEA来说,基准目录,就是项目目录

4)文件类型

从编程的角度看:

1. 文本——文件中保存的数据,都是字符串,保存的内容,都是合法字符

2. 二进制——文件中保存的数据,仅仅是二进制数据,包要求保存的内容是合法字符

合法字符涉及字符集/字符编码

如 utf8:

有一个大的表格(码表),列出什么字符,对应到什么编码

如果文件是 utf8 编写的,此时文件的每个数据都是合法的 utf8 编码的字符 ——文本文件

如果存在一些不是 utf8 合法字符的情况——二进制

判断文件的类型——>

直接使用记事本打开这个文件,如果是乱码,文件就是二进制,否则就是文本

记事本就是尝试按照字符的方式来展示内容,这个过程会自动查码表

写代码时,文本文件和二进制文件的编码方式不同 

2. Java 中操作文件

1. 文件系统的操作:                                        File

创建文件,删除文件,判断文件是否存在,判断文件类型,重命名

2. 文件内容的操作:                                        流对象

读文件/写文件

1)File 概述(文件系统操作)

属性

修饰符积累性属性说明
static StringpathSeparator

依赖于系统的路径分隔符,

String 类型的表示

static charpathSeparator

依赖于系统的路径分隔符,

char 类型的表示

pathSeparator 是一个路径中用来分割目录的符号

Windows =>   \ 和 /

Linux =>         /

一般还是使用 / ,使用 \ 在代码中要搭配转义字符使用

构造方法

签名说明
File(File parent,String child)

根据父目录+孩子文件,

创建一个新的对象

File(String pathname)

根据文件路径创建一个新的实例,

路径可以是绝对路径或相对路径

File(String parent,Strinf child)

根据父目录+孩子文件路径创建实例,

父目录用路径表达式

1)一个File对象,就表示一个硬盘上的文件

在构造对象的时候,就需要把这个文件的路径指定进来(绝对路径/相对路径都可以)

2)文件名 = 前缀 + 扩展名

使用路径构造对象,一定要把前缀和扩展名都带上

方法

修饰符及返回值类型方法签名说明
StringgetParent()

返回File对象的父目录

文件路径

StringgetName()返回File对象的纯文件名称
StringgetPath()返回File对象的文件路径
StringgetAbsolutePath()返回File对象绝对路径的
StringgetCanonicalPath()

返回File对象的修饰过的

绝对路径

booleanexist()

返回File对象描述的文件是否

真实存在

booleanisDirectory()

返回File对象代表的文件是否是

一个目录

booleanisFile()

返回File对象代表的文件是否是

一个普通文件

booleancreateNewFile()

根据File对象,自动创建一个

空文件,创建成功后返回true

booleandelete()

根据File对象,删除该文件,

成功删除后返回true

voiddeleteOnExit()

根据 File 对象,标注文件将被删除,删除动作会到 JVM 运行结束时才会进行

String[]list()

返回File对象代表的目录下的

所有文件名

File[]listFile()

返回File对象代表的目录下的所有文件,以File对象表示

booleanmkdir()创建File对象代表的目录
booleanmkdirs()创建File对象代表的目录,如果必要,会创建中间目录
booleanrenameTo(File dest)进行文件(剪切,粘贴操作)
booleancanRead()判断用户是否对文件有可读的权限
booleancanWrite()判断用户是否对文件有可写的权限

Windows上的盘符不分大小写

getCanonicalPath()  针对绝对路径进行简化后得到的路径

对IDEA来说,基准目录就是项目所在的目录

绝对路径就是把当前的相对路径拼接到基准目录上

System.out.println(files);

打不出数组内容,是数组的哈希值

在JVM上层,Java代码中,没有任何办法获取到“内存地址”

要想拿到内存地址,只能靠native方法进入到JVM内部,通过C++代码获取到

System.out.println(Arrays.toString(files));

会打印出系统自带的特殊目录,不让用户感知到,防止被随意修改

2)文件内容的读写 —— 数据流

流对象(文件内容操作)

在标准库中,提供的读写文件的流对象(stream)有很多类,可以归结到两个大的类别中:

1. 字节流(对应二进制文件)

每次读/写的最小单位,是“字节”(8bit)

InputStream         OutputStream

2. 字符流 (对应文本文件)

每次读/写的最小单位,是“字符”(一个字符可能对应多个字节)

本质上是对字节流的又一层封装,把文件中几个相邻的字节,转换成一个字符(自动查字符集表)

Reader          Writer

GBK,一个中文字符集 => 两个字节

utf8,一个中文字符集 => 三个字节

输入/输出是站在CPU的角度上:       输出——>读         输入——>写

1. Reader 类

Reader 是抽象类,不能new实例,只能new子类                 标准库已经提供了现成的类

创建Reader对象的过程,就是”打开文件“的过程                  文件不存在就就会打开失败

1. 无参数 read:一次读取一个字符

2. 一个参数 read:一次读取若干个字符,会把参数指定的 cbuf 数组给填充满

4. 三个参数 read :一次读取若干个字符,会把参数中的 cbuf 数组,从off位置开始,到len的范围尽量填满

1)把这个 cbuf 空数组(不是null,没有实际意义的数组)尽量填满

2)使用 close 方法,是为了释放文件描述符(PCB)——>

顺序表(数组)

进程每次打开文件,都需要在这个表里分配一个元素,这个数组的长度是存在上限的

当数组占满后再尝试打开文件,会触发文件资源泄露(类似内存泄漏)

3)read 返回值是 int 表示读取的字符数,若文件读完了,返回 -1

reader.close();

该方法可能会执行不到,如果程序出现逻辑错误,会报异常终止程序,调用不到 close

可以使用

try{}finally{reader.close();
}                                      //但过于繁琐,不够优美

try{

}                                                                    // try with resources

 () 中定义的变量,会在 try 代码结束的时候(正常结束,还是抛出异常),自动调用其中的 close 方法

要求写到 () 里的对象必须实现 Closeable 借口 ——流对象都可以这么写

 

在Java标准库内部,对于字符编码做了很多的处理:

1)只使用char,此时使用的字符集固定是 unicode

若使用String,此时会自动把每个字符的 Unicode 转换成 utf8

2)char[] c 包含的每个字符都是 unicode 编码的

String s = new String(c); 一旦使用这个字符数组构成String,就会在内部把每个字符都转换成 utf8 ,可配置

s.charAt(i) 也会把对应的 utf8 的数据,转换成 unicode

3)把多个 unicode 联系放到一起,难以区分从哪到哪是一个完整的字符

utf8 可以做到区分

可以认为 utf8 是针对连续多个字符进行传输时的一种改进方案

2. Write 类

1. 一次写一个字符

2. 一次写一个字符串

3. 一次写多个字符(字符数组)

4,5. offset 是从数组/字符串中的第几个字符开始写 

Write 写入文件,默认情况下会把原文件的内容清空掉

若不想清空,需要在构造方法中添加一个参数

此时回见内容写到原有文件的末尾

3. OutputStream类

和 Write 类似, OutputStream 打开一个文件,默认会清空文件的原有内容

写入的数据,会成为文件中的新数据

若不想清空,可以使用追加写的方式(在构造方法中,第二个参数传入 true )

此处已经写入了字符串,但在文件中却未写入

缓冲区

PrintWriter 这样的类,在进行写入的时候,不一定是直接写硬盘,而是先把数据写入到一个内存构成的“缓冲区”中(buffer) ——引入缓冲区是为了提高效率,减少读硬盘的次数

当写入缓冲区后,如果还没来及将缓冲区的数据写入硬盘,进程就结束了,此时数据就丢了

有时候需要手动使用 flush 方法将数据写入硬盘 ——刷新缓冲区

 

4. InputStream类

以上是将文件中的数据全部读完的两种方式,前者的IO次数更少,性能更好

Scanner 进行字符读取
Scanner(InputStream is, String charset)          使用 charset 字符集进行 is 的扫描读取

文件练习

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

1)list 列出目录内容

2)判断文件类型

3)删除文件

找到目录中的所有文件,以及子目录中的所有文件,只要遇到子目录就往里找

可以使用“递归”的方式,把所有的子目录都扫描一遍

 

 

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

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

相关文章

安装 pytorch lighting

1 搜寻配对版本 进入lighting官网,查看配对版本 比如我就选择Python3.11、torch2.4、lightning2.4.0 2 搜寻pytorch安装命令 进入pytorch官网,查看以前版本的下载命令 注意要选择是 gpu版本的pytorch查看自己显卡驱动命令:nvidia-smi查看…

2030. gitLab A仓同步到B仓

文章目录 1 A 仓库备份 到 B 仓库2 B 仓库修改main分支的权限 1 A 仓库备份 到 B 仓库 #!/bin/bash# 定义变量 REPO_DIR"/home/xhome/opt/git_sync/zz_xx_xx" # 替换为你的本地库A的实际路径 REMOTE_ORIGIN"http://192.168.1.66:8181/zzkj_software/zz_xx_xx.…

在GITHUB上传本地文件指南(详细图文版)

这份笔记简述了如何在GITHUB上上传文件夹的详细策略。 既是对自己未来的一个参考,又希望能给各位读者带来帮助。 详细步骤 打开目标文件夹(想要上传的文件夹) 右击点击git bash打开 GitHub创立新的仓库后,点击右上方CODE绿色按…

[每周一更]-(第126期):MQ解耦场景

消息队列(MQ)解耦是一种软件架构设计模式,主要通过中间件将系统中的生产者和消费者模块分离,减少模块之间的直接依赖,使系统具有更高的扩展性和灵活性。这种模式尤其适用于需要处理复杂业务逻辑、频繁请求或异步处理的…

学习Python的笔记--面向对象-继承

1、概念 多个类之间的所属关系,即子类默认继承父类的所有属性和方法。 注:所有类默认继承object类,object类是顶级类或基类; 其他子类叫做派生类。 #父类A class A(object):def __init__(self):self.num1def info_print(self)…

操作系统基本管理

操作系统基本原理 计算机的操作地位 文件系统 若某文件系统的目录结构如下图所示,假设用户要访问文件rw.dll,且当前工作目录为 stools 三态模型 进程管理 位示图 (23)4096/321129 (24)200*1024/1/326400 PV操作&a…

基于框架的逻辑回归:原理、实现与应用

目录 ​编辑 逻辑回归原理 损失函数与优化 正则化 基于框架的实现 1. 数据预处理 2. 模型初始化与训练 3. 模型评估与调优 4. 特征缩放 逻辑回归的应用 信用评分 医疗诊断 垃圾邮件识别 推荐系统 结论 在机器学习领域,逻辑回归是一种基础且强大的分类…

对 JavaScript 说“不”

JavaScript编程语言历史悠久,但它是在 1995 年大约一周内创建的。 它最初被称为 LiveScript,但后来更名为 JavaScript,以赶上 Java 的潮流,尽管它与 Java 毫无关系。 它很快就变得非常流行,推动了 Web 应用程序革命&…

Day7 苍穹外卖项目 缓存菜品、SpringCache框架、缓存套餐、添加购物车、查看购物车、清空购物车

目录 1.缓存菜品 1.1 问题说明 1.2 实现思路 1.3 代码开发 1.3.1 加入缓存 1.3.2 清除缓存 1.3.2.1 新增菜品优化 1.3.2.2 菜品批量删除优化 1.3.2.3 修改菜品优化 1.3.2.4 菜品起售停售优化 1.4 功能测试 1.4.1 加入缓存 1.4.2 菜品修改 1.5 代码提交 2.缓存套餐 2.1 Spring C…

【认证法规】安全隔离变压器

文章目录 定义反激电源变压器 定义 安全隔离变压器(safety isolating transformer),通过至少相当于双重绝缘或加强绝缘的绝缘使输入绕组与输出绕组在电气上分开的变压器。这种变压器是为以安全特低电压向配电电路、电器或其它设备供电而设计…

电子应用设计方案-44:智能电饭锅系统方案设计

智能电饭锅系统方案设计 一、引言 随着科技的不断进步和人们生活水平的提高,对电饭锅的功能和智能化要求也越来越高。智能电饭锅不仅能够实现自动烹饪,还能提供多种烹饪模式和个性化设置,满足用户对美食的多样化需求。 二、系统概述 1. 系统…

a8204 基于微信小程序的音乐播放器微信小程序的研究与实现 服务器端Java+Mysql+Servlet 文档 源码

音乐播放微信小程序 1.项目描述2. 绪论3.项目功能4.界面展示5.源码获取 1.项目描述 随着科技的发展,手机在我们生活中起到了重要的作用。软件作为手机重要的一部分,用户体验显得尤为重要。微信小程序一起操作便捷、用户基数大、分享便利、既用即走等特点…

SpringBoot 开源停车场管理收费系统

一、下载项目文件 下载源码项目文件口令: 【前端小程序地址】(3.0):伏脂火器白泽知洞座/~6f8d356LNL~:/【后台管理地址】(3.0):伏脂火器仇恨篆洞座/~0f4a356Ks2~:/【岗亭端地址】(3.0):动作火器智汇堂多好/~dd69356K6r~:/复制口令…

11.17【大数据】Hadoop【DEBUG】

列出hdfs文件系统所有的目录和文件 主节点上 子结点 是一样的 *为什么能登进 slave 02 的主机,但是 master 当中依然显示 slave 02 为 DeadNode?* hadoop坏死节点的重启_hadoop3 子节点重启-CSDN博客 注意hadoop-daemon.sh 实际上位于 Hadoop 的 sbin 目录中,而不…

ffmpeg转码与加水印

文章目录 转码 与加水印引入jar包代码ffmpeg安装错误解决方法 转码 与加水印 引入jar包 <dependency><groupId>net.bramp.ffmpeg</groupId><artifactId>ffmpeg</artifactId><version>0.6.2</version></dependency>代码 impo…

MongoDB复制(副本)集实战及原理分析

MongoDB复制集 复制集架构 在生产环境中&#xff0c;不建议使用单机版的MongoDB服务器。原因如下&#xff1a; 单机版的MongoDB无法保证可靠性&#xff0c;一旦进程发生故障或是服务器宕机&#xff0c;业务将直接不可用。一旦服务器上的磁盘损坏&#xff0c;数据会直接丢失&…

node.js中跨域请求有几种实现方法

默认情况下&#xff0c;出于安全考虑&#xff0c;浏览器会实施同源策略&#xff0c;阻止网页向不同源的服务器发送请求或接收来自不同源的响应。 同源策略&#xff1a;协议、域名、端口三者必须保持一致 <!DOCTYPE html> <html lang"en"> <head>&l…

无网通信 | 原理分析 / 应用

注&#xff1a;本文为“无网通信”相关几篇文章合辑。 到底什么是 “无网通信”&#xff1f; 原创 小枣君 鲜枣课堂 2024 年 10 月 30 日 18:18 江苏 最近智能手机市场迎来了一波发布热潮&#xff0c;在发布会现场&#xff0c;厂商们展示了令人眼花缭乱的各种参数和概念。其中…

PyQt事件机制及其应用

一、实例前置 一个小闹钟应用 创建主窗口类 首先我们创建了一个名为AlarmClock的类&#xff0c;它继承自QMainWindow。这个类将包含我们的GUI组件和逻辑。 from Alarm_clock import Ui_MainWindowclass AlarmClock(QMainWindow):def __init__(self):super().__init__()# 初始化…

福昕PDF低代码平台

福昕PDF低代码平台简介 福昕PDF 低代码平台是一款创新的工具&#xff0c;旨在简化PDF处理和管理的流程。通过这个平台&#xff0c;用户可以通过简单的拖拽界面上的按钮&#xff0c;轻松完成对Cloud API的调用工作流&#xff0c;而无需编写复杂的代码。这使得即使没有编程经验的…