Java基础知识(11)

Java基础知识(11)

(包括:IO流高级流,网络爬虫基础,Commons-i0工具包和Hutool工具包)

目录

Java基础知识(11)

一.IO流高级流

1.缓冲流

【1】字节缓冲流

(1)基础知识

(2)方法

[2] 字符缓冲流(其实基本流里已经有缓冲区了,速度提升不大)

(1)构造方法

(2)字符缓冲流特有方法

2.转换流

【1】转换流是字符流和字节流之间的桥梁

【2】作用

(1)作用1:

(2)作用2:

3.序列化流/对象操作输出流

(1)可以把Java中的对象写到本地文件中

(2)构造方法

(3)成员方法

(4)案例

(5)序列化流的小细节

4. 反序列化流 /对象操作输入流

(1)可以把序列化到本地文件中的对象,读取到程序中来

(2)构造方法

(3)成员方法

(4)序列化流/反序列化流的细节汇总

5. 打印流

【1】分类:打印流一般是指:PrintStream,PrintWriter两个类

【2】字节打印流(字节流底层没有缓冲区,开不开自动刷新都一样)

(1)构造方法

(2)成员方法

【3】字符打印流(字符流底层有缓冲区,想要自动刷新需要开启)

(1)构造方法

(2)成员方法

6. 解压缩流

(1)解压本质:把每一个ZipEntry按照层级拷贝到本地另一个文件夹中

(2)例子:

7. 压缩流

(1)压缩本质:把每一个(文件/文件夹)看成ZipEntry对象放到压缩包中

(2)例子:

8. Commons-i0

9. Hutool工具包

10.网络爬虫

(1)前置知识案例

(2)网络爬虫案例

1)

2)

3)Hutool中有类似的方法,上面仅供理解!!!!


一.IO流高级流

1.缓冲流

【1】字节缓冲流
(1)基础知识

BufferedinputStream 字节缓冲输入流

BufferedOutputStream字节缓冲输出流

原理:底层自带了长度为8192的缓冲区提高性能

(2)方法

1)public BufferedInputStream(InputStream is)把基本流包装成高级流,提高读取数据的性能

2)public BufferedOutputStream(0utputStream os) 把基本流包装成高级流,提高写出数据的性能

3)案例

BufferedInputStream bis = new BufferedInputStream(new FileInputstream( name: "myio\\a.txt"));

BufferedoutputStream bos = new BufferedoutputStream(new File0utputstream( name: "myio\\copy.txt"));

[2] 字符缓冲流(其实基本流里已经有缓冲区了,速度提升不大)
(1)构造方法

public BufferedReader(Reader r) 把基本流变成高级流

public Bufferedwriter(Writer r) 把基本流变成高级流

(2)字符缓冲流特有方法

字符缓冲输入流特有方法:

public string readLine() 读取一行数据,如果没有数据可读了,会返回null

字符缓冲输出流特有方法:

public void newLine() 跨平台的换行

2.转换流

【1】转换流是字符流和字节流之间的桥梁
【2】作用
(1)作用1:

1)指定字符集读写

2)案例

//创建对象并指定字符编码

InputStreamReader isr = new InputStreamReader(new FileInputStream(mvio\lgbkfile.txt"),“GBK”);

(在JDK11有更好的方法:FileReader fr=new FileReader("myio\\gbkfile,txt",charset.forName("GBK"));)

(2)作用2:

1)字节流想要使用字符流中的方法

2)案例

FileInputStream fis = new FileInputStream( name: "myio\la.txt");

InputStreamReader isr=new InputStreamReader(fis);

BufferedReader br =new BufferedReader(isr);

string str= br.readLine();

即:BufferedReader br = new BufferedReader(new InputstreamReader(new fileInputstream( name: "myio\\a.txt")));

3.序列化流/对象操作输出流

(1)可以把Java中的对象写到本地文件中
(2)构造方法

public ObjectOutputStream(0utputStream out)  把基本流包装成高级流

(3)成员方法

public final void write0bject(object obj)把对象序列化(写出)到文件中去

Student stu = new student( name:"zhangsan",age: 23);

(4)案例

ObjectOutputstream oos = new objectoutputstream(new File0utputstream( name: "myio\la.txt"));

oos.writeobject(stu);

(5)序列化流的小细节

使用对象输出流将对象保存到文件时会出现NotserializableException异常

解决方案:需要让Javabean类实现Serializable接口(标记性接口)

4. 反序列化流 /对象操作输入流

(1)可以把序列化到本地文件中的对象,读取到程序中来
(2)构造方法

public objectInputstream(Inputstream out) 把基本流变成高级流

(3)成员方法

public object readobject()把序列化到本地文件中的对象,读取到程序中来(需要进行强转)

(4)序列化流/反序列化流的细节汇总

① 使用序列化流将对象写到文件时,需要让Javabean类实现Serializable接口,否则,会出现NotSerializableException异常

② 序列化流写到文件中的数据是不能修改的,一旦修改就无法再次读回来了

③ 序列化对象后,修改了Javabean类,再次反序列化,会不会有问题?

会出问题,会抛出InvalidclassException异常

解决方案:给lavabean类添加serialVersionUID(列号、版本号)

private static final long serialVersionUID = -6357601841666449654L;

可用idea自动生成。

④如果一个对象中的某个成员变量的值不想被序列化,又该如何实现呢?

解决方案:给该成员变量加transient关键字修饰,该关键字标记的成员变量不参与序列化过程

⑤如果需要将多个对象进行序列化,一般规定将其放入一个集合中,序列化集合

5. 打印流

【1】分类:打印流一般是指:PrintStream,PrintWriter两个类

特点1:打印流只操作文件目的地,不操作数据源

特点2:特有的写出方法可以实现,数据原样写出

例如:打印:97 文件中:97

特点3:特有的写出方法,可以实现自动刷新,自动换行

打印一次数据=写出+换行+刷新

【2】字节打印流(字节流底层没有缓冲区,开不开自动刷新都一样)
(1)构造方法

public Printstream(0utputStream/File/string) 关联字节输出流/文件/文件路径(重要)

public PrintStream(String fileName,Charset charset) 指定字符编码(重要)

public PrintStream(OutputStream out,boolean autoFlush) 自动刷新

public PrintStream(0utputStream out,boolean autoFlush, String encoding) 指定字符编码且自动刷新

(2)成员方法

public void write(int b) 常规方法:规则跟之前一样,将指定的字节写出

public void println(Xxx xx) 特有方法:打印任意数据,自动刷新,自动换行

public void print(Xxx xx) 特有方法:打印任意数据,不换行

public void printf(String format,Object... args)特有方法:带有占位符的打印语句,不换行

【3】字符打印流(字符流底层有缓冲区,想要自动刷新需要开启)
(1)构造方法

public PrintWriter(Write/File/String) 关联字节输出流/文件/文件路径

public PrintWriter(String fileName, charset charset) 指定字符编码

public PrintWriter(Write w,boolean autoFlush) 自动刷新

public PrintWriter(0utputStream out, boolean autoFlush, charset charset) 指定字符编码且自动刷新

(2)成员方法

public void write(int b) 常规方法:规则跟之前一样,写出字节或者字符串

public void println(Xxx xx) 特有方法:打印任意数据,自动刷新,自动换行

public void print(Xxx xx) 特有方法:打印任意数据,不换行

public void printf(String format,Object... args)特有方法:带有占位符的打印语句,不换行

6. 解压缩流

(1)解压本质:把每一个ZipEntry按照层级拷贝到本地另一个文件夹中
(2)例子:

//创建一个解压缩流用来读取压缩包中的数据

ZipInputstream zip = new ZipInputstream(new FileInputstream(src));

//要先获取到压缩包里面的每一个zipentry对象

//表示当前在压缩包中获取到的文件或者文件夹

ZipEntry entry;

while((entry= zip.getNextEntry())!= nu11){

System.out.println(entry);

}

7. 压缩流

(1)压缩本质:把每一个(文件/文件夹)看成ZipEntry对象放到压缩包中
(2)例子:

public static void tozip(File src,File dest)throws IoException {

//1.创建压缩流关联压缩包

Zipoutputstream zos = new zipoutputstream(new File0utputstream(new File(dest, child: "a.zip")));

//2.创建zipEntry对象,表示压缩包里面的每一个文件和文件夹

ZipEntry entry = new zipEntry( name:"a.txt");

//3.把ZipEntry对象放到压缩包当中

zos.putNextEntry(entry);

//4.把src文件中的数据写到压缩包当中

FileInputstream fis = new FileInputstream(src);

int b;

while((b=fis.read())!=-1){

zos.write(b);

zos.closeEntry();

zos.close();

}

8. Commons-i0

(1)简介

Commons-io是apache开源基金组织提供的一组有关I0操作的开源工具包。

作用:提高I0流的开发效率,

(2)Commons-io使用步骤

1)在项目中创建一个文件夹:lib

2)将jar包复制粘贴到lib文件夹

3)右键点击jar包,选择 Add as Library ->点击OK

4)在类中导包使用

5)文档在仅我可见中。

9. Hutool工具包

官网:
    https://hutool.cn/
API文档:
    https://apidoc.gitee.com/dromara/hutool/

中文使用文档:
    https://hutool.cn/docs/#/

10.网络爬虫

(1)前置知识案例

//Pattern:表示正则表达式

//Matcher:文本匹配器,作用按照正则表达式的规则去读取字符串,从头开始读取,在大串中去找符合匹配规则的子串。

//获取正则表达式的对象

Pattern p=Pattern.compile("Java\\d{0,2}");

//获取文本匹配器的对象

//m:文本匹配器的对象

//str:大串

//p:规则

//m:要在str中找符合p规则的小串

Matcher m=p.matcher(str);

//拿着文本匹配器从头开始读取,寻找是否有满足规则的子串

//如果没有,方法返回false

//如果有,返回true。在底层记录子串的起始索引和结束索引+1

//如:0,4

boolean b=m.find();

//方法底层会根据find方法记录的索引进行字符串的截取

//substring(起始索引,结束索引);包头不包尾

//(0,4)但是不包含4索引

//会把截取的小串进行返回。

string s1 = m.group();

System.out.println(s1);

//第二次在调用find的时候,会继续读取后面的内容

//读取到第二个满足要求的子串,方法会继续返回true

//并把第二个子串的起始索引和结束索引+1,进行记录

b = m.find();

//第二次调用group方法的时候,会根据find方法记录的索引再次截取子串

string s2 = m.group();

System.out.println(s2);

}

(2)网络爬虫案例
1)

public static string webcrawler(string net)throws Ioxception {

//1.定义stringBuilder拼接爬取到的数据

StringBuilder sb=new stringBuilder();

//2.创建一个URL对象

URL url = new URL(net);

//3.链接上这个网址

//细节:保证网络是畅通的,而且这个网址是可以链接上的。

URLConnection conn =url.openconnection();

//4.读取数据

InputstreamReader isr = new InputStreamReader(conn.getInputstream());

int ch;

while((ch=isr.read())!=-1){

sb.append((char)ch);

//5.释放资源

isr.close();

//6.把读取到的数据返回

return sb.tostring();

}

2)

//通过正则表达式,把其中符合要求的数据获取出来

private static Arraylist<string> getData(string str, string regex){

//1.创建集合存放数据

ArrayList<string>list = new ArrayList<>();

//2.按照正则表达式的规则,去获取数据

Pattern pattern = Pattern.compile(regex);

//3.按照pattern的规则,到str当中获取数据

Matcher matcher =pattern.matcher(str);

while(matcher.find()){

list.add(matcher.group(index));

}

return list;

}

3)Hutool中有类似的方法,上面仅供理解!!!!

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

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

相关文章

MySQL入门学习-数据类型.日期和时间类型

一、在MySQL中&#xff0c;日期和时间类型有以下几种&#xff1a; 1. DATE&#xff1a; 存储日期&#xff0c;格式为YYYY-MM-DD&#xff0c;范围从1000-01-01到9999-12-31。 2. TIME&#xff1a; 存储时间&#xff0c;格式为HH:MM:SS&#xff0c;范围从-838:59:59到838:59:…

基于Opencv的车牌识别系统(毕业设计可用)

系统架构 图像采集&#xff1a;首先&#xff0c;通过摄像头等设备捕捉车辆图像。图像质量直接影响后续处理的准确性&#xff0c;因此高质量的图像采集是基础。 预处理&#xff1a;对获取的原始图像进行预处理&#xff0c;包括灰度化、降噪、对比度增强和边缘检测等。这些操作旨…

RS3236-3.3YF5 封装SOT-23-5 线性稳压器 带过温保护

RS3236-3.3YF5 是一款由Runic&#xff08;润石&#xff09;公司生产的线性稳压器&#xff08;LDO&#xff09;&#xff0c;以下是该器件的一些功能和参数介绍&#xff1a; 品牌: Runic 产品类型: 线性稳压器 (LDO) 输入电压范围: 最大 7.5V 输出电压: 固定 3.3V 输出电流: 最大…

基于FPGA的去雾算法

去雾算法的原理是基于图像去模糊的原理&#xff0c;通过对图像中的散射光进行估计和去除来消除图像中的雾霾效果。 去雾算法通常分为以下几个步骤&#xff1a; 1. 导引滤波&#xff1a;首先使用导引滤波器对图像进行滤波&#xff0c;目的是估计图像中散射光的强度。导引滤波器…

豪车降价不减保险费:购车决策中的隐形成本考量

在这个快速变化的汽车市场中&#xff0c;豪华汽车品牌为了吸引更多的消费者&#xff0c;时常推出诱人的降价促销策略&#xff0c;让不少人梦寐以求的豪车似乎触手可及。然而&#xff0c;在这光鲜亮丽的价格标签背后&#xff0c;有一项常被忽视的成本——保险费用&#xff0c;它…

介绍适用于 Node.js 的 Elastic OpenTelemetry 发行版

作者&#xff1a;来自 Elastic Trent Mick 我们很高兴地宣布推出 Elastic OpenTelemetry Distribution for Node.js 的 alpha 版本。 该发行版是 OpenTelemetry Node.js SDK 的轻量级包装&#xff0c;可以让你更轻松地开始使用 OpenTelemetry 来观察 Node.js 应用程序。 背景 …

linux自用命令

Nginx方面 cd /usr/local/nginx/sbin/ ./nginx # 启动 ./nginx -s stop # 停止 ./nginx -s quit # 安全退出 ./nginx -s reload # 重新加载配置文件 ps aux|grep nginx # 查看nginx进程Tomcat方面 cd 到tomcat的bin路径下 启动命令&#xff1a;./startup.sh 关闭命令&#xf…

QT与Electron之争:谁能提供更好的用户体验?有一点QT完胜.

QT和Electron到底谁好&#xff0c;争论不休&#xff0c;各有各的道理&#xff0c;贝格前端工场总结了各方观点&#xff0c;做一个梳理。 在比较QT和Electron时&#xff0c;需要考虑到它们各自的特点和适用场景。 QT是一个C的跨平台应用程序开发框架&#xff0c; 而Electron是基…

2024第九届数维杯数学建模论文模板(内附LaTeX+Word)

一年一度的2024年第九届数维杯国赛报名进行中&#xff01;相信很多同学们已经摩拳擦掌蓄势待发了&#xff01; 经历三天比赛&#xff0c;最后提交的论文就是最终答卷&#xff0c;那么一篇数模论文&#xff0c;包括哪些内容呢&#xff1f; 一篇完整的数模论文&#xff0c;包括…

活字格中如何加入JavaScript的代码和事件以及如何调试

活字格&#xff1a; 如何加入JavaScript的代码和事件 1&#xff09;选中组件。 2&#xff09;编辑命令“按钮。 3&#xff09;选择JavaScript命令&#xff0c;并点亮五星。 4&#xff09;编写js代码&#xff0c;确定。 5&#xff09;运行。 如何查看js运行&#xff1a; …

uni-app(二):本地插件使用(Android)

本地插件使用 项目创建等参考1.下载并引用本地插件2.注意插件配置3.制作自定义基座4.编写调用代码5.运行 项目创建等参考 https://lprosper.blog.csdn.net/article/details/138655526 1.下载并引用本地插件 2.注意插件配置 3.制作自定义基座 4.编写调用代码 <template>…

【原创】springboot+mysql物资库存管理系统设计与实现

个人主页&#xff1a;程序猿小小杨 个人简介&#xff1a;从事开发多年&#xff0c;Java、Php、Python、前端开发均有涉猎 博客内容&#xff1a;Java项目实战、项目演示、技术分享 文末有作者名片&#xff0c;希望和大家一起共同进步&#xff0c;你只管努力&#xff0c;剩下的交…

【C++】类与对象(类章节)

面向过程和面向对象 C语言是面向过程的&#xff0c;关注的是过程&#xff0c;分析出求解问题的步骤&#xff0c;通过函数调用逐步解决问题。 C是基于面向对象的&#xff0c;关注的是对象&#xff0c;将一件事情拆分成不同的对象&#xff0c;靠对象之间的交互完 成。 一、类 1.类…

【MySQL基本查询(上)】

文章目录 一、多行插入 指定列插入数据更新表中某个数据的信息&#xff08;on duplicate&#xff09;了解affected报告信息 二、检索功能1.select 查询1.1全列查询1.2指定列查询1.3where条件筛选子句案例 2.结果排序案例 3.筛选分页结果offset实现分页 一、多行插入 指定列插…

axios配置 responseType: “blob“

在使用 Axios 进行网络请求时&#xff0c;配置 responseType: "blob" 是用来指示 Axios 将响应体作为 Blob 对象处理。这在文件下载功能中特别有用&#xff0c;因为 Blob 对象可以被用来创建一个指向该文件内容的 URL&#xff0c;进而触发浏览器的下载行为或者在页面…

融入新科技的SLM27211系列 120V, 3A/4.5A高低边高频门极驱动器兼容UCC27284,MAX15013A

SLM27211是高低边高频门极驱动器&#xff0c;集成了120V的自举二极管&#xff0c;支持高频大电流的输出&#xff0c;可在8V~17V的宽电压范围内驱动MOSFET&#xff0c;独立的高、低边驱动以方便控制&#xff0c;可用于半桥、全桥、双管正激和有源钳位正激等拓。有极好的开通、关…

Python入门系列-02 pip的安装

目录 一、pip介绍二、pip安装检查三、pip安装 一、pip介绍 pip 是 Python 包管理工具&#xff0c;该工具提供了对Python 包的查找、下载、安装、卸载的功能。 二、pip安装检查 你可以通过以下命令来判断是否已安装。 pip --version # Python2.x 版本命令 pip3 --versio…

新能源汽车为什么容易自燃

新能源汽车容易自燃的原因&#xff1a; 电池特性&#xff1a; 新能源汽车通常采用锂离子电池作为能源存储装置&#xff0c;这种电池具有高能量密度和高功率特性&#xff0c;但同时也存在一定的安全隐患。锂离子电池在受到损坏、过充、过放、过热或短路等情况下&#xff0c;可能…

二叉树的广度优先遍历 - 华为OD统一考试(D卷)

OD统一考试(D卷) 分值: 200分 题解: Java / Python / C++ 题目描述 有一棵二叉树,每个节点由一个大写字母标识(最多26个节点)。 现有两组字母,分别表示后序遍历(左孩子->右孩子->父节点)和中序遍历(左孩子->父节点->右孩子)的结果,请输出层次遍历的结…

《前端算法宝典:双指针问题解析与应用》

双指针 双指针&#xff0c;指的是在遍历对象的过程中使用两个相同方向&#xff08;快慢指针&#xff09;或者相反方向&#xff08;对撞指针&#xff09;的指针或者是两个指针构成一个滑动窗口进行扫描&#xff0c;从而达到相应的目的。 双指针方法在某些情况下可以对有序数组…