文件操作--IO

目录

♫什么是文件

♫文件路径

♫文件类型

♫文件的管理

♪File的构造方法

♪File的常用方法

♫文件的内容操作

♪InputStream

♪OutputStream

♪字符流读写文件

♫Scanner与流对象


♫什么是文件

文件在计算机里可以指“狭义”的文件(指硬盘上的文件和目录),也可以值“广义”的文件(操作系统将很多硬件设备和软件资源也抽象成文件来统一管理),这里要介绍的文件就是指“狭义”的文件。

♫文件路径

变量存储数据是在内存中,而文件存储数据则是在硬盘上,每个文件在硬盘上都有一个独有的文件路径,文件路径有绝对路径和相对路径之分,下面这个图片的绝对文件路径就是D:/picture/tree.png:

其中D:为盘符,是通过硬盘分区来的,每个盘符可以对应一个硬盘,也可以多个盘符对应一个硬盘;/用于分割目录,windows也可以用\分割目录,如果在代码中用\需要注意转义字符的问题。

它的相对路径根据当前工作目录的不同而变化:

♩.如果工作目录是D:/,相对路径写作./picyure/tree.png

♩.如果工作目录是D:/picture,相对路径写作./tree.png

♩.如果工作目录是D:/picture./a,相对路径写作../tree.png(..表示当前目录的上一级)

♩.如果工作目录是D:/picture/a/b,相对路径写作../../tree.png

♫文件类型

我们平常使用的文件有音频文件,视频文件,图片文件,word文件等等,这些不同的文件都可以归纳为文本文件和二进制文件两种。

♩.文本文件:是一种用于存储文本数据的文件类型,其中包含 ASCII 或 Unicode 编码的字符。文本文件往往包括人类可读的字符和行结尾符号。常见的文本文件格式包括.txt、.html、.xml 等。

♩.二进制文件:是使用二进制代码编写的文件类型,它们可以包含任何类型的数据,包括图像、音频、视频、可执行文件和其他应用程序数据。二进制文件由计算机使用特定的二进制编码表示,无法直接阅读或修改。

♫文件的管理

Java 中通过 java.io.File 类来对一个文件(包括目录)进行抽象的描述,但是有  File 对象并不代表真实存在该文件,通过File类可以查询、创建、删除文件。
File的属性
修饰符及返回类型属性描述
static String pathSeparator
依赖于系统的路径分隔符, String 类型的表示
static charpathSeparator
依赖于系统的路径分隔符, char  类型的表示
注:pathSeparator 是File的一个静态变量,相当于 / 或 \ 

♪File的构造方法

方法描述
File(File parent, String child)
根据父目录 + 孩子文件路径,创建一个新的 File 实例
File(String pathname)
根据文件路径创建一个新的 File 实例,路径可以是绝对路径或者相对路径
File(String parent, String child)
根据父目录 + 孩子文件路径,创建一个新的 File 实例,父目录用路径表示
File file = new File("d:/");
File file1 = new File(file,"test");
File file2 = new File("d:/test");
File file3 = new File("d:/","test");
System.out.println(file1);
System.out.println(file2);
System.out.println(file3);

运行结果:

♪File的常用方法

返回值类型
方法名描述
StringgetParent()
返回 File 对象的父目录文件路径
StringgetName()
返回 FIle 对象的纯文件名称
StringgetPath()
返回 File 对象的文件路径
StringgetAbsoultePath()
返回 File 对象的绝对路径
String
getCanonicalPath()
返回 File 对象的修饰过的绝对路径
booleanexists()
判断 File 对象描述的文件是否真实存在
booleanisDirectory()
判断 File 对象代表的文件是否是一个目录
booleanisFile()
判断 File 对象代表的文件是否是一个普通文件
booleancreateNewFile()
根据 File 对象,自动创建一个空文件。成功创建后返回 true
booleandelete()
根据 File 对象,删除该文件。成功删除后返回 true
voiddeleteOnExit()
根据 File 对象,标注文件将被删除,删除动作会到 JVM 运行结束时才会进行
Stringlist()
返回 File 对象代表的目录下的所有文件名
File[]listFiles()
返回 File 对象代表的目录下的所有文件,以 File 对象表示
booleanmkdir()
创建 File 对象代表的目录
booleanmkdirs()
创建 File 对象代表的目录,如果必要,会创建中间目录
booleanrenameTo(File dest)
进行文件改名,也可以视为我们平时的剪切、粘贴操作
booleancanRead()
判断用户是否对文件有可读权限
booleancanWrite()
判断用户是否对文件有可写权限

♫文件的内容操作

Java中使用流对象对文件内容进行操作,从类型上分为以字节为单位读写数据的字节流对象(InputStream、OutputStream)和以字符为单位读写数据的字符流对象(Reader、Writer),流对象的四个核心操作是:①.打开文件(构造方法)(8)②.关闭文件(close())③.读文件(read() 对应 InputStream 和 Reader)④.写文件(write() 对应 OutPutStream 和 Writer)。

♪InputStream

InputStream 用于以字节为单位读取文件内容,它是抽象类,可以借助它的实现类(如:FileInputStream)来创建实例对象:

public class Test {public static void main(String[] args) throws FileNotFoundException {File file = new File("d:/test");InputStream inputStream1 = new FileInputStream(file);InputStream inputStream2 = new FileInputStream("d:/test");}
}

创建好实例对象后可以通过read()方法读取该文件的内容:

返回类型方法名描述
intread()
读取一个字节的数据,返回 -1 代表已经完全读完了
intread(byte[] b)
最多读取 b.length 字节的数据到 b 中,返回实际读到的数
量, -1 代表以及读完了
intread(byte[] b, int off, int len)
off 开始读,最多读取 len - off 个 字节的数据到 b 中,返
回实际读到的数量, -1 代表以及读完了
public class Test {public static void main(String[] args) throws IOException {InputStream inputStream = new FileInputStream("d:/test");byte[] buffer1 = new byte[1024];byte[] buffer2 = new byte[1024];int a = inputStream.read();inputStream.read(buffer1);inputStream.read(buffer2,2,4);}
}

注:访问硬盘/IO设备是比较耗时的,故一次读取一个字节,总共读取1024次比一次读取1024个字节更耗时

读取完文件内容后就可以关闭该流对象:

inputStream.close();

注:一个线程对应一个PCB,一个进程对应一个或多个PCB,每个进程里PCB所对应的文件描述符表是共用的,每次打开一个文件都会在文件描述符表上申请一个位置,如果打开的文件不及时释放就可能导致文件描述符表被占满了,这样子下次再申请打开文件就会打开失败

虽然JC会在回收OutputStream对象的时候释放文件描述符表,但一般还是我们手动释放比较及时,为了保证能执行到close操作可以这样处理:

try(InputStream inputStream = new FileInputStream("d:/test")) {byte[] buffer1 = new byte[1024];byte[] buffer2 = new byte[1024];int a = inputStream.read();inputStream.read(buffer1);inputStream.read(buffer2,2,4);
}

这个语法在Java中叫作try with resources,需要实现Closeable接口的类才被使用:

♪OutputStream

OutputStream 用于以字节为单位写入文件内容,它也是抽象类,可以借助它的实现类(如:FileOutputStream)来创建实例对象

public class Test {public static void main(String[] args) throws FileNotFoundException {File file = new File("d:/text");OutputStream outputStream1 = new FileOutputStream(file);OutputStream outputStream2 = new FileOutputStream("d:/test");}
}

创建好实例对象后可以通过write()方法向该文件写入内容:

返回类型方法名描述
voidwrite(int b)
写入要给字节的数据
voidwrite(byte[] b)
b 这个字节数组中的数据全部写入os中
intwrite(byte[] b, int off, int len)
b 这个字符数组中从 off 开始的数据写入 os 中,一共写 len
public class Test {public static void main(String[] args) throws IOException {OutputStream outputStream = new FileOutputStream("d:/text");byte[] b = new byte[1024];outputStream.write(97);outputStream.write(b);outputStream.write(b,3,5);}
}

注:OutputStream打开一个文件会清空文件的原有内容

OutputStream也继承了closeable接口:

同样可以使用try with resources的方式关闭字节流:

try(OutputStream outputStream = new FileOutputStream("d:/text")) {byte[] b = new byte[1024];outputStream.write(97);outputStream.write(b);outputStream.write(b,3,5);
}

由于 I/O 的速度是很慢的,所以 OutputStream 为 了减少设备操作的次数,在写数据的时候都会将数据先暂时写入内存的一个指定缓冲区里,直到该区域满了或者其他指定条件时才真正将数据写入设备中,close()会在关闭流对象的同时刷新缓冲区,通过 flush() 也可以对缓冲区进行刷新:

outputStream.flush();

♪字符流读写文件

字符流读写文件和字节流差不多,都是通过 read() 和 write() 方法实现读写操作:

public class Test {public static void main(String[] args) {try(Reader reader = new FileReader("d:/text")) {while (true) {int ch = reader.read();if (ch == -1) {break;}System.out.print("" + (char)ch);}} catch (FileNotFoundException e) {throw new RuntimeException(e);} catch (IOException e) {throw new RuntimeException(e);}}
}

public  class Test {public static void main(String[] args) {try(Writer writer = new FileWriter("d:/text")) {writer.write("hello");} catch (IOException e) {throw new RuntimeException(e);}}
}

♫Scanner与流对象

Scanner 是搭配流对象来使用的,我们常用的 Scanner scanner = new Scanner(System.in); 中 System.in 就是一个标准输入输出流对象(从键盘读取数据),当将该该流对象替换成文件流对象时就会从文件里读取数据:

public class Test {public static void main(String[] args) {try (InputStream inputStream = new FileInputStream("d;/test")) {Scanner scanner = new Scanner(inputStream);//从文件读取数据scanner.next();} catch (FileNotFoundException e) {throw new RuntimeException(e);} catch (IOException e) {throw new RuntimeException(e);}}
}

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

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

相关文章

c语言详解牛顿迭代法以及求解倒数和平方根

Newtons iteration method 是在实数域和复数域利用切线不断逼近方程根的一种求高次曲线方程的方法,区别于梯度下降法,它是二阶导,收敛速度比较快,对于非凸函数,牛顿法容易受到鞍点或者最大值点的吸引。由于牛顿迭代法是…

产品学习之路(一)

在做好开发的同时,还需要熟悉产品业务逻辑,不能为了功能而做功能,要从产品经理的角度去看待每个需求和客户痛点所在,这样针对产品设计出来的东西自己也有发言权; 目前作为一名前端开发人员,也在自学产品知识…

xxl-job 分布式任务调度框架

文章目录 分布式任务调度XXL-Job 简介XXL-Job 环境搭建XXL-Job (源码说明)配置部署调度中心docker安装 Bean模式任务(方法形式)-入门案例任务详解任务详解-执行器任务详解-基础配置任务详解-调度配置任务详解-基础配置任务详解-阻塞处理策略任务详解-路由策略 路由策略路由策略…

Redis数据结构之压缩列表

压缩列表是Redis为节约内存而开发的,是由一系列特殊编码的连续内存块组成的顺序型数据结构。一个压缩列表可以包含任意多个节点,每个节点可以保存一个字节数组或者整数值。 压缩列表构成 zlbytes: 记录整个压缩列表占用的内存字节数,对压缩列…

LD_PRELOAD劫持、ngixn临时文件、无需临时文件rce

LD_PRELOAD劫持 <1> LD_PRELOAD简介 LD_PRELOAD 是linux下的一个环境变量。用于动态链接库的加载&#xff0c;在动态链接库的过程中他的优先级是最高的。类似于 .user.ini 中的 auto_prepend_file&#xff0c;那么我们就可以在自己定义的动态链接库中装入恶意函数。 也…

Java数据结构之《折半查找》题目

一、前言&#xff1a; 这是怀化学院的&#xff1a;Java数据结构中的一道难度中等的一道编程题(此方法为博主自己研究&#xff0c;问题基本解决&#xff0c;若有bug欢迎下方评论提出意见&#xff0c;我会第一时间改进代码&#xff0c;谢谢&#xff01;) 后面其他编程题只要我写完…

自定义函数中的(int*a,int*b)与(int*a,int n)

事实上第一种更安全&#xff0c;不会因越界发生占位&#xff0c;从而导致错误。

C++的类和对象(一)

目录 1、面向过程和面向对象初认识 2、为什么要有类 3、类的定义 类的两种定义方式 4、类的访问限定符 5、类的作用域 5.1 为什么要有作用域&#xff1f; 5.2类作用域 6、类的实例化 6.1类的实例化的定义 6.2类的实例化的实现 6.3经典面试题 7、类对象 7.1类对…

计算机体系结构补充篇----静态超标量流水线及循环展开(一)

本文仅供学习&#xff0c;不作任何商业用途&#xff0c;严禁转载。部分资料取自----计算机系统结构教程(第二版)张晨曦等。部分资料来自----国科大计算机体系结构课程PPT–张科、刘珂、高婉玲 计算机体系结构----静态超标量流水线及循环展开&#xff08;一&#xff09; 摘要静…

FreeRTOS第2天:

1. 二值信号量简介&#xff08;386.11&#xff09; 什么是信号量&#xff1f; 信号量&#xff08;Semaphore&#xff09;&#xff0c;是在多任务环境下使用的一种机制&#xff0c;是可以用来保证两个或多个关键代码段不被并 发调用。信号量这个名字&#xff0c;我们可以把它拆…

【蓝桥杯软件赛 零基础备赛20周】第5周——高精度大数运算与队列

文章目录 1. 数组的应用–高精度大数运算1.1 Java和Python计算大数1.2 C/C高精度计算大数1.2.1 高精度加法1.2.2 高精度减法 2. 队列2.1 手写队列2.1.1 C/C手写队列2.1.2 Java手写队列2.1.3 Python手写队列 2.2 C STL队列queue2.3 Java队列Queue2.4 Python队列Queue和deque2.5 …

边缘数据中心和5G的融合彻底改变数据传输和物联网

伴随着数字化时代的飞速发展&#xff0c;边缘数据中心和5G技术的联袂崛起&#xff0c;正深刻塑造着人们对数据的创造、传输和处理方式。据Gartner公司的预测&#xff0c;到2025年&#xff0c;企业数据的三分之二将在边缘计算设施中涌现&#xff0c;而非传统的集中式数据中心。这…

134. 加油站(贪心算法)

根据题解 这道题使用贪心算法&#xff0c;找到当前可解决问题的状态即可 「贪心算法」的问题需要满足的条件&#xff1a; 最优子结构&#xff1a;规模较大的问题的解由规模较小的子问题的解组成&#xff0c;规模较大的问题的解只由其中一个规模较小的子问题的解决定&#xff…

分享88个节日PPT,总有一款适合您

分享88个节日PPT&#xff0c;总有一款适合您 88个节日PPT下载链接&#xff1a;https://pan.baidu.com/s/1mfLrdlB9Y1jqz2vkVIwBNA?pwd6666 提取码&#xff1a;6666 Python采集代码下载链接&#xff1a;采集代码.zip - 蓝奏云 学习知识费力气&#xff0c;收集整理更不易…

Markdown学习测试

这里写自定义目录标题 欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题&#xff0c;有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants 创建一个自定义列表如何创建一个…

国产Type-C接口逻辑协议芯片:Type-C显示器芯片方案

产品介绍 双Type-C盲插选型&#xff1a; LDR6282 PD3.0认证协议芯片&#xff0c;USB-IF TID号&#xff1a;212 支持iic&#xff0c;USB转UART&#xff0c;CC升级方式&#xff0c;多年市场验证&#xff0c;显示器市场出货量&#xff0c;显示器大厂采用兼容性NO.1。采用QFN32 5…

系列十五、SpringBoot的启动原理分析

一、概述 所谓SpringBoot的启动原理&#xff0c;翻译成大白话就是"当我们在主启动类上运行run方法时&#xff0c;SpringBoot底层到底做了什么事情&#xff0c;能够帮助我们启动一个Spring的web应用"&#xff0c;上边用大白话解释了一下什么是SpringBoot的启动原理&am…

vue 解决响应大数据表格渲染崩溃问题

如果可以实现记得点赞分享&#xff0c;谢谢老铁&#xff5e; 1.场景描述 发起请求获取上万条数据&#xff0c;进行表格渲染&#xff0c;使浏览器卡顿&#xff0c;导致网页崩溃。 2.分析原因 1.大量数据加载&#xff0c;过多操作Dom&#xff0c;消耗性能。 2.表格中包含其他…

数据库设计实践:粒度的理解与应用示例

粒度是描述数据存储和表示的详细程度。在数据库设计中&#xff0c;理解和正确选择粒度是非常重要的&#xff0c;因为它直接影响到数据的存储效率、查询性能和数据分析的灵活性。 文章目录 粒度的类型&#xff1a;案例粒度选择的考虑因素实际应用 粒度的类型&#xff1a; 细粒度…