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缺陷与陷阱】----语义“陷阱”
💯💯💯 本篇处理的是有关语义误解的问题:即程序员的本意是希望表示某种事物,而实际表示的却是另外一种事物。在本篇我们假定程序员对词法细节和语法细节的理解没有问题,因此着重讨论语义细节。导言…...
JavaWeb--VUE
VUE1 概述2 快速入门3 Vue 指令3.1 v-bind & v-model 指令3.2 v-on 指令3.3 条件判断指令3.4 v-for 指令4 生命周期5 案例5.1 需求5.2 查询所有功能5.3 添加功能目标 能够使用VUE中常用指令和插值表达式能够使用VUE生命周期函数 mounted 1 概述 接下来我们学习一款前端的框…...
2分钟彻底搞懂“高内聚,低耦合”
💗推荐阅读文章💗 🌸JavaSE系列🌸👉1️⃣《JavaSE系列教程》🌺MySQL系列🌺👉2️⃣《MySQL系列教程》🍀JavaWeb系列🍀👉3️⃣《JavaWeb系列教程》…...
网络编程UDP TCP
定义:关注底层数据的传输 区分网页编程:关注上层应用 端口号:区分软件 2个字节 0~65535表示端口号 同一协议下端口号不能冲突 8000以下称为预留端口号,建议之间设置端口号为8000以上 常见的端口号: 80:http 8080:tomcat 3306:mysql 1521:oracle InetSocketAddress:此类实现IP套…...
【2023-Pytorch-检测教程】手把手教你使用YOLOV5做电线绝缘子缺陷检测
随着社会和经济的持续发展,电力系统的投资与建设也日益加速。在电力系统中,输电线路作为电能传输的载体,是最为关键的环节之一。而绝缘子作为输电环节中的重要设备,在支撑固定导线,保障绝缘距离的方面有着重要作用。大…...
交叉编译(NDK)
文章目录前言Android-NDK使用NDK目录结构主流的Android NDK交叉编译前言 交叉编译是指在一种计算机体系结构上编译和构建应用程序,但是生成的可执行文件和库是针对另一种不同的体系结构,比如ARM、MIPS、PowerPC、x86 等。 常见的交叉编译工具集&#x…...
【数据库】MySQL 解读事务的意义及原则
目录 1.事务的概念 2.为什么要用事物 3.使用 4.事务的原则(ACID) 4.1原子性(Atomicity) 4.2一致性(Consistency) 4.3持久性(Durability) 4.4隔离性(Isolation…...
【Linux】冯诺依曼体系结构
冯诺依曼体系结构一、计算机结构体系来源二、冯诺依曼体系结构三、冯诺依曼体系结构中的数据流动一、计算机结构体系来源 研制电子计算机的想法产生于第二次世界大战期间,主要用来进行弹道计算,在"时间就是胜利"的战争年代,迫切需…...
【小白】git是什么?gitee和git和github的关系?
gitee问题一、git是什么?gitee和git和github的关系?问题二、能不能通俗易懂的说?问题一、git是什么?gitee和git和github的关系? Git是一种版本控制系统,用于管理文件的版本、记录文件的修改历史以及协同开…...
UDS 14229 -1 刷写34,36,37服务,标准加Trace讲解,没理由搞不明白
🍅 我是蚂蚁小兵,专注于车载诊断领域,尤其擅长于对CANoe工具的使用🍅 寻找组织 ,答疑解惑,摸鱼聊天,博客源码,点击加入👉【相亲相爱一家人】🍅 玩转CANoe&…...
【Android -- 软技能】聊聊程序员的软技能
什么是软技能? 所谓软技能,就是相对于「硬技能」而言的技能,对于程序员来说,「硬技能」就是计算机专业技术能力,软技能则是专业之外的所有技能,包括职业规划能力、处理人际关系能力、专业态度、做事的方式…...
用地方别名做网站名/网络营销的推广方式
总结一下斯堪福三定律。 斯堪福第一定律:睡眠定律 我们应该安排好自己的时间…… 一个人如果每天睡7个小时,自然是很好的。 一个人如果每天只睡6个小时,第一天感觉会很好,觉得自己多做了很多事。 但是如果继续下去,你会…...
群晖wordpress 证书/seo技术经理
问题描述:巨坑!!!! 正常新建完成一个项目demo2 代码和外部库都没有任何问题,跑起来测试的时候却失败了 原因分析: java.lang.NoClassDefFoundError: com/google/common/collect/Immutable…...
柳州专业网站建设加盟/西安优化外
骨架屏 最近在项目不时有用到骨架屏的需求,所以抽时间对骨架屏的方案作了一下调研,骨架屏的实践已经有很多了,也有很多人对自己的方案作了介绍.在这里按照个人的理解做了一个汇总和分类,分享给大家. 关于骨架屏(简介) 骨架屏就是在页面数据尚未加载前先给用户展示出页面的大…...
网站建设需要经历什么步骤/优秀的网络搜索引擎营销案例
Pod控制器类型: ReplicationController Replicaset Replicaset:维持用户期望的pod副本数 标签选择器:以便选定由自己选定管理的pod副本 pod资源模板:完成pod资源的新建 特点:管理无状态的pod资源,精确反映用户所定义的目标数量…...
网站模板 酒类/重庆关键词自动排名
文章目录写在开头(使用前必看)!!!1 linux怎么修改用户名2 SSH服务器拒绝了密码,请再试一次2.1 首先检查输入用户名密码,大部分都是此类错误2.2 通常解决方法3 Linux -bash: telnet: 未找到命令4 Failed to restart ssh.service: Unit not found.5 root被…...
站长工具平台/深圳网站seo地址
CSS的简介1、CSS概述及作用CSS:Cascading Style Sheets)是层叠样式表用来定义网页的显示效果。可以解决html代码对样式定义的重复,提高了后期样式代码的可维护性,并增强了网页的显示效果功能。作用:CSS将网页内容和显示样式进行分…...