【JavaEE】文件IO

在这里插入图片描述
🤡🤡🤡个人主页🤡🤡🤡
🤡🤡🤡JavaEE专栏🤡🤡🤡

文章目录

  • 1.什么叫文件IO
    • 1.1IO的概念
    • 1.2文件的概念
  • 2.用java来操作文件
    • 2.1文件的分类
    • 2.2如何区分二进制文件和文本文件
    • 2.3java操作文件系统
    • 2.4java操作文件内容
      • 2.4.1读文件
      • 2.4.2写文件
      • 2.4.3关闭文件——close()

1.什么叫文件IO

1.1IO的概念

I0——input与output合称,输入与输出,那么什么叫输入什么就输出呢?我们可以根据CPU为基准,从CPU往外叫输出,从外往CPU的叫输入。如图:
在这里插入图片描述

1.2文件的概念

文件本身就是个广义的概念通常将软件资源与硬件资源都抽象成文件,但是在这里我们只聊狭义的文件,也就是保存在硬盘的文件。
那么文件夹算文件吗?算的,文件夹算目录文件,在我们计算机中有许多文件和目录,而且这些目录还有些嵌套的,为了将这些目录和文件给整理在一起,则计算机有个体系来整理这些文件与目录,可以看成一个N叉树。那我们怎么找到我需要的文件呢,那需要一个机制,可以帮我们迅速定位到目标文件,那么需要定位到目标文件,你肯定需要一个路径来实现吧。
路径又是什么呢?从开始位置到目标文件经过的地方,这些就叫路径,路径又分相对路径和绝对路径。
绝对路径:开始位置必须是整个文件系统的初始位置。D:\bite study code\java-ee 这个就可以称为绝对路径
当前目录:D:\bite study code\java-ee
相对路径:
当前目录:. 指的是当前java-ee文件
上一级目录:…指的是D:/bite study code
上一级目录的文件…//java 指的是bite study code 中的java文件
上述都是windows系统绝对路径和相对路径的表示方式,linux表示的方式不一样:
绝对路径:/bite study code/java-ee
相对路径与windows相同
在windows中有两种分隔符一种是/ 一种是\都可以用但也只限于windos系统中,其余都是用/分隔符表示。

2.用java来操作文件

2.1文件的分类

文件分为文本文件和二进制文件
文本文件是给程序猿看的,而二进制文件是给计算机看的
二进制文件:存储的都是二进制数据,像.docx,.pptx,.mp3,.mp4,.png等等都是二进制文件
文本文件:存储的是文本数据,像.java,.c,.html,.md等等都是文本文件
什么叫二进制数据,什么叫文本数据?
二进制数据:以字节的形式存储数据,并且是不可读的,通常是通过一些特定的软件或程序来解读的。
文本数据:以字符的形式存储数据,是可读的,是通过字符编码规则表示的像UTF8和GBK这些字符编码规则。

2.2如何区分二进制文件和文本文件

一个比较暴力的方式:直接将要区分的文件放入记事本中,如果显示的是字符那么就是文本文件,如果是一些乱码那么就是二进制文件。

2.3java操作文件系统

java在对操作文件系统提供了一个类——File类,其中的方法可以实现以下的需求:

  • 创建文件
//根据File对象自动创建一个空文件,创建成功之后就返回true,只有第一次创建只会会返回true
// 后续执行这个语句只会返回false,说明不能创建相同路径的文件
System.out.println(file.createNewFile());
//根据File对象创建文件夹
//System.out.println(file.mkdirs());
  • 删除文件
//根据File对象,删除该文件,成功删除返回tru
//file.delete();
  • 创建目录
//根据File对象创建文件夹
//System.out.println(file.mkdirs());
//判断File对象代表的文件是否是一个目录
//System.out.println(file.isDirectory());
  • 重命名文件
//重命名
file.renameTo(file);

在这里插入图片描述

2.4java操作文件内容

java提供了“流”一组类,来操作文件内容,主要核心就两类,一类为字节流,一类为字符流
字节流对应的就是二进制文件 InputStream/OutputStream 以字节为单位写数据读数据
字符流对应的就是文本文件 Reader/Writer 以字符为单位写数据读数据
这两个类的核心操作就是,根据构造方法打开文件,然后通过read读文件write写文件,通过close关闭文件

2.4.1读文件

字节流:
InputStream类是一个抽象类,不能被实例化,所以java标准库就提供了一个子类FileInputStream
这里的输入流是指将数据从文件中读入程序中,输入流不仅仅只是文件,还可以是键盘输入、网络连接、传感器。

InputStream inputStream = new FileInputStream("./text.txt");
//FileInputStream括号中填写已经创建好File对象或者直接填写路径,但是这个文件必须是存在的,不然就会抛异常

输入类提供了read方法,但这个方法有几个版本:
版本1:read()无参数版本,返回类型是int,每一次从文件中读取一个字节的数据,直到将文件中的数据读完就返回-1。
注意:此处返回int为什么不是byte?

  1. 为了当将文件数据读完之后返回-1的时候好表示
  2. 因为byte类型是有符号的,所以为了读取的数据全为正数,则用无符号类型int作为返回类型
  3. 此处为什么不用short,short不比int又少两个字节,节约空间不好吗,放在以前这种想法是可以的,但现在的cpu最低都是32位的,也就是说最低就是一个int,用short的话,CPU还要将short转化位int去运行,这样加大了CPU的任务,降低了CPU的工作效率。
public static void main(String[] args) throws IOException {
    File file = new File("./text1.txt");
    file.createNewFile();
    InputStream inputStream = new FileInputStream(file);
    while(true) {
        int a = inputStream.read();
        if(a == -1) {
            //读取完毕
            break;
        }
        System.out.printf("0x%X ",a);
    }
}

版本2:read( b)带一个参数的,参数的类型是byte[],我们要先创建一个空的byte[],然后通过read方法将文件中
的数据读入到byte[]数组中,这种写法是经典的"输出型参数" 用参数作为函数的返回结果。在C++很常见,但在java比较少见。

byte[] bytes = new byte[1024];
 int b = inputStream.read(bytes);
 System.out.println("b = " + b);
 for (int i = 0; i < b; i++) {
     System.out.printf("0x%X",bytes[i]);
 }

在这里插入图片描述
b这个变量指的是读取到了多少个字节
在这里插入图片描述
此处的printf打印适用于格式化输出,可以格式化字符串和变量:

  • %d 十进制整数
  • %f 浮点数
  • %s 字符串
  • %x 十六进制数
    println适用于直接打印字符串、数字、对象。
    版本3:read(byte[] b,int off,int len) 只填充部分数组的一部分,从off下标开始,填充len长度。在网络通信中很常见
byte[] bytes = new byte[1024];
int c = inputStream1.read(bytes,0,10);
for (int i = 0; i < c; i++) {
    System.out.printf("ox%x ",bytes[i]);
}

字符流:
Reader类是一个抽象类,不能被实例化,java也提供了一个子类FileReader
这个字符输入流提供了read()方法,也提供了几个版本,这里我描述一些三个版本
版本1:无参数一个一个的从文件中读到程序中

/*try(Reader reader = new FileReader("./text.txt")) {
    while(true) {
        int a = reader.read();
        if(a == -1) {
            break;
        }
        char ch = (char) a;
        System.out.println(ch);
    }
}*/

版本2:版本2:带一个参数的,参数类型为char[]

/*try(Reader reader = new FileReader("./text.txt")) {
    char[] ch = new char[1024];
        int a = reader.read(ch);
    for (int i = 0; i < a; i++) {
        System.out.println(ch[i]);
    }
}*/

版本3:带三个参数 分别为参数类型char[],int off,int len

try(Reader reader = new FileReader("./text.txt")) {
    char[] ch = new char[1024];
    int a = reader.read(ch,0,2);
    for (int i = 0; i < a; i++) {
        System.out.println(ch[i]);
    }
}

2.4.2写文件

字节流:
OutputStream也是一个抽象类,不能被实例化,java也提供了一个子类FileOutputStream
这个输出流是指将数据在程序中写入文件中,提供了write方法来将程序中的数据写入文件中,也提供了3个版本的write()
版本1:write()无参的,一个一个将程序中的数据读入文件中

/*outputStream.write(97);
outputStream.write(98);
outputStream.write(99);
outputStream.write(100);*/

版本2:write() 只有一个参数byte[]类型的,先将byte数组初始化,然后将byte数组中的内容读入文件中

/*byte[] bytes = new byte[1024];
for (int i = 0; i < bytes.length; i++) {
    bytes[i] = 1;
}
outputStream.write(bytes);*/

版本3:write()三个参数,byte[] b ,int off,int len 分别为byte类型的数组,开始读入的下标和需要读入文件的长度。

/*byte[] bytes = new byte[1024];
for (int i = 0; i < bytes.length; i++) {
    bytes[i] = 1;
}
outputStream.write(bytes,0,10);*/

上述的write操作,都会覆盖之前的数据,为了不覆盖之前的数据,这个覆盖操作不是write造成的,而是打开文件这个操作造成的,在打开文件的构造方法中,加一个参数true,那么就不会覆盖之前的数据。

try(OutputStream outputStream  = new FileOutputStream(file,true)) {
    byte[] bytes = new byte[1024];
    for (int i = 0; i < bytes.length; i++) {
        bytes[i] = 1;
    }
    outputStream.write(bytes,10,20);
}

字符流:
Writer是一个抽象类,不能被实例化,java也提供了一个子类FileWriter
提供了一个write方法
版本1:无参数,一个一个从程序写入文件中

try(Writer writer = new FileWriter("./text.txt",true)) {
    writer.write(',');
    writer.write('我');
    writer.write('来');
    writer.write('了');
}

版本2:有一个参数,char[]类型,一个数组大小的写入文件

char[] ch = new char[1024];
 for (int i = 0; i < ch.length; i++) {
     ch[i] = '好';
 }
 try(Writer writer = new FileWriter("./text.txt",true)) {
     writer.write(ch);
 }

版本3:传String类型的数组

String str = "hhhhhhhhhhhhhhh";
try(Writer writer = new FileWriter("./text.txt")) {
    writer.write(str);
}

2.4.3关闭文件——close()

打开文件的时候,就会在操作系统内核pcb结构体中"文件描述符表"添加一个元素,这个元素表示当前打开文件的相关信息。,这个文件描述符表类似于数据结构中的顺序表,它不会自动扩容,所以当这个顺序表达到了上限,那么就无法其他文件,所以我们需要在结束对这个文件操作之后就关闭这个文件也就是删除顺序表对应的元素。
java中提供了一个接口,调用这个接口,运用try关键字就可以在程序运行完之后自动去调用close方法,这个接口就是Closeable。

try(InputStream inputStream1 = new FileInputStream("./1.png")){
    byte[] bytes = new byte[1024];
    int c = inputStream1.read(bytes,0,10);
    for (int i = 0; i < c; i++) {
        System.out.printf("ox%x ",bytes[i]);
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Internet Download Manager6.42最新下载器互联网冲浪小能手们!

今天我要来种草一个超级棒的宝贝——Internet Download Manager&#xff08;简称 IDM&#xff09;。这个小家伙简直是下载界的“速度与激情”代言人&#xff0c;让我彻底告别了等待的日子。&#x1f389; IDM马丁正版下载如下: https://wm.makeding.com/iclk/?zoneid34275 …

本地部署,强大的面部修复与增强网络CodeFormer

目录 什么是 CodeFormer&#xff1f; 技术原理 主要功能 应用场景 本地部署 运行结果 结语 Tip&#xff1a; 在图像处理和计算机视觉领域&#xff0c;面部修复和增强一直是一个备受关注的研究方向。近年来&#xff0c;深度学习技术的飞速发展为这一领域带来了诸多突破性…

uniapp x — 跨平台应用开发的强大助力

摘要&#xff1a; 随着前端技术的不断演进&#xff0c;跨平台应用开发框架成为了提升开发效率、降低开发成本的重要工具。uni-app以其跨平台兼容性和丰富的功能受到了开发者的广泛青睐。然而&#xff0c;随着应用需求的日益增长&#xff0c;对框架的功能和性能要求也在不断提高…

防御---001

一、实验拓扑二、要求 1&#xff0c;DMZ区内的服务器&#xff0c;办公区仅能在办公时间内(9:00 - 18:00)可以访问&#xff0c;生产区的的设备全天可以访问. 2&#xff0c;生产区不允许访问互联网&#xff0c;办公区和游客区允许访问互联网 3,办公区设备10.0.2.10不允许访问DMZ…

Errno2:No such file or directory,在当前文件确实没有该图片,怎么解决?

&#x1f3c6;本文收录于《CSDN问答解惑-专业版》专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收…

【论文速读】《面向深度学习的联合消息传递与自编码器》

这篇文章来自华为的渥太华无线先进系统能力中心和无线技术实验室&#xff0c;作者中有大名鼎鼎的童文。 一、自编码架构的全局收发机面临的主要问题 文章对我比较有启发的地方&#xff0c;是提到自编码架构的全局收发机面临的主要问题&#xff1a; 问题一&#xff1a;基于随…

Ae After Effects2024 for Mac 视频处理软件

Mac分享吧 文章目录 效果一、准备工作二、开始安装1、Anticc简化版安装1.1双击运行软件&#xff0c;安装1.2 解决来源身份不明的开发者问题1.3 再次运行软件&#xff0c;即可进行AntiCC安装 2. Ae2024安装2.1 打开 Ae 2024 安装包组2.2 将 Ae 安装包拖至桌面2.3 安装 Ae2024 &…

运维锅总详解进程、内核线程、用户态线程和协程

I/O 密集型应用、计算密集型应用应该用什么实现&#xff1f;进程、内核线程、用户态线程、协程它们的原理和应用场景又是什么&#xff1f;如何组合它们才能让机器性能达到最优&#xff1f;它们的死锁和竞态又是什么&#xff1f;如何清晰地表示它们之间的关系&#xff1f;希望读…

UnityHub 无法添加模块问题

文章目录 1.问题描述2.问题解决 1.问题描述 在Hub中无法添加模块 2.问题解决 1、点击设置 2、设置版本安装位置 可以发现installs的安装位置路径设置不是unity安装位置&#xff0c;这里我们更改成自己电脑unity安装位置的上一级路径 添加模块正常&#xff1a;

第二证券:70万手封单,超3亿元资金盯上这只绩优股

今天A股商场收盘共50股涨停&#xff0c;剔除9只ST股后&#xff0c;41股涨停&#xff1b;25股封板未遂&#xff0c;全体封板率为67.78%。 涨停战场&#xff1a; 超3亿元资金封板盛屯矿业 据证券时报数据宝核算&#xff0c;从收盘涨停板封单量来看&#xff0c;盛屯矿业封单量最…

Vue从零到实战

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 非常期待和您一起在这个小…

电子电气架构 --- 关于DoIP的一些闲思 下

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是你的不对。非必要不费力证明自己,无利益不试图说服别人,是精神上的节…

软件架构之软件架构概述及质量属性

软件架构之软件架构概述及质量属性 第 9 章&#xff1a;软件架构设计9.1 软件架构概述9.1.1 软件架构的定义9.1.2 软件架构的重要性9.1.3 架构的模型 9.2 架构需求与软件质量属性9.2.1 软件质量属性9.2.2 6 个质量属性及实现 第 9 章&#xff1a;软件架构设计 像学写文章一样&…

Zynq系列FPGA实现SDI视频编解码+图像缩放+多路视频拼接,基于GTX高速接口,提供8套工程源码和技术支持

目录 1、前言工程概述免责声明 2、相关方案推荐本博已有的 SDI 编解码方案本博已有的FPGA图像缩放方案本方案的无缩放应用本方案在Xilinx--Kintex系列FPGA上的应用 3、详细设计方案设计原理框图SDI 输入设备Gv8601a 均衡器GTX 解串与串化SMPTE SD/HD/3G SDI IP核BT1120转RGB自研…

27. 738.单调递增的数字,968.监控二叉树,贪心算法总结

class Solution { public:int monotoneIncreasingDigits(int n) {string strNum to_string(n);// flag用来标记赋值9从哪里开始// 设置为这个默认值&#xff0c;为了防止第二个for循环在flag没有被赋值的情况下执行int flag strNum.size();for(int i strNum.size() - 1; i &…

前端html面试常见问题

前端html面试常见问题 1. !DOCTYPE (文档类型)的作用2. meta标签3. 对 HTML 语义化 的理解&#xff1f;语义元素有哪些&#xff1f;语义化的优点4. HTML中 title 、alt 属性的区别5. src、href 、url 之间的区别6. script标签中的 async、defer 的区别7. 行内元素、块级元素、空…

便宜SSL证书有哪些平台推荐 域名SSL证书作用

在数字化时代&#xff0c;网络安全已成为我们日常生活和工作中不可或缺的一部分。 申请便宜SSL证书步骤 1、登录来此加密网站&#xff0c;输入域名&#xff0c;可以勾选泛域名和包含根域。 2、选择加密方式&#xff0c;一般选择默认就可以了&#xff0c;也可以自定义CSR。 3…

【短小精悍】仅需6GB显存,你就可以跑起来清华智谱的ChatGLM-6B-Int4大模型

【短小精悍】仅需6GB显存&#xff0c;你就可以跑起来清华智谱的ChatGLM-6B-Int4大模型 版本环境一、序二、ChatGLM-6B-Int4大模型2.1 简介2.2 模型 三、运行环境3.1 下载模型3.2 下载环境3.3 下载代码 四、运行4.1 运行代码4.2 运行结果4.3 GPU使用情况 五、相关问题5.1 window…

绝区捌--将GPT幻觉的发生率从20%以上降低到2%以下

总结&#xff1a;我们没有使用微调&#xff0c;而是结合使用提示链和预处理/后处理来将幻觉发生率降低一个数量级&#xff0c;但这确实需要对 OpenAI 进行 3-4 倍的调用。还有很大的改进空间&#xff01; 使用 GPT 等大型语言模型面临的最大挑战之一是它们倾向于捏造信息。 这…

Phospho:LLM应用的文本分析利器

今天向大家介绍phospho文本分析平台&#xff0c;专门为大型语言模型&#xff08;LLM&#xff09;应用程序设计。它可以帮助开发者从用户或应用程序的文本消息中检测问题、提取洞见、收集用户反馈&#xff0c;并衡量成功。作为一个开源项目&#xff0c;phospho允许开发者查看和修…