IO流之 File 类和字节流
文章目录
- 一、File 类
- 1. 概述
- 2. 创建功能
- 3. 删除功能
- 4. 判断和获取功能
- 5. 递归策略
- 5.1 递归求阶乘
- 5.2 遍历目录
- 二、字节流
- 1. IO 流概述
- 2. 字节流写数据
- 2.1 三种方式
- 2.2 换行及追加
- 2.3 加异常处理
- 3. 字节流读数据
- 3.1 一次读一个字节
- 3.2 一次读一个字节数组
- 3.3 复制文本文件
- 3.4 复制图片
- 3.5 字节缓冲流
一、File 类
1. 概述
File:它是文件和目录路径名的抽象表示。
文件和目录是可以通过 File 封装成对象的。对于 File 而言,其封装的并不是一个真正存在的文件,仅仅是一个路径名而已,它是可以存在的,也可以是不存在的,将来是要通过具体的操作把这个路径的内容转换为具体存在的。
//Test.javapackage com.zxe;import java.io.File;public class Test {public static void main(String[] args) {//1.方式一File f1 = new File("F:\\tyut\\java.txt");System.out.println(f1);//2.方式二File f2 = new File("F:\\tyut", "java.txt");System.out.println(f2);//3.方式三File f3 = new File("F:\\tyut");File f4 = new File(f3, "java.txt");System.out.println(f4);}
}
这三个构造方法做的是同样的事情吗,File 起指引路径的作用!
2. 创建功能
//Test.javapackage com.zxe;import java.io.File;
import java.io.IOException;public class Test {public static void main(String[] args) throws IOException {File f1 = new File("F:\\tyut");System.out.println(f1.mkdir());File f2 = new File("F:\\tyut\\java.txt");System.out.println(f2.createNewFile());}
}
注意:
① 创建文件or目录时,如果该文件or目录已经存在,就不再创建,并返回 false;
② 不能根据 File 里面的路径名来判断创建的是文件还是目录,应该根据调用的方法来判断。
3. 删除功能
在此之前,先看一下绝对路径和相对路径吧!
绝对路径和相对路径的区别:
① 绝对路径:完整的路径名,不需要任何其他信息就可以定位它所表示的文件,例如 F:\tyut\java.txt;
② 相对路径:必须使用取自其他路径名的信息进行解释,例如 myFile\java.txt。
//1.在当前模块目录下创建文件
File f1 = new File("idea_test\\zxe.txt");
System.out.println(f1.createNewFile());
//删除当前模块目录下的某文件
File f1 = new File("idea_test\\zxe.txt");
System.out.println(f1.delete());
要想删除一个目录,就必须先删除该目录下的所有内容!
4. 判断和获取功能
//Test.javapackage com.zxe;import java.io.File;public class Test {public static void main(String[] args) {File f1 = new File("idea_test//play");String[] strArray = f1.list();for (String str : strArray) {System.out.println(str);}System.out.println("----------------");File[] fileArray = f1.listFiles();for (File file : fileArray) {if (file.isFile()) {System.out.println(file.getName());}}}
}
5. 递归策略
递归概述:以编程的角度来看,递归指的是方法定义中调用方法本身的现象。
(1)递归解决问题的思路:
① 把一个复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解;
② 递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算。
(2)递归解决问题要找到两个内容:
① 递归出口,否则会出现内存溢出;
② 递归规则,与原问题相似的规模较小的问题。
5.1 递归求阶乘
需求:用递归求 5 的阶乘,并把结果输出在控制台。
//Test.javapackage com.zxe;public class Test {public static void main(String[] args) {int result = jc(5);System.out.println(result);}public static int jc(int n) {if (n == 1) {return 1;} else {return n * jc(n - 1);}}
}
5.2 遍历目录
需求:给定一个路径,请通过递归的方法来遍历该目录下的所有内容,并把所有文件的绝对路径输出在控制台。
思路:
① 根据给定的路径创建一个 File 对象;
② 定义一个方法,用于获取给定目录下的所有内容,参数为第一步创建的 File 对象;
③ 获取给定的 File 目录下所有的文件或者目录的 File 数组;
④ 遍历该 File 数组,得到每一个 File 对象;
⑤ 判断该 File 对象是否是目录,如果是目录就递归调用,不是目录就获取绝对路径输出在控制台;
⑥ 调用方法。
//Test.javapackage com.zxe;import java.io.File;public class Test {public static void main(String[] args) {File srcFile = new File("F:\\tyut");getAllFilePath(srcFile);}public static void getAllFilePath(File srcFile) {File[] fileArray = srcFile.listFiles();if (fileArray != null) {for (File file : fileArray) {if (file.isDirectory()) {getAllFilePath(file);} else {System.out.println(file.getAbsolutePath());}}}}
}
二、字节流
1. IO 流概述
IO 指的就是输入 / 输出。
流:是一种抽象概念,是对数据传输的总称,也就是说数据在设备间的传输称为流,流的本质就是数据传输。
IO 流就是用来处理设备间数据传输问题的。
常见的应用:文件复制、文件上传、文件下载。
IO 流按照数据类型可以分为字节流和字符流。那么这两种流都在什么情况下使用呢?
如果数据通过 Window 自带的记事本软件打开,我们还可以读懂里面的内容,就使用字符流,否则使用字节流。如果你不知道该使用哪种类型的流,就使用字节流,因为字节流是万能的流。
2. 字节流写数据
InputStream:这个抽象类是表示字节输入流的所有类的超类;
OutputStream:这个抽象类是表示字节输出流的所有类的超类。
子类名都是以其父类名作为后缀的!
FileOutputStream:文件输出流用于将数据写入 File。
//Test.javapackage com.zxe;import java.io.FileOutputStream;
import java.io.IOException;public class Test {public static void main(String[] args) throws IOException {FileOutputStream fos = new FileOutputStream("idea_test\\myByteStream");fos.write(97);fos.close();}
}
(1)创建字节输出流对象,做了三件事情:
① 调用系统功能创建了文件;
② 创建了字节输出流对象;
③ 让字节输出流对象指向创建好的文件。
(2)最后都要释放资源,使用 close() 方法关闭此文件输出流并释放与此流相关联的任何系统资源。
如果没有该文件,则系统会自动创建文件,所有和 IO 操作相关的内容,最后都要释放资源!
2.1 三种方式
//Test.javapackage com.zxe;import java.io.FileOutputStream;
import java.io.IOException;public class Test {public static void main(String[] args) throws IOException {FileOutputStream fos = new FileOutputStream("idea_test\\myByteStream");byte[] by = {97, 98, 99, 100};fos.write(by);byte[] by2 = "abcde".getBytes();fos.write(by2);fos.close();}
}
write() 方法不能直接写入字符串,我们可以通过 String 类中的 getBytes() 方法,根据字符串得到它的字节数组,从而实现字符串的写入!
2.2 换行及追加
(1)字节流写数据如何实现换行?
不同系统对换行符号的识别是不同的:
① window:\r\n
② Linux:\n
③ mac:\r
(2)字节流写数据如何实现追加?
FileOutputStream(String name, boolean append)
创建文件输出流以指定的名称写入文件,如果第二个参数为 true,则字节将写入文件的末尾而不是开头。
//Test.javapackage com.zxe;import java.io.FileOutputStream;
import java.io.IOException;public class Test {public static void main(String[] args) throws IOException {FileOutputStream fos = new FileOutputStream("idea_test\\myByteStream", true);byte[] by = "你好哇!\r\n".getBytes();fos.write(by);fos.close();}
}
第二个参数不写的时候,默认用新数据替换旧数据,如果只是追加不替换,让第二个参数为 true 即可!
2.3 加异常处理
finally:在异常处理时提供 finally 块来执行所有的清除操作。比如 IO 流中的资源释放。
特点:被 finally 控制的语句一定会执行,除非 JVM 退出。
try {//可能出现的异常
} catch(IOException e) {//异常的处理代码
} finally {//执行所有清除操作
}
//Test.javapackage com.zxe;import java.io.FileOutputStream;
import java.io.IOException;public class Test {public static void main(String[] args) {FileOutputStream fos = null;try {new FileOutputStream("idea_test\\myByteStream", true);byte[] by = "你好哇!\r\n".getBytes();fos.write(by);} catch (IOException e) {e.printStackTrace();} finally {if (fos != null){try {fos.close();} catch (IOException e) {e.printStackTrace();}}}}
}
3. 字节流读数据
3.1 一次读一个字节
FileInputStream:从文件系统中的文件获取输入字节。
FileInputStream fis = new FileInputStream("idea_test\\myByteStream");int by;while ((by = fis.read()) != -1) {System.out.print((char) by);}
如果文件读到末尾,返回值为 -1!
3.2 一次读一个字节数组
//Test.javapackage com.zxe;import java.io.FileInputStream;
import java.io.IOException;public class Test {public static void main(String[] args) throws IOException {FileInputStream fis = new FileInputStream("idea_test\\myByteStream.txt");byte[] bys = new byte[1024];int len;while ((len = fis.read(bys)) != -1) {String result = new String(bys, 0, len);System.out.println(result);}fis.close();}
}
① \r\n 换行占两个字节;
② 字节数组的长度我们一般定为 1024 及其整数倍;
③ len 返回的并不是字节数组的长度,而是实际读取的数据的个数,当读到文本末尾的时候,len 可能就会发生变化;
④ new String(bys, 0, len) 读几个字节转几个字符串,没有读到的不转,文本末尾没有数据就没必要再转了,保证效率。
String 类中提供了一个构造方法 new String(),它可以将一个字节数组直接变成一个字符串!
3.3 复制文本文件
复制文本文件,其实就是把文本文件的内容从一个文件中读取出来(数据源),然后写入到另一个文件中(目的地)。
//Test.javapackage com.zxe;import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;public class Test {public static void main(String[] args) throws IOException {//将 F:\tyut\head.txt 文件的内容复制到 idea_test\myByteStream.txtFileInputStream fos = new FileInputStream("F:\\tyut\\head.txt");FileOutputStream fis = new FileOutputStream("idea_test\\myByteStream.txt");int byread;while ((byread = fos.read()) != -1) {fis.write(byread);}fos.close();fis.close();}
}
从文件中直接读取出来的内容是数字形式,写入文件时参数的内容也是数字形式,但写进去之后会变成相应的字符形式 abcd!
3.4 复制图片
FileInputStream fis = new FileInputStream("F:\\tyut\\xn.jpg");FileOutputStream fos = new FileOutputStream("idea_test\\xiaoyang.jpg");byte[] bys = new byte[1024];int len;while ((len = fis.read(bys)) != -1) {fos.write(bys, 0, len);}fos.close();fis.close();
3.5 字节缓冲流
① BufferedOutputStream:该类实现缓冲输出流。通过设置这样的输出流,应用程序可以向底层输出流写入字节,而不必为写入的每个字节导致底层系统的调用;
② BufferedInputStream:将创建一个内部缓冲区数组。当从流中读取或跳过字节时,内部缓冲区将根据需要从所包含的输入流中重新填充,一次很多字节。
字节缓冲流仅仅提供缓冲区,而真正的读写数据还得依靠基本的字节流对象进行操作!
//Test.javapackage com.zxe;import java.io.*;public class Test {public static void main(String[] args) throws IOException {BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("idea_test//myBufferedStream.txt"));bos.write("hello\r\n".getBytes());bos.write("world".getBytes());bos.close();BufferedInputStream bis = new BufferedInputStream(new FileInputStream("idea_test//myBufferedStream.txt"));//一次读取一个字节数据int by;while ((by = bis.read()) != -1) {System.out.print((char) by);}//一次读取一个字节数组数据byte[] bys = new byte[1024];int len;while ((len = bis.read(bys)) != -1) {System.out.println(new String(bys, 0, len));}bis.close();}
}
字节缓冲流使得读写速度加快!
相关文章:

IO流之 File 类和字节流
文章目录一、File 类1. 概述2. 创建功能3. 删除功能4. 判断和获取功能5. 递归策略5.1 递归求阶乘5.2 遍历目录二、字节流1. IO 流概述2. 字节流写数据2.1 三种方式2.2 换行及追加2.3 加异常处理3. 字节流读数据3.1 一次读一个字节3.2 一次读一个字节数组3.3 复制文本文件3.4 复…...

【华为机试真题 Python实现】2023年1、2月高频机试题
文章目录2023年1季度最新机试题机考注意事项1. 建议提前刷题2. 关于考试设备3. 关于语言环境3.1. 编译器信息3.2. ACM 模式使用sys使用input(推荐)3. 关于题目分值及得分计算方式4. 关于做题流程5. 关于作弊2023年1季度最新机试题 两个专栏现在有200博文…...

【拳打蓝桥杯】最基础的数组你真的掌握了吗?
文章目录一:数组理论基础二:数组这种数据结构的优点和缺点是什么?三:数组是如何实现随机访问的呢?四:低效的“插入”和“删除”原因在哪里?五:实战解题1. 移除元素暴力解法双指针法2…...

断崖式难度的春招,可以get这些点
前言 大家好,我是bigsai,好久不见,甚是想念。 开学就等评审结果,还好擦边过了,上周答辩完整理材料,还好都过了(终于可以顺利毕业了),然后后面就是一直安享学生时代的晚年。 最近金三银四黄金…...

一年经验年初被裁面试1月有余无果,还遭前阿里面试官狂问八股,人麻了
最近接到一粉丝投稿:年初被裁员,在家躺平了6个月,然后想着学习下再去面试,现在面试了1个月有余,无果,天天打游戏到半夜,根本无法静下心来学习。下面是他这些天面试经常会被问到的一些问题&#…...

我从功能测试到python接口自动化测试涨到22k,谁知道我经历了什么......
目录:导读前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜)前言 常见的接口…...

SDG,ADAM,LookAhead,Lion等优化器的对比介绍
本文将介绍了最先进的深度学习优化方法,帮助神经网络训练得更快,表现得更好。有很多个不同形式的优化器,这里我们只找最基础、最常用、最有效和最新的来介绍。 优化器 首先,让我们定义优化。当我们训练我们的模型以使其表现更好…...

【项目实现典型案例】12.数据库数据类型不一致导致查询慢
目录一:背景介绍二:索引失效复现四:索引实现的六种情况1、类型转换,函数2、ISNULL3、通配符开头4、范围查询5、组合索引,不符合最左匹配原则6、WHERE子句中的OR四:总结一:背景介绍 MySql数据库…...
【大数据开发】报错汇总
目录 Hadoop Attempting to operate on hdfs namenode as root jps后没有namenode Hive Exception in thread "main" java.lang.NoSuchMethodError: com.google.common.base.Preconditions.checkArgument(ZLjava/lang/String;Ljava/lang/Object;)V Caused by:o…...

HTTPS的加密原理(工作机制)
现在很多网站使用的都是HTTPS协议,比如CSDN他们为什么要使用HTTPS协议而不是继续使用HTTP协议呢?以及HTTPS都做了些什么?HTTP协议与HTTPS有哪些区别? 下面我来 讲解这些问题?(篇幅可能有些长,请求耐心观看,我以0基础的角度去讲解这些东西, 如果你有一定的基础前面的跳过就好…...
Git仓库迁移
背景 由于公司原来的gitee地址需要改完新的gitlab仓库,大量的服务模块已再本地进行开发,且存在大量分支进行维护,迁移要求历史提交记录也得同步,需要简单快捷一并完成各服务已经分支迁移。 一、在新的目标git中创建新代码仓 新…...
用CHATGPT生成C++面试题及答案
以下是C的面试题及其答案: 什么是C?C与C语言有什么区别? C是一种高级编程语言,是对C语言的扩展。C具有更强大的面向对象编程能力,支持类、继承、多态等特性。 什么是面向对象编程? 面向对象编程是一种编程…...

二进制,八进制,十进制,十六进制的相互转换【简单易懂】(含代码模板)
目录 二进制转十进制 十进制原理: 二进制转十进制计算: 八、十六进制转十进制 八、十六进制转十进制计算: 十进制转其他进制 十进制转二进制: 十进制转八进制: 十进制转十六进制: 不同进制之间的相互转…...

Redis技术详解
Redis技术详解 Redis是一种支持key-value等多种数据结构的存储系统。可用于缓存,事件发布或订阅,高速队列等场景。支持网络,提供字符串,哈希,列表,队列,集合结构直接存取,基于内存&…...

解决mybatis-plus updateById方法不能set null
原因 因为 MyBatis-Plus 自带的更新方法,都有对对象空值进行判空。只有不为空的字段才会进行数据更新 所以像updateById等方法,在更新时会自动忽略为null的字段,只更新非null字段值 但在某些情况下,我们的需求就是将数据库中的值…...
Linux的mysql 数据库及开发包安装
注意:以下操作都以 root 用户进行操作 直接按照下列步骤在命令行输入即可 下载 1: sudo yum install -y mariadb 2: sudo yum install -y mariadb-server 3: sudo yum install -y mariadb-devel 接下来配置文件:在相应…...

π-Day快乐:Python可视化π
π-Day快乐:Python可视化π 今天是3.14,正好是圆周率 π\piπ 的前3位,因此数学界将这一天定为π\bold{\pi}π day。 π\piπ 可能是最著名的无理数了,人类对 π\piπ 的研究从未停止。目前人类借助计算机已经计算到 π\piπ 小数…...

【论文速递】ACM MM 2022 - 基于统一对比学习框架的新闻多媒体事件抽取
【论文速递】ACM MM 2022 - 基于统一对比学习框架的新闻多媒体事件抽取 【论文原文】:Multimedia Event Extraction From News With a Unified Contrastive Learning Framework 【作者信息】:Liu, Jian and Chen, Yufeng and Xu, Jinan 论文ÿ…...
数据库分库分表
一、为什么要分库分表 如果一个网站业务快速发展,那这个网站流量也会增加,数据的压力也会随之而来,比如电商系统来说双十一大促对订单数据压力很大,Tps十几万并发量,如果传统的架构(一主多从),主库容量肯定无法满足这么高的Tps,业务越来越大,单表数据超出了数据库支持…...

【C缺陷与陷阱】----语义“陷阱”
💯💯💯 本篇处理的是有关语义误解的问题:即程序员的本意是希望表示某种事物,而实际表示的却是另外一种事物。在本篇我们假定程序员对词法细节和语法细节的理解没有问题,因此着重讨论语义细节。导言…...

JavaSec-RCE
简介 RCE(Remote Code Execution),可以分为:命令注入(Command Injection)、代码注入(Code Injection) 代码注入 1.漏洞场景:Groovy代码注入 Groovy是一种基于JVM的动态语言,语法简洁,支持闭包、动态类型和Java互操作性,…...
利用ngx_stream_return_module构建简易 TCP/UDP 响应网关
一、模块概述 ngx_stream_return_module 提供了一个极简的指令: return <value>;在收到客户端连接后,立即将 <value> 写回并关闭连接。<value> 支持内嵌文本和内置变量(如 $time_iso8601、$remote_addr 等)&a…...
FFmpeg 低延迟同屏方案
引言 在实时互动需求激增的当下,无论是在线教育中的师生同屏演示、远程办公的屏幕共享协作,还是游戏直播的画面实时传输,低延迟同屏已成为保障用户体验的核心指标。FFmpeg 作为一款功能强大的多媒体框架,凭借其灵活的编解码、数据…...
三体问题详解
从物理学角度,三体问题之所以不稳定,是因为三个天体在万有引力作用下相互作用,形成一个非线性耦合系统。我们可以从牛顿经典力学出发,列出具体的运动方程,并说明为何这个系统本质上是混沌的,无法得到一般解…...

如何在网页里填写 PDF 表格?
有时候,你可能希望用户能在你的网站上填写 PDF 表单。然而,这件事并不简单,因为 PDF 并不是一种原生的网页格式。虽然浏览器可以显示 PDF 文件,但原生并不支持编辑或填写它们。更糟的是,如果你想收集表单数据ÿ…...

华硕a豆14 Air香氛版,美学与科技的馨香融合
在快节奏的现代生活中,我们渴望一个能激发创想、愉悦感官的工作与生活伙伴,它不仅是冰冷的科技工具,更能触动我们内心深处的细腻情感。正是在这样的期许下,华硕a豆14 Air香氛版翩然而至,它以一种前所未有的方式&#x…...

JVM 内存结构 详解
内存结构 运行时数据区: Java虚拟机在运行Java程序过程中管理的内存区域。 程序计数器: 线程私有,程序控制流的指示器,分支、循环、跳转、异常处理、线程恢复等基础功能都依赖这个计数器完成。 每个线程都有一个程序计数…...
MySQL 索引底层结构揭秘:B-Tree 与 B+Tree 的区别与应用
文章目录 一、背景知识:什么是 B-Tree 和 BTree? B-Tree(平衡多路查找树) BTree(B-Tree 的变种) 二、结构对比:一张图看懂 三、为什么 MySQL InnoDB 选择 BTree? 1. 范围查询更快 2…...

c++第七天 继承与派生2
这一篇文章主要内容是 派生类构造函数与析构函数 在派生类中重写基类成员 以及多继承 第一部分:派生类构造函数与析构函数 当创建一个派生类对象时,基类成员是如何初始化的? 1.当派生类对象创建的时候,基类成员的初始化顺序 …...

Ubuntu Cursor升级成v1.0
0. 当前版本低 使用当前 Cursor v0.50时 GitHub Copilot Chat 打不开,快捷键也不好用,当看到 Cursor 升级后,还是蛮高兴的 1. 下载 Cursor 下载地址:https://www.cursor.com/cn/downloads 点击下载 Linux (x64) ,…...