【Java】IO流

一、IO流的定义

二、  字节流

(一)FileOutputStream

操作本地文件的字节输出流,可以把程序中的数据写到本地文件中。

1、书写步骤

 

注:

(1)创建字节输出流对象:

  • 参数是字符串表示的路径或者是file对象都是可以的。
  • 如果文件不存在,会创建一个新的文件,但要保证父级路径是存在的
  • 例如:("父级路径\\文件名.txt")
  • 如果文件已经存在,会清空文件。

(2)写数据

  • write方法的参数是整数,但实际上写到本地文件的是整数在ASCII上对应的字符,
  • 也就是说:write里面的参数是ASCII码。可以'97'.getByte()

(3)释放资源

  • 每次使用完流后要释放资源
  • 不释放的话,在本地无法操作,例如你想删了删不掉,显示正在占用

2、写数据的3种方式

3、换行写

Windows:换行符\r\n,但由于java对回车换行进行了优化,所以只写1个 \n或者\r就行

Linux:\n

4、续写

append传递true的话,就开启续写了,false的话关闭续写,再次创建对象会清空文件

(二)FileInputStream

1、创建字节输入流对象

(1)创建字节输入流对象

  • 如果文件不存在,会直接报错
  • 这一点和输出流不同,输出流最重要的是要输出的数据,所以如果文件不存在,自动创建一个就好。而输入流要读数据,文件不存在时创建一个空文件来读空的数据是没有意义的。

(2)读取数据

  • 一次读一个字节,读出来的是ASCII码
  • 读到文件末尾了,read方法返回-1

(3)释放资源

  • 每次使用完流必须要释放资源

2、读数据.read()

read()会逐个逐个的读取,如果得不到了,返回的是-1,其他正常返回的是ASCII码,如果想输出字符串形式的,就强转(char)

3、循环读取

(三)拷贝

1、每次读取1个字节可以满足——>小文件

2、每次读取多个字节——>大文件

1024的整数倍

由于第3次只剩下1个e了,写入bytes[0] = e,但bytes[1]没有被覆盖,所以第3次读取的是ed。

如果还要继续读取第4次,由于什么也没有读到,会自动返回-1。

为了防止这种现象,可以利用上len:这样就不会在最后出现打印了上次读取的数据的情况

FileInputStream fis = new FileInputStream ("D:\\movie.mp4");
FileOutputStream fos = new FileOutputStream ("myio\\copy.mp4");int len;
byte[] bytes = new byte[1024*1024*5];//这是5M的大小while((len = fis.read(bytes)) != -1){fos.write(bytes,0,len);}

若要记录运行的时间:

//开始时间:
long start = System.currentTimeMillis();//程序//结束时间
long end = System.currentTimeMillis();//用时
end-start

(四) 可能的异常IOException

(五) 字符集

乱码问题

存储英文一个字节足以 

1、GBK

一个汉字用两个字节来存储,包含高位字节和低位字节

2、Unicode

中文的第一个字节的首位,一定是1 

UTF-8是Unicode字符集的一种编码方式,而不是字符集

 3、为什么会有乱码

(1)读取数据时未读完整个汉字

(2)编码和解码的方式不统一


三、字符流

(一)FileReader

 

有参的read方法 = 空参的read方法 + 强制类型转换

(二)FileWriter

(三)字符输入流的底层原理

(四)字符输出流的底层原理

以下三种方法可以把缓存区中的数据拿出来: 

结果:

经过flush或者close的都从缓冲区拿出来了,但close结束后的B站就无法write了。 

四、字节流和字符流的使用场景

1、拷贝练习

public class Main {public static void main(String[] args) throws IOException {File src = new File("D:\\AAA\\SRC");File sDEST = new File("D:\\AAA\\DEST");COPYDIR(src,sDEST);}private static void COPYDIR(File src, File sDEST) throws IOException {sDEST.mkdirs();//递归//1、进入数据源File[] files = src.listFiles();//2、遍历数组for (File file : files) {if(file.isFile()){//3、判断文件,拷贝FileInputStream fis = new FileInputStream(file);FileOutputStream fos = new FileOutputStream(new File(sDEST,file.getName()));byte[] buffer = new byte[1024];int length;while((length = fis.read(buffer))!=-1){fos.write(buffer,0,length);}fis.close();fos.close();}else{//4、判断文件夹,递归COPYDIR(file,new File(sDEST,file.getName()));}}}
}

2、文件加密 

采用的加密解密方式:异或同一个数,得到原本的数..

解密和加密的代码一样:

3、修改文件中的数据 

五、缓冲流

1、字节缓冲流(单个+多个)

字节缓冲流提高效率的原理

节约的是读和写的时候和硬盘打交道的时间

2、字符缓冲流

提高的效率不是很明显,但有两个很好用的方法

续写:

3、总结

六、转换流

把字节流转换成字符流

七、序列化流/对象操作输出流

八、反序列化流/对象操作输入流

 

细节:

如果修改javabean类,会报错,因为版本号改变了,

解决办法:固定版本号

(1)方法1:固定私有,static,final且long的serialVersionUID = 1L

(2) 方法2:利用idea

可能版本不同换了位置 不显示的可以在File > Settings > Editor > Inspections > JVM languages 下找到并勾选应用就可以了

如果某个变量不想序列化到本地,加关键字transient

 如果在反序列化流时不知道有几个对象,就把ois.readObject()强转成ArrayList<自定义类>

九、打印流

打印流只有输出,没有读

 

 

字符打印

不加自动刷新的话要手动刷新才行,不然还在缓存里放着,不过close也会自动刷新

总结

十、解压缩流/压缩流

1、解压缩流

2、压缩流

(1)压缩单个文件

(2)压缩文件夹

 

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

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

相关文章

Java 大视界 -- Java 大数据机器学习模型在电商商品推荐冷启动问题中的解决策略(160)

&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎来到 青云交的博客&#xff01;能与诸位在此相逢&#xff0c;我倍感荣幸。在这飞速更迭的时代&#xff0c;我们都渴望一方心灵净土&#xff0c;而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识&#xff0c;也…

MySQL———作业实验

一、创建数据库表 1.创建数据库 mysql> create database mydb11_stu; mysql> use mydb11_stu; 2.建表 &#xff08;1&#xff09;创建student表 mysql> create table student ( -> id int(10) not null unique primary key, -> name varch…

深度解析衡石科技HENGSHI SENSE嵌入式分析能力:如何实现3天快速集成

嵌入式分析成为现代SaaS的核心竞争力 在当今SaaS市场竞争中&#xff0c;数据分析能力已成为产品差异化的关键因素。根据Bessemer Venture Partners的最新调研&#xff0c;拥有深度嵌入式分析功能的SaaS产品&#xff0c;其客户留存率比行业平均水平高出23%&#xff0c;ARR增长速…

Day17 -实例:利用不同语言不同框架的特征 进行识别

前置&#xff1a;我们所需的web站点&#xff0c;都可以利用fofa去搜索&#xff0c;例如&#xff1a;app"flask"这样的语句去找对应的站点&#xff0c;找到后&#xff0c;我们模拟不知道是什么框架&#xff0c;再根据特征去判断它的框架。 ***利用工具可以再去结合大…

Linux输入系统应用编程

什么是输入系统 Linux 输入系统是处理用户输入设备(如键盘、鼠标、触摸屏、游戏手柄等)的软件架构。在应用编程层面&#xff0c;它提供了与这些输入设备交互的接口。 主要组成部分 输入设备驱动层&#xff1a;直接与硬件交互的驱动程序 输入核心层&#xff1a;内核中的输入子…

【C++初阶】---类和对象(下)

1.再探构造函数&#xff08;初始化链表&#xff09; •之前我们实现构造函数时&#xff0c;初始化成员变量主要使⽤函数体内赋值&#xff0c;构造函数初始化还有⼀种⽅式&#xff0c;就是初始化列表&#xff0c;初始化列表的使⽤⽅式是以⼀个冒号开始&#xff0c;接着是⼀个以逗…

Ubuntu 22.04.5 LTS 设置时间同步 ntp

提示&#xff1a;文章为操作记录&#xff0c;以备下次使用 文章目录 前言一、设置ntp1.1替换国内源1.2 更新源&安装1.3 验证 前言 设置时间同步&#xff0c;环境版本 # cat /etc/os-release PRETTY_NAME"Ubuntu 22.04.5 LTS" NAME"Ubuntu" VERSION_…

飞书电子表格自建应用

背景 coze官方的插件不支持更多的飞书电子表格操作&#xff0c;因为需要自建应用 飞书创建文件夹 创建应用 开发者后台 - 飞书开放平台 添加机器人 添加权限 创建群 添加刚刚创建的机器人到群里 文件夹邀请群 创建好后&#xff0c;就可以拿到id和key 参考教程&#xff1a; 创…

计算机网络——传输层(TCP)

传输层 在计算机网络中&#xff0c;传输层是将数据向上向下传输的一个重要的层面&#xff0c;其中传输层中有两个协议&#xff0c;TCP&#xff0c;UDP 这两个协议。 TCP 话不多说&#xff0c;我们直接来看协议报头。 源/目的端口号&#xff1a;表示数据从哪个进程来&#xff0…

【ArcGIS】ArcGIS10.6彻底卸载和ArcGIS10.2安装全过程

卸载python3后,解决了ArcGIS与python3冲突问题后,软件可以正常打开使用了 但是还是出现了问题 用ArcGIS 进行空间分析时,中间操作没有任何报错和问题,但是就是没有运行结果 在别人的软件上操作一遍可以出现运行结果 关闭确有这个,但真的不是我给它的运行时间不够,反反复复试…

智慧电力:点亮未来能源世界的钥匙

在科技日新月异的今天&#xff0c;电力行业正经历着前所未有的变革。智慧电力&#xff0c;作为这一变革的核心驱动力&#xff0c;正逐步改变着我们对电力的认知和使用方式。它不仅是电力行业的一次技术革新&#xff0c;更是推动社会可持续发展、实现能源高效利用的重要途径。 智…

oracle中java类的使用

方式一&#xff1a; 编写一个简单的java类 vi OracleJavaDemo.java public class OracleJavaDemo { public static String processData(String input) { return "Processed: " input; } } 编译 javac OracleJavaDemo.java 生成OracleJavaDemo…

pycharm2024.1.1版本_jihuo

目录 前置&#xff1a; 步骤&#xff1a; step one 下载软件 step two 卸载旧版本 1 卸载软件 2 清除残余 step three 下载补丁 step four 安装2024.1.1版本软件 step five 安装补丁 1 找位置放补丁 2 自动设置环境变量 step six 输入jihuo码 前置&#xff1a; 之…

革新汽车安全通信技术,美格智能全系车载通信模组支持NG-eCall

根据QYR&#xff08;恒州博智&#xff09;的统计及预测&#xff0c;2024年全球汽车无线紧急呼叫&#xff08;eCall&#xff09;设备市场销售额达到了25.17亿美元&#xff0c;预计2031年将达到44.97亿美元&#xff0c;年复合增长率&#xff08;CAGR 2025-2031&#xff09;为8.8%…

AWE 2025:当AI科技遇见智能家居

3月20日&#xff0c;以“AI科技、AI生活”为主题的AWE2025&#xff08;中国家电及消费电子博览会&#xff09;在上海新国际博览中心开幕。作为全球家电行业风向标&#xff0c;本届展会最大的亮点莫过于健康理念在家电领域的全面渗透。从食材保鲜到空气净化&#xff0c;从衣物清…

《Spring Cloud Eureka 高可用集群实战:从零构建高可靠性的微服务注册中心》

从零构建高可用 Eureka 集群 | Spring Cloud 微服务架构深度实践指南 本文核心内容基于《Spring Cloud 微服务架构开发》第1版整理&#xff0c;结合生产级实践经验优化 实验环境&#xff1a;IntelliJ IDEA 2024 | JDK 1.8| Spring Boot 2.1.7.RELEASE | Spring Cloud Greenwich…

蓝桥杯[每日一题] 真题:管道(java版)

题目描述 有一根长度为 len 的横向的管道&#xff0c;该管道按照单位长度分为 len 段&#xff0c;每一段的中央有一个可开关的阀门和一个检测水流的传感器。一开始管道是空的&#xff0c;位于 Li 的阀门会在 Si 时刻打开&#xff0c;并不断让水流入管道。 对于位于 Li 的阀门&a…

2.pycharm部署Ai - 编程好助手

一、pycharm安装continue插件 1.提前安装好pycharm&#xff0c;并双击打开 2.File – Setting 3.Plugins – 搜索Continue &#xff0c; 点击Install安装 4.点ok 二、获取硅基流动API 1.登入网站&#xff1a;https://siliconflow.cn/zh-cn/#/&#xff0c;并注册登入 2.获取AP…

《数据结构:单链表》

“希望就像星星&#xff0c;或许光芒微弱&#xff0c;但永不熄灭。” 博主的个人gitee&#xff1a;https://gitee.com/friend-a188881041351 一.概念与结构 链表是一种物理存储上非连续、非顺序的存储结构&#xff0c;数据元素的顺序逻辑是通过链表中的指针链接次序实现的。 单…

Visual Studio 2019 Qt QML 项目环境搭建常见问题处理方法

在 Visual Studio 2019 运行 Qt/QML 项目比直接使用QtCreator环境麻烦&#xff0c;主要是有qmake 的一些配置项不能在 Visual Studio中设置。下面整理一些常见问题的处理方法&#xff0c;供参考&#xff1a; 搭建VS Qt 环境&#xff0c;在Visual Studios 2019下面安装 Qt Vis…