文件IO(Java)

news2025/7/14 5:05:03

注:此博文为本人学习过程中的笔记

1.概念

狭义上的文件是指保存在硬盘上的文件,广义上指操作系统进行资源管理的一种机制,很多软件/硬件资源都可以抽象成文件,这里我们针对的是狭义上的文件。

在硬盘里还有文件夹,这是通俗的说法,我们一般称其为目录。

2.硬盘,内存和寄存器

1.区别

存储空间

硬盘很大(几TB),内存更小(几十GB),寄存器非常小(不到1KB)

访问速度

硬盘很慢,内存快,寄存器很快

成本

硬盘便宜,内存贵,寄存器不单独卖,很贵

2.硬盘

硬盘分为固态硬盘和机械硬盘,机械硬盘受限于内部结构,速度非常慢。

3.路径

一台计算机中能够保存的文件有很多,那么要怎么识别唯一的文件呢?此时就需要用到路径。路径就是定位到文件的一系列过程。在计算机中,目录套目录形成了树形结构,从树根开始到最终的文件,都需要经过哪些目录,就形成路径。

1.使用

一般用“/”(正斜杠)表示。主流操作系统中都是使用/表示,windows比较特殊,使用“\”(反斜杠)表示。不过windows里是兼容正斜杠的,所以我们都使用正斜杠。在编写代码的时候,正斜杠可以直接使用,反斜杠需要转义。

2.相对路径和绝对路径

1.绝对路径

从盘符开始逐级表示

2.相对路径

相对路径需要明确一个基准,使用.表示基准的位置。使用..表示基准的上一层。使用../..表示基准的上两层。

在代码中写一个相对路径,它的基准是不确定的。如果在IDEA上运行,基准就是项目的目录。如果打一个jar包,单独运行jar包,那么是在哪个目录执行运行命令,基准就是哪个目录。

4.文件的种类

从开发的角度把文件分成两类,二进制文件和文本文件。图片,视频,压缩包之类的都是二进制文件。

所有的文件都是二进制文件,有一些文件是特殊的,二进制数据刚好能构成一些字符,能狗仔码表查到,并且构成有意义的内容。判断文本文件的方法很简单,直接用记事本打开看即可。注意word里的docx是二进制文件,里面不只有文本,还有格式,图表之类的东西。

5.Java标准库中操作文件的类

1.文件系统操作

创建文件,删除文件,重命名,创建目录

File - Java17中文文档 - API参考文档 - 全栈行动派 (qzxdp.cn)

进行文件系统操作时使用File这个类。里面的方法大多比较简单,查看文档即可,这里只写一些需要注意的点。

1.方法注意点

1.list()和listFile()

这个方法的作用是返回当前目录的子元素有哪些,需要注意的是它是无法获得子元素的子元素或孙子元素的,如果想,需要我们通过代码来实现。list返回的是字符串,而listFile返回的是File类,可以进行更多操作。

2.renameTo()

这个方法的作用是重命名目录,对于操作系统来说,重命名和移动本质上是一样的,因为定位文件是靠路径完成的。

2.文件内容操作

针对一个文件的内容进行读和写,通过一组“流对象”实现。流是操作系统层面的术语,和语言无关,其他语言操作文件内容也叫流。输入和输出是以cpu为参考的。

字节流读数据时是文件的原始数据。而字符流会根据文件内容的编码格式进行解析,比如可以把utf-8编码下3个字节的汉字解析后放到2个字节的char里。

其中的操作大部分是很相似的,这里就只详细介绍InputStream,其他都一笔带过。

1.字节流

读写文件以字节为单位,是针对二进制文件进行使用的。字节流主要有两个类InputStream和OutputStream,其他类都直接或间接继承这两个类。

1.InputStream
1.new操作
//注意InputStream是个抽象类
InputStream inputStream = new FileInputStream(文件路径);

这里的创建操作一旦成功,就认为打开了文件。要先打开文件才能进行操作,这是操作系统定义的流程。这个时候就不能忘记操作完成之后要关闭文件。

2.close()
inputStream.close();

不手动释放文件资源,就会引起文件资源泄露问题。 每次打开一个文件,就会在文件描述符表(固定长度的顺序表)中占据一个表项,如果光打开,不关闭,这里的文件描述符表的表项就会耗尽,后续再打开文件就会失败。文件操作附表是不能自动扩容的,操作系统内核里的操作是给所有进程提供的,如果能自动扩容会进一步增加内核的不可控因素。

close和unlock一样,容易因为各种原因漏掉,所以我们可以使用finally语句或者try语句的变种来保证close操作一定执行。

try {
    InputStream inputStream = new FileInputStream();
} finally {
    inputStream.close();
}

//括号里可以new多个,在括号里new的东西会在try的代码块结束后自动调用close关闭
try(InputStream inputStream = new FileInputStream();) {

}
//能自动关闭的类都实现了Closable接口

3.read() 

int read()

调用一次,读取一个字节,返回的是int而不是byte,返回值是正常数字时对照码表查具体是什么,返回-1是表示文件已经读完

try(InputStream inputStream = new FileInputStream("./text.txt")) {
    //开始进行读文件操作
    while(true) {
        int data = inputStream.read();
        if(data == -1) {//如果读完就退出
            break;
        }
        System.out.println(data);
    }
}

int read(byte[] b)

一次读若干个字节,读取到的数据放到参数b中。

这个方法使用参数作为方法的返回值。一般来说,方法都是把参数作为需要加工的材料,把返回值当作生产出来的产品。有时也会使用参数来接收返回值,当参数是一个引用类型时,方法内部修改对象内容也能影响到方法外部。

这种"输出型参数"本质上是语法的限制,因为语法限制方法只能有一个返回值,如果希望返回多个数据,只能通过参数来凑。

try(InputStream inputStream = new FileInputStream("./text.txt")) {
    byte[] data = new byte[1024];
    while(true) {
        //read方法会尽可能读完数据,直到把data填满为止。
        int n = inputStream.read(data);//这里的n表示实际读了几个字节
        for(int i = 0; i < n; i++) {
            System.out.println(data[i]);
        }
    }
}

int read(byte[], int off, int len)

这里的off表示offset指的是偏移量,也可以理解成数组下标,len表示长度。这个方法和第二个类似,多了指定下标和长度。

2.OutputStream

1.new

对于OutputStream来说,默认情况下会尝试创建不存在的文件。打开文件的一瞬间是会清除上次文件的内容的,可以设置成追加写的模式,避免文件被清空。

OutputStream outputStream = new FileOutputStream("./text.txt", true);
2.write

void write(int b)

一次写一个字节

void write(byte[] b)

一次写若干个字节

void write(byte[] b, int off, int, len)

一次写若干个字节,可以指定下标和长度

2.字符流

读写文件以字符为单位,是针对文本文件进行使用的。字符流主要有两个类Writer和Reader,其他类都直接或间接继承这两个类。

1.Reader
1.read()

int read()

一次读一个字符

int read(char[] cbuf)

一次读一个字符数组

int read(CharBuffer target)

CharBuffer相当于对char[]进行了封装

int read(char[] cbuf, int off, int len)

一次读一个字符数组,可以指定下标和长度

2.Writer
write()

void write(int c)

void write(String str)

void write(char[] cubf)

void write(String str, int off, int len)

void write(char[] cubf, int off, int len)

3.提高效率的方法

1.手动创建缓冲区,手动减少read和write的次数

2.使用标准库提供的"BufferedStream"缓冲区流

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

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

相关文章

Sentinel数据S2_SR_HARMONIZED连续云掩膜+中位数合成

在GEE中实现时&#xff0c;发现简单的QA60是无法去云的&#xff0c;最近S2地表反射率数据集又进行了更新&#xff0c;原有的属性集也进行了变化&#xff0c;现在的SR数据集名称是“S2_SR_HARMONIZED”。那么&#xff1a; 要想得到研究区无云的图像&#xff0c;可以参考执行以下…

HTMLCSS模板实现水滴动画效果

.container 类&#xff1a;定义了页面的容器样式。 display: flex&#xff1a;使容器成为弹性容器&#xff0c;方便对其子元素进行布局。justify-content: center 和 align-items: center&#xff1a;分别使子元素在水平和垂直方向上居中对齐。min-height: 100vh&#xff1a;设…

【数据可视化艺术·应用篇】三维管线分析如何重构城市“生命线“管理?

在智慧城市、能源管理、工业4.0等领域的快速发展中&#xff0c;地下管线、工业管道、电力通信网络等“城市血管”的复杂性呈指数级增长。传统二维管理模式已难以应对跨层级、多维度、动态变化的管线管理需求。三维管线分析技术应运而生&#xff0c;成为破解这一难题的核心工具。…

【MinerU】:一款将PDF转化为机器可读格式的工具——RAG加强(Docker版本)

目录 创建容器 安装miniconda 安装mineru CPU运行 GPU加速 多卡问题 创建容器 构建Dockerfile文件 开启ssh服务&#xff0c;设置密码为1234等操作 # 使用官方 Ubuntu 24.04 镜像 FROM ubuntu:24.04# 安装基础工具和SSH服务 RUN apt-get update && \apt-get ins…

Appium自动化开发环境搭建

自动化 文章目录 自动化前言 前言 Appium是一款开源工具&#xff0c;用于自动化iOS、Android和Windows桌面平台上的本地、移动web和混合应用程序。原生应用是指那些使用iOS、Android或Windows sdk编写的应用。移动网页应用是通过移动浏览器访问的网页应用(appum支持iOS和Chrom…

C++学习-入门到精通-【1】C++编程入门,输入/输出和运算符

C学习-入门到精通-【1】C编程入门&#xff0c;输入/输出和运算符 C编程入门&#xff0c;输入/输出和运算符 C学习-入门到精通-【1】C编程入门&#xff0c;输入/输出和运算符第一个C程序&#xff1a;输出一行文本算术运算 第一个C程序&#xff1a;输出一行文本 // 文本打印程序…

面向高性能运动控制的MCU:架构创新、算法优化与应用分析

摘要&#xff1a;现代工业自动化、汽车电子以及商业航天等领域对运动控制MCU的性能要求不断提升。本文以国科安芯的MCU芯片AS32A601为例&#xff0c;从架构创新、算法优化到实际应用案例&#xff0c;全方位展示其在高性能运动控制领域的优势与潜力。该MCU以32位RISC-V指令集为基…

某地农产品交易中心钢网架自动化监测项目

1. 项目简介 本项目规划建设现代物流产业园&#xff0c;新建6万平方米仓库&#xff0c;具体为新建3栋钢构仓库2万平方米&#xff0c;2栋砖混结构仓库1万平方米&#xff0c;3栋交易中心2万平方米&#xff0c;改造现有3栋3层砖混结构仓库1万平方米&#xff0c;配备智能化仓库物流…

【无人机】无人机位置估计出现偏差的原因分析

目录 #0、原因分析 #1、过度振动的测定 #2、确定过度陀螺仪偏差 #3、偏航精度差的测定 #4、确定 GPS 精度差 #5、确定 GPS 数据丢失 #6、气压计地面效应补偿 #0、原因分析 位置背离的最常见原因是&#xff1a; 参考&#xff1a;Using the ECL EKF | PX4 Guide (v1.15)…

element-plus(vue3)表单el-select下拉框的远程分页下拉触底关键字搜索实现

一、基础内核-自定义指令 1.背景 2.定义 3.使用 4.注意 当编辑时需要回显&#xff0c;此时由于分页导致可能匹配不到对应label文本显示&#xff0c;此时可以这样解决 二、升级使用-二次封装组件 三、核心代码 1.自定义指令 定义 ----------------selectLoadMoreDirective.…

轻松完成视频创作,在线视频编辑器,无需下载软件,功能多样实用!

小白工具的在线视频编辑https://www.xiaobaitool.net/videos/edit/ 功能丰富、操作简便&#xff0c;在线裁剪或编辑视频工具&#xff0c;轻松完成视频创作能满足多种视频编辑需求。 格式支持广泛&#xff1a;可编辑超百种视频格式&#xff0c;基本涵盖常见和小众视频格式&#…

豆瓣图书数据采集与可视化分析(三)- 豆瓣图书数据统计分析

文章目录 前言一、数据读取与保存1. 读取清洗后数据2. 保存数据到CSV文件3. 保存数据到MySQL数据库 二、不同分类统计分析1. 不同分类的图书数量统计分析2. 不同分类的平均评分统计分析3. 不同分类的平均评价人数统计分析4. 不同分类的平均价格统计分析5. 分类综合分析 三、不同…

c++进阶——类与继承

文章目录 继承继承的基本概念继承的基本定义继承方式继承的一些注意事项 继承类模板 基类和派生类之间的转换继承中的作用域派生类的默认成员函数默认构造函数拷贝构造赋值重载析构函数默认成员函数总结 不能被继承的类继承和友元继承与静态成员多继承及其菱形继承问题继承模型…

复杂地形越野机器人导航新突破!VERTIFORMER:数据高效多任务Transformer助力越野机器人移动导航

作者&#xff1a; Mohammad Nazeri 1 ^{1} 1, Anuj Pokhrel 1 ^{1} 1, Alexandyr Card 1 ^{1} 1, Aniket Datar 1 ^{1} 1, Garrett Warnell 2 , 3 ^{2,3} 2,3, Xuesu Xiao 1 ^{1} 1单位&#xff1a; 1 ^{1} 1乔治梅森大学计算机科学系&#xff0c; 2 ^{2} 2美国陆军研究实验室&…

Jsp技术入门指南【十】IDEA 开发环境下实现 MySQL 数据在 JSP 页面的可视化展示,实现前后端交互

Jsp技术入门指南【十】IDEA 开发环境下实现 MySQL 数据在 JSP 页面的可视化展示&#xff0c;实现前后端交互 前言一、JDBC 核心接口和类&#xff1a;数据库连接的“工具箱”1. 常用的 2 个“关键类”2. 必须掌握的 5 个“核心接口” 二、创建 JDBC 程序的步骤1. 第一步&#xf…

数据库未正常关闭后,再次启动时只有主进程,数据库日志无输出

瀚高数据库 目录 环境 症状 问题原因 解决方案 环境 系统平台&#xff1a;银河麒麟svs&#xff08;X86_64&#xff09; 版本&#xff1a;4.5.8 症状 现象&#xff1a;使用pg_ctl stop停止数据库&#xff0c;未正常关闭&#xff1b;使用pg_ctl stop -m i 强制关闭数据库后&…

Oracle Recovery Tools修复ORA-00742、ORA-600 ktbair2: illegal inheritance故障

接到客户反馈,一套运行在虚拟化平台中的Oracle数据库,由于机房断电,导致数据库无法启动,最初启动报错 2025-04-22T16:59:48.92222708:00 Completed: alter database mount exclusive alter database open 2025-04-22T16:59:52.60972608:00 Ping without log force is disabled:…

基于 Netmiko 的网络设备自动化操作

学习目标 掌握 Netmiko 库的核心功能与使用场景。能够通过 Netmiko 连接多厂商设备并执行命令和配置。实现批量设备管理、配置备份与自动化巡检。掌握异常处理、日志记录与性能优化技巧。理解 Netmiko 在自动化运维体系中的角色。 1. Netmiko 简介 1.1 什么是 Netmiko Netmi…

LeNet5 神经网络的参数解析和图片尺寸解析

1.LeNet-5 神经网络 以下是针对 LeNet-5 神经网络的详细参数解析和图片尺寸变化分析&#xff0c;和原始论文设计&#xff0c;通过分步计算说明各层的张量变换过程。 经典的 LeNet-5架构简化版&#xff08;原始论文输入为 32x32&#xff0c;MNIST 常用 28x28 需调整&#xff09…

Axure大屏可视化模板:多领域数据决策的新引擎

在数据驱动决策的时代&#xff0c;Axure大屏可视化模板凭借交互性与可定制性&#xff0c;成为农业、园区管理、智慧城市、企业及医疗领域的创新工具&#xff0c;助力高效数据展示与智能决策。 核心应用场景 1. 农业精细化&#xff1a;实时监控土壤湿度、作物生长曲线&#x…