【Java】文件IO

简介: 【Java】文件IO

文件

硬盘

系统管理文件,引入一个额专门的模块,“文件系统”,每个文件都有一个“路径”描述文件所在位置

一、什么是文件

此处谈到的文件,本身有多重含义

狭义的文件,特质硬盘上的文件(以及保存文件的目录)

  • 目录就是平时所说的“文件夹”,专业术语叫“目录”,目录也是属于文件

广义的文件,计算机上的很多硬件设备软件资源,在操作系统中,都会被视为“文件”

  • 标准输入(键盘,System. in)
  • 标准输出(控制台,System. out)
  • 打印机
  • 网卡,操作网络的代码,和操作普通文件,都是非常相似的

二、硬盘

硬盘和内存的对比

空间 速度 成本 数据
硬盘 持久储存
内存 断电后丢失

为什么硬盘的速度慢?


这和它硬件的物理结构直接相关

当下硬盘主要分两类:

1. 机械硬盘

  • 盘片
  • 存储数据的介质
  • 通电之后,就会快速旋转,转速影响到读取数据的速度(7200 转/min、5200 转/min…)
  • 磁头:
  • 可以移动到盘片上的仍以位置进行数据读写
  • 数据的读写时,盘片一边高速旋转,磁头一边不停移动,两者相互配合,完成数据的读写操作

机械硬盘在进行顺序读写时,效率是相对比较高的,因为磁头不用动,盘片高速旋转就好了

但是在随机读写(指哪打哪)的时候,效率就比较低。因为会涉及到磁头移动,就需要克服惯性去做功

在服务器领域,机械硬盘仍然是一个主流的应用场景

机械应盘自己不要拆开!一旦拆开,就报废了。机械硬盘的拆解和维修必须在专门的无尘环境下进行

否则上面落灰尘之后,之后磁盘运行,高速旋转的盘片和移动的磁头将与灰尘碰撞,产生一个很大的冲量,从而将磁头破坏

2. 固态硬盘

  • 大部分电脑上都是这个
  • 更接近于“内存”通过大规模的集成电路,实现的存储功能
  • 固态硬盘能比机械硬盘快 10-20 倍左右
  • 机械硬盘典型的速度,每秒读写 300MB 左右
  • 固态硬盘,每秒达到 3G-6G 都是不难的,好一点的固态,速度能达到 7G-8G

如果你要买固态硬盘,一方面要关注存储容量,也要关注读写速度

对于硬盘来说,尤其是机械硬盘,擅长顺序读写,不擅长随机读写。虽然在固态硬盘上有所改善,但整体来说,固态硬盘的随机读写能力,仍然是非常逊色于内存的

三、文件路径

在一个电脑上,有很多文件,都是需要考操作系统,进行组织管理的

操作系统专门有一个模块,“文件系统

  • 一般是通过“文件资源管理器”这个程序,观察到文件系统管理的文件,就是“此电脑

文件系统上的目录结构,是一个“树形结构”,不是二叉树,是“N叉树”

基于上述的结构,我们就可以找到某个文件在电脑上的具体位置

路径中,就约定使用分隔符,分割目录和目录:

  • \(反斜杠)
  • /(斜杠)
    绝大部分系统,都是使用斜杠 \ 作为目录的分隔符,只有 Windows 两种斜杠都能用

路径,也可以认为是文件的一种身份标识,通过标识,区分出唯一的一个文件

表示路径的两种风格

  • 绝对路径,从盘符开始,一直到文件名结束(D:\My Computer\02 Stricky\02 Code\03 IDEA\Gitee\java_code
  • 相对路径,谈到相对路径,必然有一个“参考系”,就是有一个“基准路径”或“工作路径”,如果基准目录不同,对应的相对路径也是不同的
  • 比如,此时正在 D:\My Computer\02 Stricky\02 Code\03 IDEA\Gitee\java_code 目录下,要在此目录下找到 240811-Thread 文件,就只需要输入 .\240811-Thread

作为程序员,常用的路径形式都是相对路径。因为绝对路径只适合自己的机器,一旦把你的代码换到比尔呢的机器上,如果代码依赖绝对路径,就可能你自己的电脑上能跑,别人的电脑上跑不起来(这里的绝对路径只在你自己电脑上存在,别人的机器上不存在)

一个程序能正常运行,不仅仅取决于代码,也取决于代码的运行环境。(操作系统版本,第三方库,配置文件,其他目录文件,硬件设备…)

四、文件类型

文本文件.txt/.c/.java

  • 当前文件里存储的所有内容都是“文本”(合法的字符)
  • 虽然叫做文本文件,本质上内部存的还是二进制(0101010),但这些二进制数据都“有据可查”,都可以在字符集中找到合法合理的字符

二进制文件.docx/.exe/.dll/.mp3/.mp4/.class

  • 对应的,文件内容在字符集对应的表格中查不到合法合理的字符

[!quote] 字符编码方式(字符集)

中文 UTF8/GBK,字符编码都是很大的“表格”

一个简单粗暴的方式,判断是什么文件:

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

针对文本文件来说,其实 Java 已经进行了很多的内置处理。虽然文本文件底层仍然是二进制存储,Jav 啊把文本文件取出来的时候,自动查询码表,把二进制内容一个个转换成字符。而二进制文件则没有上述的转换过程


相关文章
|
4月前
|
监控 Java API
现代 Java IO 高性能实践从原理到落地的高效实现路径与实战指南
本文深入解析现代Java高性能IO实践,涵盖异步非阻塞IO、操作系统优化、大文件处理、响应式网络编程与数据库访问,结合Netty、Reactor等技术落地高并发应用,助力构建高效可扩展的IO系统。
133 0
|
1月前
|
Java Unix Go
【Java】(8)Stream流、文件File相关操作,IO的含义与运用
Java 为 I/O 提供了强大的而灵活的支持,使其更广泛地应用到文件传输和网络编程中。!但本节讲述最基本的和流与 I/O 相关的功能。我们将通过一个个例子来学习这些功能。
139 1
|
3月前
|
Java 测试技术 API
Java IO流(二):文件操作与NIO入门
本文详解Java NIO与传统IO的区别与优势,涵盖Path、Files类、Channel、Buffer、Selector等核心概念,深入讲解文件操作、目录遍历、NIO实战及性能优化技巧,适合处理大文件与高并发场景,助力高效IO编程与面试准备。
|
3月前
|
SQL Java 数据库连接
Java IO流(一):字节流与字符流基础
本文全面解析Java IO流,涵盖字节流、字符流及其使用场景,帮助开发者理解IO流分类与用途,掌握文件读写、编码转换、异常处理等核心技术,通过实战案例提升IO编程能力。
|
4月前
|
存储 Java Linux
操作系统层面视角下 Java IO 的演进路径及核心技术变革解析
本文从操作系统层面深入解析Java IO的演进历程,涵盖BIO、NIO、多路复用器及Netty等核心技术。分析各阶段IO模型的原理、优缺点及系统调用机制,探讨Java如何通过底层优化提升并发性能与数据处理效率,全面呈现IO技术的变革路径与发展趋势。
93 2
|
4月前
|
监控 Java API
Java语言按文件创建日期排序及获取最新文件的技术
这段代码实现了文件创建时间的读取、文件列表的获取与排序以及获取最新文件的需求。它具备良好的效率和可读性,对于绝大多数处理文件属性相关的需求来说足够健壮。在实际应用中,根据具体情况,可能还需要进一步处理如访问权限不足、文件系统不支持某些属性等边界情况。
241 14
|
5月前
|
XML JSON Go
Go语言中的文件与IO:JSON、CSV、XML处理
本文介绍了 Go 语言中对 JSON、CSV 和 XML 三种常见数据格式的处理方法。通过标准库 `encoding/json`、`encoding/csv` 和 `encoding/xml`,可以实现结构体与数据格式之间的序列化与反序列化。JSON 适合 Web API 和前后端通信,因其清晰易读;CSV 适用于表格数据和轻量级交换;XML 则支持复杂嵌套结构,常用于配置文件和 SOAP 协议。文中提供代码示例,涵盖基本使用、嵌套结构处理及实战建议,帮助开发者高效操作这些格式。
|
4月前
|
存储 Java 编译器
深入理解Java虚拟机--类文件结构
本内容介绍了Java虚拟机与Class文件的关系及其内部结构。Class文件是一种与语言无关的二进制格式,包含JVM指令集、符号表等信息。无论使用何种语言,只要能生成符合规范的Class文件,即可在JVM上运行。文章详细解析了Class文件的组成,包括魔数、版本号、常量池、访问标志、类索引、字段表、方法表和属性表等,并说明其在Java编译与运行过程中的作用。
117 0
|
5月前
|
Unix Go
Go语言中的文件与IO:文件读写
本文介绍了 Go 语言中文件操作的基础方法,涵盖打开与关闭文件、读取和写入文件内容、追加写入以及复制文件等功能。通过 `os`、`bufio` 和 `io` 等标准库包,提供了高效且灵活的实现方式,如使用 `os.ReadFile` 读取整个文件、`bufio.Scanner` 逐行读取、`os.Create` 创建文件以及 `io.Copy` 复制文件内容。同时强调了错误处理的重要性,例如使用 `defer` 确保文件关闭,并推荐注意文件权限设置(如 UNIX 系统中的 `0644`)。最后以表格形式总结了常用操作及其推荐方法,便于快速查阅和应用。
|
5月前
|
Go 数据处理
Go语言中的文件与IO:bufio 和 scanner
Go 标准库中的 `bufio` 包高效读写功能,适用于文件和数据处理。`bufio.Reader` 支持按行或分隔符读取,`bufio.Writer` 提供高性能写入并需调用 `Flush()` 确保数据写入。`bufio.Scanner` 是处理文本文件(如日志、配置)的利器,可按行、单词等分割内容。本文详解其用法,并给出实践建议,如统计字符数、模拟 `tail -f` 和词频分析等。