Java的IO操作与文件的基本常识

首先什么是IO操作呢?

IO操作其实解释操作硬盘

1. 文件系统操作

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

2. 文件内容操作

进行读与写操作

先来了解一下基本的文件知识方便学习接下来的IO操作

文件路径

文件路径是从数根节点触发,沿着树杈一直往下走,到达目标文件,在此期间所经过的路径

在这里插入图片描述
如图所示, 其中文件路径为D:\111\新建文件夹\新建文件夹
Windows 中可以将此电脑省略,直接从盘符开始表示

细节问题

1. / 与 \ 的问题
我们看前面的文件的那个路径是 D:\111\新建文件夹\新建文件夹
他是使用 \ 来进行分割, \ 只适合windows系统,代码中经常使用 / 进行分割, 如果要使用 \ 进行分割要使用转义字符进行强转写成这样 \\

2. 相对路径与绝对路径

举个例子比较好明白
在这里插入图片描述

比如说在这个路径下我要找到如图所示的文件

在这里插入图片描述
此时我在这个目录里

相对路径表示为 ./scaffolds/draft.md

绝对路径为 C:/Users/47240/Desktop/myblog/scaffolds/draft.md

. 属于特殊符号, 是表示当前目录的意思
还有一个 . .表示的是当前目录的上级目录的意思

路径是十分重要的,尤其是相对路径,绝对路径可以理解为此电脑的路径,相对路径要明确基准目录是什么

文件介绍

1. 文本文件
文本文件存储的是遵守ASCII或其他字符集编码比如utf - 8,所得到的文件,本质上存的是字符(不仅仅是所说的char)
2. 二进制文件
存储的是二进制数据,没有任何字符集限制,存什么都可以

常见的区别
文本文件: .txt .java .c 等等
二进制文件: .class .exe .jpg 等等

文件系统操作

Java标准库提供了File这个类

File是硬盘上文件的抽象表示,由于文件是存储在硬盘上的,直接操作硬盘非常不方便,所以先通过File在内存中创建一个对应的对象
通过操作内存这个对象,间接影响到硬盘中的文件情况

1. 构造File对象

import java.io.File;public class IoDemo1 {public static void main(String[] args) {File file = new File("./1.jpg");System.out.println(file.getParent());System.out.println(file.getPath());System.out.println(file.getAbsolutePath());System.out.println(file.exists());}
}

构造的时候可以使用绝对路径或者相对路径初始化
这个路径指向文件,可以是真实存在的,也可以是不存在的

我遇到的疑问

在这里插入图片描述
疑问一
为什么打印的不是 io 而是 .

以上是他的打印内容,我当时不清楚为什么会打印.而不是 io 发现打印父目录是根据文件来决定, 1.jpg 的父目录就是 . 所以打印 .

疑问二
为什么不存在这个文件也可以打印出绝对路径

File创建路径只是一个抽象的表示,他并不知道文件是否存在,只是基于程序运行的当前目录去表示路径 总之,
绝对路径的计算并不依赖于文件是否存在。只要提供路径, Java 就能基于当前工作目录生成一个绝对路径

以下是File的一些方法

返回类型方法签名说明
StringgetParent()返回 File 对象的父目录的路径。
StringgetName()返回 File 对象的文件名称。
StringgetPath()返回 File 对象的相对路径或绝对路径。
StringgetAbsolutePath()返回 File 对象的绝对路径。
StringgetCanonicalPath()返回 File 对象的规范路径(去除符号链接和相对路径的情况)。
booleanexists()判断 File 对象描述的文件或目录是否存在。
booleanisDirectory()判断 File 对象是否是一个目录。
booleanisFile()判断 File 对象是否是一个普通文件。
booleancreateNewFile()创建一个新的空文件,成功创建返回 true。
booleandelete()删除文件或目录,成功删除返回 true。
voiddeleteOnExit()标记文件在 JVM 运行结束时删除。
String[]list()返回 File 对象代表的目录下的所有文件名。
File[]listFiles()返回 File 对象代表的目录下的所有文件和目录对象,以 File 对象数组形式返回。
booleanmkdir()创建 File 对象代表的目录。
booleanmkdirs()创建 File 对象代表的目录及所有必要的父目录。
booleanrenameTo(File dest)对文件进行重命名或剪切到新位置。
booleancanRead()判断文件是否具有可读权限。
booleancanWrite()判断文件是否具有可写权限。

2. 简单介绍几个方法

File file = new File("./helloWorld.txt");System.out.println(file.exists());//判断是否存在System.out.println(file.isDirectory());//是否为目录System.out.println(file.isFile());//是否是文件file.createNewFile();//创建一个txt文件

在这里插入图片描述
可以发现如果写的是相对路径,会以 io ,也就是项目所在的目录展开

mkdirs

import java.io.File;public class IoDemo3 {public static void main(String[] args) {File file = new File("./text/aaa/bbb");System.out.println(file.mkdir());file.mkdirs();}
}

midir 只能创建一个目录, 在以上代码会创建失败返回一个 false , 通过 midirs 创建出多级目录也是在 io 目录下展开的
在这里插入图片描述

文件内容操作

针对文本文件,提供一组类, 统称 ‘’ 字符流 ‘’(代表, Reader, Writer) 读写的基本单位是 字符
针对二进制文件,提供一组类, 统称 ‘’ 字节流 ‘’(代表, InputStream,OutputStream) 读写的基本单位是 字节

流对象又分为两种
输入的: Reader, InputStream
输出的: Writer, OutputStream

输入是通过内存创建的对象读取硬盘的内容输送到CPU中
输出是通过内存创建的对象将CPU的内容输出到硬盘上

在这里插入图片描述

介绍InputStream

InputStream的使用方法
首先
在这里插入图片描述
抽象类无法进行实例化

InputStream inputStream = new FileInputStream("D:/test.txt")

使用 FileInputStream 指定一个文件路径
但是最后一定要记得关闭, 关闭操作一定不能忘记

文件的资源是需要手动释放的
其中资源指的是文件描述符

回顾
进程的表示结构

  • pid
  • 内存指针
  • 文件描述符表

其中文件描述符表就是记载当前进程都打开了哪些文件,每打开一个文件就会在符表中申请到一个位置
这个表你可以当成一个数组, 数组下标就是文件描述符
数组元素就是文件在内核的结构体表示

但是这是有限制的,一旦满了继续打开就会打开失败,发生文件资源泄露(非常严重)

有时候经常会忘记关闭
所以可以说使用try with resoures, 可以自动帮你关闭

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;public class IoDemo6 {public static void main(String[] args)throws IOException {try(InputStream inputStream = new FileInputStream("D:/test.txt")){while(true){int n = inputStream.read();if(n == -1){break;}System.out.println(n);System.out.printf("%x\n",n);}}}
}

比如上述代码的写法,虽然没有写close关闭文件
但是InputStream实现了一个特定的interface Closeable接口

简单介绍一下inputStream类里的方法

在这里插入图片描述
无参数的read()相当于每次读读取一个字节,返回一个int值,如果文件里面读完了就会返回-1

例如
我在文件里存储hello world
在这里插入图片描述
输出每个字符的ASCII码值

如果输入的是汉字呢
在这里插入图片描述
将他转化成16进制进行输出
在这里插入图片描述
与编码表对照
在这里插入图片描述
发现正好是汉字的编码但是每次读取一个字节,以字节形式输出, 输出了12个字节

当然也可以用read(bytes)来读取
但是返回值是读到的字节数
也举个代码例子

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;public class IoDemo8 {public static void main(String[] args)throws IOException {try(InputStream inputStream = new FileInputStream("D:/test.txt")){byte[] bytes = new byte[4096];while(true){int n = inputStream.read(bytes);if(n == -1){break;}
//                System.out.println(n);System.out.printf("%x\n",n);}}}
}

如果我们输入你好世界这四个汉字,就会返回c,也就是12
因为他只能读取数据到bytes数组中,尽可能去填满,然后返回数量

介绍一下Reader类的方法,和InputStream异曲同工

Reader 类常用方法

返回类型方法签名说明
intread()读取单个字符并返回其 Unicode 编码,返回 -1 表示已到达流的末尾。
intread(char[] cbuf)将字符读入指定的字符数组,返回实际读取的字符数,返回 -1 表示已到末尾。
intread(char[] cbuf, int off, int len)将字符读入数组的部分区域,从 off 开始存储,最多读取 len 个字符。返回实际读取的字符数,返回 -1 表示到达末尾。
voidclose()关闭流并释放与之关联的所有资源。
longskip(long n)跳过输入流中的 n 个字符,返回实际跳过的字符数。
booleanready()如果流已经准备好读取字符,则返回 true,否则返回 false
booleanmarkSupported()测试此流是否支持 mark()reset() 方法,返回 true 表示支持。
voidmark(int readAheadLimit)标记流中的当前位置,可以通过 reset() 方法返回到这个位置。
voidreset()将流重新定位到上次调用 mark() 所标记的位置。
intread(CharBuffer target)将字符读入 CharBuffer 中,返回读取的字符数。

举个同样的例子

import java.io.*;public class IoDemo9 {public static void main(String[] args)throws IOException {try(Reader reader = new FileReader("D:/test.txt")){byte[] bytes = new byte[4096];while(true){int n = reader.read();if(n == -1){break;}
//                System.out.println(n);System.out.printf("%x\n",n);}}}
}

如果你也是读取你好世界
会发现读取到的是字符的 Unicode 编码, 因为之前是一个一个字节进行读取,但是现在时使用一个一个字符读取,会读取一整个’你’ 所以会输出Unicode编码

在这里插入图片描述

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

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

相关文章

刚转Mac的新手如何卸载不需要的应用程序

最开始转Mac系统的时候很是苦恼,到底该怎么卸载App啊,App直接拖到废纸篓真的能卸载干净吗,卸载App时会不会留下一些文件残留,慢慢的会不会占满内存,于是我找到了一个免费的卸载工具——XApp。 这是一款Mac应用程序卸载…

定时任务实现

1、定时任务概述 定时任务是一种自动化执行特定操作的方式,可以根据预定的时间、日期或间隔周期性地执行某些任务。 定时任务的作用? 自动化任务执行:定时任务能够在预定的时间触发执行某些任务,无需人工干预。这对于需要定期执…

有趣的python库:用 difflib 实现文本差异的可视化

一,介绍 difflib 模块是Python标准库的一部分,提供了一系列用于比较序列的类和函数,特别适用于文本比较任务。这个模块可以帮助用户发现两个文本文件或字符串序列之间的差异,并以多种格式展示这些差异,比如这样&#…

关于Java部署项目,文件上传路径问题 、Windows是\ linux是/

Windows是\ linux是/ ,踩坑。报错如下:

了解郑州自闭症寄宿学校:提供专业康复服务与关怀

在自闭症儿童的教育与康复领域,寄宿学校以其独特的教育模式和全面的关怀体系,为众多家庭提供了重要的支持。而在众多寄宿学校中,广州的星贝育园自闭症儿童寄宿制学校以其专业的康复服务和无微不至的关怀,成为了众多自闭症儿童及其…

【AGC005D】~K Perm Counting(计数抽象成图)

容斥原理。 求出f(m) ,f(m)指代至少有m个位置不合法的方案数。 怎么求? 注意到位置为id,权值为v ,不合法的情况,当且仅当 v idk或 v id-k 因此,我们把每一个位置和权值抽象成点 ,不合法的情况之间连一…

BEC商务英语高级相当于托福多少分?柯桥英语等级考试

虽然托福与BEC没有官方的换算标尺,但是我们可以用雅思作为桥梁来进行换算。 ETS发布托福和雅思分数换算表的主要目的是帮助申请人更好的对比这两种考试的成绩,以便于申请工作展开。官方版本的雅思与托福分数换算表如下: 由于BEC与雅思是同属…

STM32 BootLoader 刷新项目 (七) 获取芯片ID-0x53

STM32 BootLoader 刷新项目 (七) 获取芯片ID-0x53 1. 概述 前面的一系列文章中,我们介绍了整体的BootLoader的一个方案,现在我们针对该BootLoader设计多个命令,下面我们来讲述获取芯片ID的命令-0x53。 1.1 芯片Device ID和类型ID描述 STM3…

JVM和GC案例详解

接上文JVM环境配置说明:上文博客 一、JVM远程连接设置 1. JMX方式连接(这种方式没有GC监控),设置如下 2. 连接成功后可以查看基础配置参数(和服务器配置一致) 2. jstatd方式连接(这种方式没有CPU监控) 添加jstatd方式连接 双击Tomcat&#xff0…

sklearn机器学习实战——支持向量机四种核函数分类任务全过程(附完整代码和结果图)

sklearn机器学习实战——支持向量机四种核函数分类任务全过程(附完整代码和结果图) 关于作者 作者:小白熊 作者简介:精通python、matlab、c#语言,擅长机器学习,深度学习,机器视觉,目…

vue 解决高德地图Uncaught Error: Invalid Object: Pixel(NaN, NaN)

有点啰嗦,可以直接跳到最后看解决方法。 问题排查过程 原因起始于一个新需求:在编辑列表信息时需要修改设备位置。 按照文档一番操作,发现完美需求解决了。后续测试的时候就发现浏览器报错Uncaught Error: Invalid Object: Pixel(NaN, NaN)…

【2024最新】基于springboot+vue的人职匹配推荐系统lw+ppt

作者:计算机搬砖家 开发技术:SpringBoot、php、Python、小程序、SSM、Vue、MySQL、JSP、ElementUI等,“文末源码”。 专栏推荐:SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏:Java精选实战项…

【课程设计/毕业设计】Java家政预约管理系统源码+开发文档

项目介绍 一直想做一款家政管理系统,看了很多优秀的开源项目但是发现没有合适的。于是利用空闲休息时间开始自己写了一套管理系统。学习过程中遇到问题可以咨询留言。 在线体验 http://jiazheng.gitapp.cn/ 源码地址 https://github.com/geeeeeeeek/java_jiazh…

Mycat引领MySQL分布式部署新纪元:性能与扩展性的双重飞跃

作者简介:我是团团儿,是一名专注于云计算领域的专业创作者,感谢大家的关注 座右铭: 云端筑梦,数据为翼,探索无限可能,引领云计算新纪元 个人主页:团儿.-CSDN博客 目录 前言&#…

使用 Helsinki-NLP 中英文翻译本地部署 - python 实现

通过 Helsinki-NLP 本地部署中英文翻译功能。该开源模型性价比相对高,资源占用少,对于翻译要求不高的应用场景可以使用,比如单词,简单句式的中英文翻译。 该示例使用的模型下载地址:【免费】Helsinki-NLP中英文翻译本…

Java程序打包成jar包

步骤1 打开项目结构 步骤2 配置工件 选择你要打包的模块选择主类(程序的主入口main类)提取到目标会把库文件的jar包打包到目标,一般选择这个,更方便在不同电脑上运行 步骤3 构建并生成jar包 最后,在对应的out/artifacts文件夹中找到jar包,在终端输入java -jar xxxx.jar就可以正…

Sentinel 1.80(CVE-2021-44139)

Sentinel 是面向分布式、多语言异构化服务架构的流量治理组件,主要以流量为切入点,从流量路由、流量控制、流量整形、熔断降级、系统自适应过载保护、热点流量防护等多个维度来帮助开发者保障微服务的稳定性 Report a Sentinel Security Vulnerability …

“重阳敬老情,爱心暖夕阳”__郑光荣敬老慰问

“重阳敬老情,爱心暖夕阳”__郑光荣敬老慰问 2024年的重阳节,北京正明圣达叫卖团和窦志联的志愿者们来到润龄养老院和老人一起共庆 重阳节、共同带来、 歌、 舞、 演讲、 尤其是(北京正明圣达叫卖团)非遗项目传承人 郑光荣带来…

爬虫prc技术----小红书爬取解决xs

知识星球:知识星球 | 深度连接铁杆粉丝,运营高品质社群,知识变现的工具知识星球是创作者连接铁杆粉丝,实现知识变现的工具。任何从事创作或艺术的人,例如艺术家、工匠、教师、学术研究、科普等,只要能获得一…

【JVM】如何判断对象是否可以被回收

引用计数法: 在对象中添加一个引用计数器,每当有一个地方引用它时,计数器值就加一;当引用失效时,计数器值就减一;任何时刻计数器为零的对象就是不可能再被使用的。 优点:实现简单,判…