JAVA--IO流2(缓冲流、转换流、序列化流、打印流、Properties、IO工具包)

缓冲流

字节缓冲流
BufferedOutputStream:字节缓冲输出流
构造:BufferedOutputStream(OutputStream out)
使用:和FileOutputStream一样

BufferedInputStream:字节缓冲输入流
构造:BufferedInputStream(InputStream in)
使用:和FileInputStream一样

问题1:使用缓冲流的时候,为啥只需要关闭缓冲流,不用单独关闭基本流呢?
缓冲流的close方法底层会自动关闭基本流

问题2:缓冲流底层有数组(缓冲区),都是在内存之间进行读写,那么缓冲流读写的过程是啥样的呢?
注意:先依靠基本流将数据读出来,然后交给缓冲流,由于缓冲流缓冲区是8192,所以每次读取8192个字节放到缓冲区中,然后再将输入流缓冲区中的数据交给输出流缓冲区,然后再利用基本流将数据写到硬盘上
那么在操作代码时len是干啥的呢?其实主要是在两个缓冲区中倒腾数据,将输入流缓冲区中的数据读到,然后写到输出流缓冲区中,等待输出流缓冲区满了,再依靠基本流写到硬盘上;如果输入流缓冲区中的数据读不到了,重新从硬盘上读8192个字节,进入到输入流缓冲区中,继续利用len在两个缓冲区中来回倒腾数据
字符缓冲流
字符缓冲输出流_BufferedWriter
1.构造: BufferedWriter(Writer w)
2.方法:
用起来和FileWriter一样
3.特有方法:newLine() 换行

public class Demo02BufferedWriter {public static void main(String[] args)throws Exception {BufferedWriter bw = new BufferedWriter(new FileWriter("module22\\1.txt",true));bw.write("床前明月光");bw.newLine();bw.write("疑是地上霜");bw.newLine();bw.write("举头望明月");bw.newLine();bw.write("低头思故乡");bw.newLine();bw.close();}
}

字符缓冲输入流_BufferedReader
1.构造:BufferedReader(Reader r)
2.方法:
用法和FileReader一样
3.特有方法:String readLine()-> 一次读一行,如果读到结束标记,返回的是null

public class Demo03BufferedReader {public static void main(String[] args)throws Exception {BufferedReader br = new BufferedReader(new FileReader("module22\\1.txt"));//定义一个字符串,接收读取的内容String line = null;while((line = br.readLine())!=null){System.out.println(line);}br.close();}
}

转换流

字符集
ASCII字符集 :基本的ASCII字符集,使用7位(bits)表示一个字符,共128字符。ASCII的扩展字符集使用8位(bits)表示一个字符,共256字符,方便支持欧洲常用字符。
ISO-8859-1字符集:- 拉丁码表,别名Latin-1,用于显示欧洲使用的语言,包括荷兰、丹麦、德语、意大利语、西班牙语等。 ISO-8859-1使用单字节编码,兼容ASCII编码。
GBxxx字符集

  • GB就是国标的意思,是为了显示中文而设计的一套字符集。
  • GB2312:简体中文码表。一个小于127的字符的意义与原来相同。但两个大于127的字符连在一起时,就表示一个汉字,这样大约可以组合了包含7000多个简体汉字,此外数学符号、罗马希腊的字母、日文的假名们都编进去了,连在ASCII里本来就有的数字、标点、字母都统统重新编了两个字节长的编码,这就是常说的"全角"字符,而原来在127号以下的那些就叫"半角"字符了。
  • GBK:最常用的中文码表。是在GB2312标准基础上的扩展规范,使用了双字节编码方案,共收录了21003个汉字,完全兼容GB2312标准,同时支持繁体汉字以及日韩汉字等。
  • GB18030:最新的中文码表。收录汉字70244个,采用多字节编码,每个字可以由1个、2个或4个字节组成。支持中国国内少数民族的文字,同时支持繁体汉字以及日韩汉字等。
    Unicode字符集
  • Unicode编码系统为表达任意语言的任意字符而设计,是业界的一种标准,也称为统一码、标准万国码。
  • 它最多使用4个字节的数字来表达每个字母、符号,或者文字。有三种编码方案,UTF-8、UTF-16和UTF-32。最为常用的UTF-8编码。
  • UTF-8编码,可以用来表示Unicode标准中任何字符,它是电子邮件、网页及其他存储或传送文字的应用中,优先采用的编码。互联网工程工作小组(IETF)要求所有互联网协议都必须支持UTF-8编码。所以,我们开发Web应用,也要使用UTF-8编码。它使用一至四个字节为每个字符编码,编码规则:
    1. 128个US-ASCII字符,只需一个字节编码。
    2. 拉丁文等字符,需要二个字节编码。
    3. 大部分常用字(含中文),使用三个字节编码。
    4. 其他极少使用的Unicode辅助字符,使用四字节编码。

转换流_InputStreamReader
**1.概述:**是字节流通向字符流的桥梁 -> 读数据
2.构造: InputStreamReader(InputStream in,String charsetName)
charsetName:指定编码,不区分大小写
3.作用:
可以直接指定编码,按照指定的编码去读内容
4.用法:
基本用法和FileReader一样

public class Demo01InputStreamReader {public static void main(String[] args)throws Exception {InputStreamReader isr =new InputStreamReader(new FileInputStream("E:\\Idea\\io\\1.txt"),"gbk");int data = isr.read();System.out.println((char)data);isr.close();}
}

转换流_OutputStreamWriter
1.概述:是字符流通向字节流的桥梁
2.构造: OutputStreamWriter(OutputStream out,String charsetName)
3.作用:
按照指定的编码规则去存数据
4.用法:
和FileWriter一样

public class Demo02OutputStreamWriter {public static void main(String[] args)throws Exception {OutputStreamWriter osw =new OutputStreamWriter(new FileOutputStream("E:\\Idea\\io\\1.txt"),"gbk");osw.write("你好");osw.close();}
}

序列化流

一.序列化流和反序列化流介绍
1.作用:读写对象
2.两个对象:
a.ObjectOutputStream -> 序列化流 -> 写对象
b.ObjectInputStream -> 反序列化流 -> 读对象
3.注意:
我们将对象序列化到文件中,我们打开文件看不懂,这就对了,很多时候,我们操作的数据不能随便让别人看懂,不然别人就随意改动了,我们只需要将这些看不懂的内容成功读回来即可

应用场景:比如玩儿游戏会对英雄存档,那么退出的时候英雄变成对象,将人物的属性变成对象的成员变量值,然后存到文件中,再次打开游戏,直接从文件中将这些人物对象读回来,将对象以及对象中的属性还原
序列化流_ObjectOutputStream
1.作用:写对象
2.构造:ObjectOutputStream(OutputStream out)
3.方法:writeObject(Object obj) -> 写对象
4.注意:
想要将对象序列化到文件中,被序列化的对象需要实现Serializable接口

public class Person implements Serializable {private String name;private Integer age;public Person() {}.......

反序列化_ObjectInputStream
1.作用:读对象
2.构造:ObjectInputStream(InputStream in)
3.方法:Object readObject()

打印流

PrintStream打印流基本使用
1.构造:PrintStream(String fileName)
2.方法:
a.println(): 原样输出,自带换行效果
b.print(): 原样输出,不带换行效果

public class Demo01PrintStream {public static void main(String[] args)throws Exception{PrintStream ps = new PrintStream("module22\\printstream.txt");ps.println("涛哥是一个大帅哥");ps.println("涛哥是一个小鲜肉");ps.println("涛哥和金莲不为人知的故事");ps.close();}
}

改变流向:
1.什么叫做改变流向:
System.out.println()-> 本身是输出到控制台上
改变流向:可以让输出语句从控制台上输出改变成往指定文件中输出

2.方法:System中的方法:
static void setOut(PrintStream out) -> 改变流向 ->让输出语句从控制台输出转移到指定文件中

public class Demo02PrintStream {public static void main(String[] args)throws Exception{PrintStream ps = new PrintStream("module22\\log.txt");//改变流向System.setOut(ps);System.out.println("这个错误是今天下午2点出现的");System.out.println("这个错误是文件意外到达结尾异常");System.out.println("出现的原因是循环反序列化次数不对");ps.close();}
}

PrintStream打印流完成续写
PrintStream(OutputStream out) -> 可以依靠OutputStream的续写功能完成打印流续写

public class Demo03PrintStream {public static void main(String[] args)throws Exception{PrintStream ps = new PrintStream(new FileOutputStream("module22\\log.txt",true));//改变流向System.setOut(ps);System.out.println("这个错误是今天下午2点出现的");System.out.println("这个错误是文件意外到达结尾异常");System.out.println("出现的原因是循环反序列化次数不对");ps.close();}
}

Properties

创建配置文件:
1.在模块下右键 -> file -> 取名为xxx.properties
2.在xxx.properties文件中写配置数据
a.key和value都是key=value形式
b.key和value都是String的,但是不要加双引号
c.每个键值对写完之后,需要换行再写下一对
d.键值对之间最好不要有空格(空格可以有,但是不建议写)
e.键值对中建议不要使用中文(中文可以有,但是直接读取会乱码,需要转换流转码)

jdbc.username=root
jdbc.password=1234

IO工具包

1.Apache软件基金会属于第三方(Oracle公司是第一方,我们自己是第二方,其他的都是第三方),我们使用第三方开发出来的工具,都需要添加第三方提供给我们的jar包

2.jar包:本身是一个压缩包,里面转的都是class文件,我们想使用jar包中的工具类,就需要将相应的jar包解压到我们的当前项目下

3.怎么引入jar包
a.在当前模块下创建文件夹,取名为lib或者libs
b.将准备好的jar包,放到此文件夹下
c.对着jar包,右键 -> add as library (如果我们想将lib下所有的jar包一起解压,我们就直接对着lib文件夹右键)
d.level可以选择module,此时上面叫做name的输入框会变成空的,不用管
e.直接点ok

工具包的使用
IOUtils类

  • 静态方法:IOUtils.copy(InputStream in,OutputStream out)传递字节流,实现文件复制。
  • 静态方法:IOUtils.closeQuietly(任意流对象)悄悄的释放资源,自动处理close()方法抛出的异常。
public class Demo01IOUtils {public static void main(String[] args) /*throws Exception*/{//- 静态方法:IOUtils.copy(InputStream in,OutputStream out)传递字节流,实现文件复制。IOUtils.copy(new FileInputStream("E:\\Idea\\io\\8.jpg"),new FileOutputStream("E:\\Idea\\io\\孝敏.jpg"));//- 静态方法:IOUtils.closeQuietly(任意流对象)悄悄的释放资源,自动处理close()方法抛出的异常。FileWriter fw = null;try{fw = new FileWriter("module22\\commons.txt");fw.write("你好");}catch (Exception e){e.printStackTrace();}finally {if (fw!=null){IOUtils.closeQuietly(fw);}}}
}

FileUtils类

  • 静态方法:FileUtils.copyDirectoryToDirectory(File src,File dest);
    传递File类型的目录,进行整个目录的复制,自动进行递归遍历。
    参数:
    src:要复制的文件夹路径
    dest:要将文件夹粘贴到哪里去
  • 静态方法:writeStringToFile(File file,String str)写字符串到文本文件中。
  • 静态方法:String readFileToString(File file)读取文本文件,返回字符串。
public class Demo02FileUtils {public static void main(String[] args)throws Exception {/* - 静态方法:FileUtils.copyDirectoryToDirectory(File src,File dest);传递File类型的目录,进行整个目录的复制,自动进行递归遍历。参数:src:要复制的文件夹路径dest:要将文件夹粘贴到哪里去*/FileUtils.copyDirectoryToDirectory(new File("E:\\Idea\\io\\aa"),new File("E:\\Idea\\io\\cc"));//- 静态方法:writeStringToFile(File file,String str)写字符串到文本文件中。//FileUtils.writeStringToFile(new File("module22\\commons.txt"),"haha");//- 静态方法:String readFileToString(File file)读取文本文件,返回字符串。String s = FileUtils.readFileToString(new File("module22\\commons.txt"));System.out.println(s);}
}

总结

FileOutputStream 字节基本输出流
FileWrite 字符基本输出流
BufferedOutputStream 字节缓冲输出流
BufferedWrite 字符缓冲输出流
ObjectOutputStream 序列化流 写对象
OutputStreamWrite 字符转换为字节

========================================
FileInputStream 字节基本输入流
FileReader 字符基本输入流
BufferedIutputStream 字节缓冲输入流
BufferedReader 字符缓冲输入流
ObjectInputStream 反序列化流 读对象
InputStreamReader 字节转换为字符

来源 尚硅谷

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

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

相关文章

设备维修管理系统

设备维修管理系统是一个集故障处理、巡检处理、设备管理、维修管理、系统管理以及手机客户端功能等六大功能于一体的信息化管理系统。该系统旨在实现设备管理的科学化、规范化和网络化,通过整合设备维修的各个环节和流程,提高设备维修的效率和质量&#…

serverless记录

将算法部署到云平台 1、选择云平台:首先,需要选择一个合适的云平台,如阿里云、腾讯云、华为云等,根据项目的需求和预算选择合适的云服务提供商 2、准备算法代码:将算法代码准备好,确保代码可以在云平台上…

代码随想录35期Day60-JavaScript

Day60题目 60天打卡最后一天 LeetCode84柱状图中最大面积 核心思想:当当前遍历到的元素小于栈顶元素的时候,此时栈顶元素最大面积就是自身面积,然后while向左移动,如果左边的值大于当前遍历到的元素,可以得到中间两个的元素最大矩形面积(左边的高度*2) 理解了下面这个用例,就…

网络安全||信息加解密技术以及密钥管理技术

一、信息加解密技术 对称加密 对称加密(又称为私人密钥加密/共享密钥加密):加密与解密使用同一密钥。特点:加密强度不高,但效率高;密钥分发困难。(大量明文为了保证加密效率一般使用对称加密&…

GAT1399协议分析(二)--注册流程分析

一、官方流程说明 二、官方流程解析 1 : 发起方向接收方发送注册 HTTP POST 请求/VIID/System/Register。 2: 接收方向发送方发送响应401 Unauthorized, 并在响应的消息头 WWW-Authenticate 字段中给 出适合发送方的认证机制和参数。 3: 发起方重新向接收方发送注册 HTTP POST…

单实例11.2.0.4迁移到11.2.0.4RAC_使用rman异机恢复

保命法则:先备份再操作,磁盘空间紧张无法备份就让满足,给自己留退路。 场景说明: 1.本文档的环境为同平台、不同版本(操作系统版本可以不同,数据库版本相同),源机器和目标机器部分…

解锁阿里巴巴API接口的无限可能:打造你的电商、物流、支付新纪元

Alibaba API接口是Alibaba平台对外开放的一系列编程接口,开发者可以通过这些接口访问Alibaba平台的数据和功能,如商品搜索、订单管理、支付接口等。这些接口基于HTTP/HTTPS协议,支持多种编程语言和数据格式(如JSON、XML等&#xf…

【设计模式】JAVA Design Patterns——Observer(观察者模式)

🔍目的 定义一种一对多的对象依赖关系这样当一个对象改变状态时,所有依赖它的对象都将自动通知或更新。 🔍解释 真实世界例子 在遥远的土地上生活着霍比特人和兽人的种族。他们都是户外生活的人所以他们密切关注天气的变化。可以说他们不断地…

深度解析ChatGPT原理

深度解析ChatGPT原理 ChatGPT是基于OpenAI的生成式预训练变换器(GPT)模型的自然语言处理技术。它通过大规模预训练和微调来生成高质量的自然语言文本。本文将详细探讨ChatGPT的技术原理,包括其架构、训练过程、生成机制和应用场景&#xff0…

Linux之线程及线程安全详解

前言:在操作系统中,进程是资源分配的基本单位,那么线程是什么呢?线程是调度的基本单位,我们该怎么理解呢? 目录 一,线程概念理解 二,Linux里面的线程原理 三,为什么要…

碳微球是新型碳材料 在高科技领域应用价值极高

碳微球是新型碳材料 在高科技领域应用价值极高 碳微球是一种新型碳材料,由石墨片层在玻璃相的石墨结构间断分布而构成。   与碳纳米管、石墨烯等碳材料不同,碳微球具有独特的球形结构,这赋予了其高比表面、高堆积密度等特点及良好的导电性、…

【高阶数据结构(八)】跳表详解

💓博主CSDN主页:杭电码农-NEO💓   ⏩专栏分类:高阶数据结构专栏⏪   🚚代码仓库:NEO的学习日记🚚   🌹关注我🫵带你学习更多数据结构   🔝🔝 高阶数据结构 1. 前言2. 跳表的概…

python下用cartopy绘制地形晕染(shading)图

python可以利用rasterio,cartopy,matplotlib等库绘制地形晕染图。 1.获取高程数据 高程数据可以从GEBCO网站下载:(https://www.gebco.net/data_and_products/gridded_bathymetry_data/)。 选择raster(栅…

浅谈一些AIGC赚钱赛道

前段时间,做过一期关于AIGC的分享。 ​缘起于近两年看到 DELL E 到 Stable Diffusion 多模态文本可控图像生成的大火,让AIGC概念涨了一大波流量。百度等一些头部大厂,以及关注元宇宙、web3.0领域的很多媒体和公司,都蹭上了这波热…

el-table动态配置显示表头

在实际工作中,会遇到动态配置e-table表头的情况,如下方法可以实现: // 要展示的列 column: [{prop: name, name: 名称 }, {prop: age, name: 年龄 }, {prop: sex, name: 性别 }, {prop: address, name: 地址 }, {prop: city, name: 城市 }]…

生活旅游数据恢复:全国违章查询

【步骤一:备份数据】 在开始数据恢复之前,首先要做的是备份现有的数据。虽然这一步不直接涉及到数据恢复,但万一在恢复过程中出现问题,您还可以回滚到备份,以避免数据丢失。 打开全国违章查询app。在主界面上找到并点…

量化投资分析平台 迅投 QMT(二)

量化投资分析平台 迅投 QMT [迅投 QMT](https://www.xuntou.net/?user_code7NYs7O)我目前在使用如何获取数据上代码历史帖子 迅投 QMT 我目前在使用 两个月前(2024年4月)迅投和CQF有一个互动的活动,进行了平台的一个网上路演,刚…

数据隐私重塑:Web3时代的隐私保护创新

随着数字化时代的不断深入,数据隐私保护已经成为了人们越来越关注的焦点之一。而在这个数字化时代的新篇章中,Web3技术作为下一代互联网的代表,正在为数据隐私保护带来全新的创新和可能性。本文将深入探讨数据隐私的重要性,Web3时…

Android多媒体之调用摄像头和相册

Android调用摄像头拍照的使用 权限申请&#xff1a; 在AndroidManifest.xml文件中添加摄像头使用权限&#xff1a; <uses-permission android:name"android.permission.CAMERA"/>如果需要存储图片&#xff0c;还需要添加文件读写权限&#xff1a; <uses-pe…

Jetson Orin安装部署和使用(1)

Jetson Orin使用 一、 安装NVIDIA-jetpack和基础开发环境 1、修改deb source sudo bash -c echo "deb https://repo.download.nvidia.com/jetson/common r34.1 main" >> /etc/apt/sources.list.d/nvidia-l4t-apt-source.listsudo bash -c echo "deb ht…