Java学习笔记(22)

缓冲流

真正操作数据的还是基本流

字节缓冲流

缓冲区是长度为8192的字节缓冲区  byte[]  8K

Bufferedininputstream

读取数据就是把数据放到缓冲区中,字节长度默认长度8192

关流只需要关缓冲流,因为在底层会关基本流

一次读多个字节

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

还是通过基本流读取文件数据,将数据放到缓冲输入流的缓冲区

通过read方法,将输入流的缓冲区中读取数据,写到输出流的缓冲区中

再通过基本流写到文件中

通俗讲:就是通过int b在两个缓冲区中倒手数据,在内存中,这个速度非常快,用时几乎忽略不计。Int b也可以是byte数组,更加快

字符缓冲流

缓冲区是长度为8192的字符缓冲区  char[] 一个char对应2个byte 所以是16K

Readline

读取一次读一行,遇到回车结束,但是不会读到回车符

循环读取文件中的数据

注意:循环条件是不等于null,而不是-1

字符缓冲输出流

续写的true是基本流的功能,bufferedwriter没有这功能

package exercise;import java.io.*;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;public class exercise8 {public static void main(String[] args) throws IOException {BufferedReader br = new BufferedReader(new FileReader("day28\\src\\csb.txt"));ArrayList<String> arr = new ArrayList<>();String len;while ((len = br.readLine()) != null) {arr.add(len);}Collections.sort(arr, new Comparator<String>() {@Overridepublic int compare(String o1, String o2) {return Integer.parseInt(o1.split("\\.")[0]) - Integer.parseInt(o2.split("\\.")[0]);}});//还可以直接用treemap直接就排序了BufferedWriter bw = new BufferedWriter(new FileWriter("day28\\src\\csb2.txt"));for (String s : arr) {bw.write(s);bw.newLine();}bw.close();br.close();}
}

注意点:IO流最好不要在开头就把所有的都创建出来,这样就有可能在用bufferedwriter的时候,把文件清空了,导致read()读取不到数据

转换流

属于字符流

指定字符集读写被淘汰

JDK11时,filereader加入了一种新的构造方法

第二个参数直接写按照哪种字符集来读

Charset.forname()

同样,filewriter也是

GBK文件转成UTF-8

字节流读取中文,按行读,无乱码

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

Objectoutputstream

写到文件中是乱码,不想让别人修改

要让对象implements serializable

实现了这个接口,说明是可以被序列化的

serializable接口里没有抽象方法,所以不用重写

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

返回的是object类型,可以强转成原类型

serialVersionUID是根据类里面所有的成员计算出来的

如果改变类里面的成员,uid就会变,相当于是一个版本号

如果给定了一个uid,则反序列的时候就不会报错;

没有给定uid,这时改变类里面的成员,代码就报错

如果不想某些属性被序列化到本地,则加上transient关键字

再反序列的时候,返回就是null了

注意点

把对象装到集合中,读和写直接对list操作

打印流

不能读,只能写

Printstream,printwriter

字节打印流

没有缓冲区

字符打印流

有缓冲区,可以手动开自动刷新,一般都是开

System.out.println()

Out是printstream类,system.out相对于就是获取了一个字节打印流对象

这个打印流默认指向控制台

解压缩流/压缩流

Zipinputstream

getNextEntry:获取到文件夹中所有的文件,包括子文件夹中的文件,返回一个entry对象

Entry.isDirectory()判断是不是文件夹。注意:没有isfile方法

Entry.toString()地址变字符串形式

压缩

Zipentry():括号里面表示压缩包里面内部的路径

如果是D:\\ ,则压缩包里会出现一个D盘,然后才是跟着的aaa文件夹

Commons-io

copyDirectory:是将文件夹里面的内容copy到目的地文件夹里面

copyDirectoryToDirectory:是将文件夹copy到目的地新建的文件夹里面

Clean:清空文件夹里面的所有文件和文件夹,只保留最外层的文件夹

Hutool

Touch:可以根据传入的file对象,创建文件,而且如果父级路径不存在,他也可以一同创建。之前的createnewfile就不行,如果父级路径不存在,就创建不了

制造假数据

网络爬取

写法一

package exercise;import java.io.*;
import java.net.URL;
import java.net.URLConnection;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Random;
import java.util.regex.Matcher;
import java.util.regex.Pattern;public class exercise1 {public static void main(String[] args) throws IOException {/*制造假数据:获取姓氏:https://hanyu.baidu.com/shici/detail?pid=0b2f26d4c0ddb3ee693fdb1137ee1b0d&from=kg0获取男生名字:http://www.haoming8.cn/baobao/10881.html获取女生名字:http://www.haoming8.cn/baobao/7641.html*///1.定义变量记录网址String familyNameNet = "https://mp.weixin.qq.com/s?__biz=MzU4MDcwMjkxNw==&mid=2247492706&idx=4&sn=021c357e8f9ac5e13040ae8256b4cb68&chksm=fd5063c8ca27eadeb97c9682dbecdd8ebc3784f5abdd2e09819a1612e439003079c646909ca2&scene=27";String boyNameNet = "http://www.haoming8.cn/baobao/10881.html";String girlNameNet = "http://www.haoming8.cn/baobao/7641.html";//2.爬取数据,把网址上所有的数据拼接成一个字符串String familyNameStr = webCrawler(familyNameNet);String boyNameStr = webCrawler(boyNameNet);String girlNameStr = webCrawler(girlNameNet);//3.通过正则表达式,把其中符合要求的数据获取出来ArrayList<String> familyNameTempList = getData(familyNameStr, "([\\u4E00-\\u9FA5] ){3}([\\u4E00-\\u9FA5])", 0);ArrayList<String> boyNameTempList = getData(boyNameStr, "([\\u4E00-\\u9FA5]{2})(、|。)", 1);ArrayList<String> girlNameTempList = getData(girlNameStr, "(([\\u4E00-\\u9FA5]{2} ){4}[\\u4E00-\\u9FA5]{2})", 0);//4.处理数据ArrayList<String> familyNameList = new ArrayList<>();for (String s : familyNameTempList) {String[] split = s.split(" ");familyNameList.addAll(List.of(split));}ArrayList<String> boyNameList = new ArrayList<>();for (String s : boyNameTempList) {if (!boyNameList.contains(s)) {boyNameList.add(s);}}ArrayList<String> girlNameList = new ArrayList<>();for (String s : girlNameTempList) {String[] split = s.split(" ");girlNameList.addAll(List.of(split));}//5.生成假数据ArrayList<String> list = getInfo(familyNameList, boyNameList, girlNameList, 50, 50);System.out.println(list);//6.写入文件BufferedWriter bw = new BufferedWriter(new FileWriter("day30\\src\\names.txt"));for (String s : list) {bw.write(s);bw.newLine();}bw.close();}private static ArrayList<String> getInfo(ArrayList<String> familyNameList, ArrayList<String> boyNameList, ArrayList<String> girlNameList, int boyCount, int girlCount) {ArrayList<String> list = new ArrayList<>();Collections.shuffle(familyNameList);Collections.shuffle(boyNameList);Collections.shuffle(girlNameList);Random r = new Random();//获取男生for (int i = 0; i < boyCount; i++) {int age = r.nextInt(8) + 18;list.add(familyNameList.get(i) + boyNameList.get(i) + "-男-" + age);}//获取女生for (int i = 0; i < girlCount; i++) {int age = r.nextInt(8) + 18;list.add(familyNameList.get(i) + girlNameList.get(i) + "-女-" + age);}Collections.shuffle(list);return list;}private static ArrayList<String> getData(String str, String regex, int index) {ArrayList<String> arr = new ArrayList<>();Pattern p = Pattern.compile(regex);Matcher m = p.matcher(str);while (m.find()) {arr.add(m.group(index));}return arr;}private static String webCrawler(String net) throws IOException {StringBuilder sb = new StringBuilder();URL url = new URL(net);URLConnection conn = url.openConnection();InputStreamReader isr = new InputStreamReader(conn.getInputStream());int b;while ((b = isr.read()) != -1) {sb.append((char) b);}isr.close();return sb.toString();}
}

写法二:用hutool写

package exercise;import cn.hutool.core.io.FileUtil;
import cn.hutool.core.util.ReUtil;
import cn.hutool.http.HttpUtil;import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Random;public class exercise2 {public static void main(String[] args) throws IOException {/*制造假数据:获取姓氏:https://hanyu.baidu.com/shici/detail?pid=0b2f26d4c0ddb3ee693fdb1137ee1b0d&from=kg0获取男生名字:http://www.haoming8.cn/baobao/10881.html获取女生名字:http://www.haoming8.cn/baobao/7641.html*///1.定义变量记录网址String familyNameNet = "https://mp.weixin.qq.com/s?__biz=MzU4MDcwMjkxNw==&mid=2247492706&idx=4&sn=021c357e8f9ac5e13040ae8256b4cb68&chksm=fd5063c8ca27eadeb97c9682dbecdd8ebc3784f5abdd2e09819a1612e439003079c646909ca2&scene=27";String boyNameNet = "http://www.haoming8.cn/baobao/10881.html";String girlNameNet = "http://www.haoming8.cn/baobao/7641.html";//2.爬取数据,把网址上所有的数据拼接成一个字符串String familyNameStr = HttpUtil.get(familyNameNet);String boyNameStr = HttpUtil.get(boyNameNet);String girlNameStr = HttpUtil.get(girlNameNet);//3.通过正则表达式,把其中符合要求的数据获取出来List<String> familyNameTempList = ReUtil.findAll("([\\u4E00-\\u9FA5] ){3}([\\u4E00-\\u9FA5])", familyNameStr, 0);List<String> boyNameTempList = ReUtil.findAll("([\\u4E00-\\u9FA5]{2})(、|。)", boyNameStr, 1);List<String> girlNameTempList = ReUtil.findAll("(([\\u4E00-\\u9FA5]{2} ){4}[\\u4E00-\\u9FA5]{2})", girlNameStr, 0);//4.处理数据ArrayList<String> familyNameList = new ArrayList<>();for (String s : familyNameTempList) {String[] split = s.split(" ");familyNameList.addAll(List.of(split));}ArrayList<String> boyNameList = new ArrayList<>();for (String s : boyNameTempList) {if (!boyNameList.contains(s)) {boyNameList.add(s);}}ArrayList<String> girlNameList = new ArrayList<>();for (String s : girlNameTempList) {String[] split = s.split(" ");girlNameList.addAll(List.of(split));}//5.生成假数据ArrayList<String> list = getInfo(familyNameList, boyNameList, girlNameList, 50, 50);System.out.println(list);//6.写入文件  写到了out文件夹中的production里FileUtil.writeLines(list, "day30\\src\\names.txt", "UTF-8");}private static ArrayList<String> getInfo(ArrayList<String> familyNameList, ArrayList<String> boyNameList, ArrayList<String> girlNameList, int boyCount, int girlCount) {ArrayList<String> list = new ArrayList<>();Collections.shuffle(familyNameList);Collections.shuffle(boyNameList);Collections.shuffle(girlNameList);Random r = new Random();//获取男生for (int i = 0; i < boyCount; i++) {int age = r.nextInt(8) + 18;list.add(familyNameList.get(i) + boyNameList.get(i) + "-男-" + age);}//获取女生for (int i = 0; i < girlCount; i++) {int age = r.nextInt(8) + 18;list.add(familyNameList.get(i) + girlNameList.get(i) + "-女-" + age);}Collections.shuffle(list);return list;}
}

随机点名器

package exercise;import java.io.*;
import java.util.ArrayList;
import java.util.Arrays;public class exercise7 {public static void main(String[] args) throws IOException {//获取数据File f = new File("day30\\src\\names2.txt");BufferedReader br1 = new BufferedReader(new FileReader(f));ArrayList<Student> list = new ArrayList<>();String s;while ((s = br1.readLine()) != null) {String[] split = s.split("-");list.add(new Student(split[0], split[1], Integer.parseInt(split[2]), Double.parseDouble(split[3])));}br1.close();//得到总权重double sum = 0;for (Student stu : list) {sum += stu.getWeight();}//得到每一个的权重double[] arr = new double[list.size()];int index = 0;for (Student stu : list) {arr[index] = stu.getWeight() / sum;index++;}//计算每个人落下的权重范围for (int i = 1; i < arr.length; i++) {arr[i] += arr[i - 1];}System.out.println(Arrays.toString(arr));//得到随机数double number = Math.random();int i = -Arrays.binarySearch(arr, number) - 1;//得到抽中的姓名Student stu = list.get(i);//改变权重stu.setWeight(stu.getWeight() / 2);//写入文件BufferedWriter bw = new BufferedWriter(new FileWriter(f));for (Student student : list) {bw.write(student.toString());bw.newLine();}bw.close();}
}

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

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

相关文章

XR虚拟直播间,引领创新风潮,打破直播局限!

随着互联网技术日新月异的发展&#xff0c;直播行业也迎来了蓬勃发展的春天。然而&#xff0c;大多数直播间在吸引观众眼球和延长用户观看时长方面&#xff0c;仍然面临着巨大的挑战。正是在这样的背景下&#xff0c;XR虚拟直播系统应运而生&#xff0c;以其多维度的直播场景、…

自然语言处理3(NLP)—— 机器学习

1. 自然语言处理在机器学习领域的主要任务 自然语言处理&#xff08;NLP&#xff09;在机器学习领域中扮演着至关重要的角色&#xff0c;旨在使计算机能够理解、解释和生成人类语言。以下是NLP在机器学习领域中的主要任务及其分类方法&#xff1a; 1.1 按照功能类型分类 1.1.…

Nacos的搭建和使用——SpringCloud Alibaba

1. 概要说明 在使用Nacos之前&#xff0c;请在你的虚拟机中下载好Nacos,再进行连接本机使用 port&#xff1a;8848 本机访问地址&#xff1a;http://{虚拟机ip}:8848/nacos/ 访问账号密码&#xff1a;nacos/nacos 2. Nacos的作用 2.1 服务发现中心 微服务将自身注册至Nacos&am…

Netty服务端基本启动流程源码刨析

前言: 希望看这篇文章之前对Java Nio编程比较熟悉&#xff0c;并有用过Netty开发简单代码 服务端代码 先大致说一下NioEventLoopGroup组件的作用&#xff0c;可以把它看是作内部维护了一个NioEventLoop数组的对象&#xff0c;它的构造方法的参数用来指定维护数组的大小。NioEve…

【Flutter 面试题】 Dart 是不是单线程模型?是如何运行的?

【Flutter 面试题】 Dart 是不是单线程模型&#xff1f;是如何运行的&#xff1f; 文章目录 写在前面口述回答补充说明示例&#xff1a;异步编程示例&#xff1a;使用 Isolates 处理计算密集型任务总结 写在前面 &#x1f64b; 关于我 &#xff0c;小雨青年 &#x1f449; CSD…

Echarts之x轴,Y轴配置项大全

ECharts是一个强大的数据可视化库&#xff0c;提供了丰富的配置项来定制图表的x轴和y轴。下面是ECharts中x轴和y轴的配置项大全&#xff1a; xAxis配置项&#xff1a; type&#xff1a;轴类型&#xff0c;可选值有&#xff1a;“value”&#xff08;数值轴&#xff09;, “cat…

docker 的网络管理

docker应用自带了三种类型的网络&#xff0c;然后我们自己也能自定义网络 roottest-virtual-machine:~# docker network ls NETWORK ID NAME DRIVER SCOPE 4c3e28760cff bridge bridge local afd1493dc119 host host local 5f200e2eaf22 n…

政安晨:【Keras机器学习实践要点】(六)—— 使用内置方法进行训练和评估

政安晨的个人主页&#xff1a;政安晨 欢迎 &#x1f44d;点赞✍评论⭐收藏 收录专栏: TensorFlow与Keras实战演绎机器学习 希望政安晨的博客能够对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff01; 本文涵盖使用内置 API 进行训练和验证&#…

01-DBA自学课-安装部署MySQL

一、安装包下载 1&#xff0c;登录官网 MySQL :: MySQL Downloads 2&#xff0c;点击社区版下载 3&#xff0c;找到社区服务版 4&#xff0c;点击“档案”Archives 就是找到历史版本&#xff1b; 5&#xff0c;选择版本进行下载 本次学习&#xff0c;我们使用MySQL-8.0.26版本…

机器学习 | 期望最大化(EM)算法介绍和实现

在现实世界的机器学习应用中&#xff0c;通常有许多相关的特征&#xff0c;但只有其中的一个子集是可观察的。当处理有时可观察而有时不可观察的变量时&#xff0c;确实可以利用该变量可见或可观察的实例&#xff0c;以便学习和预测不可观察的实例。这种方法通常被称为处理缺失…

vue2高德地图选点

<template><el-dialog :title"!dataForm.id ? 新建 : isDetail ? 详情 : 编辑" :close-on-click-modal"false" :visible.sync"show" class"rv-dialog rv-dialog_center" lock-scroll width"74%" :before-close&q…

Vue.js概述

一、概述 数据驱动的响应式框架&#xff0c;我们只关注Vue对象里面设置的数据即可&#xff0c;数据发生改变时&#xff0c;页面自动重新渲染 最典型的MVVM框架 二、挂载点 什么是“挂载点”&#xff1f;一个标签 作用&#xff1a;被Vue实例接收后&#xff0c;实例中设置的各…

boot整合xfire

最近换了项目组&#xff0c;框架使用的boot整合的xfire&#xff0c;之前没使用过xfire&#xff0c;所以写个例子记录下&#xff0c;看 前辈的帖子 整理下 pom文件 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot…

Python爬虫入门:从网站爬取文章内容并保存到本地文件

目录 前言 准备工作 简单爬虫实现 注意事项 爬虫伦理与合法性 总结 前言 在互联网时代&#xff0c;数据是宝贵的资源。然而&#xff0c;当需要从海量网站中抓取数据时&#xff0c;手动操作显然不切实际。这时&#xff0c;爬虫技术应运而生&#xff0c;成为我们获取数据的…

OSG编程指南<二十一>:OSG视图与相机视点更新设置及OSG宽屏变形

1、概述 什么是视图?在《OpenGL 编程指南》中有下面的比喻,从笔者开始学习图形学就影响深刻,相信对读者学习场景管理也会非常有帮助。 产生目标场景视图的变换过程类似于用相机进行拍照,主要有如下的步骤: (1)把照相机固定在三脚架上,让它对准场景(视图变换)。 (2)…

【爬虫基础】第4讲 GET与POST请求

GET请求 GET请求是一种HTTP方法&#xff0c;用于向服务器获取&#xff08;或读取&#xff09;数据。它是Web开发中最常用的请求方式之一。对于GET请求&#xff0c;客户端向服务器发送一个HTTP请求&#xff0c;服务器返回请求的资源。GET请求通常用于获取静态资源&#xff0c;比…

记录关于智能家居的路程的一个bug___Segmentation fault(段错误)

前言 其实发生段错误的情况有很多&#xff1a; 其实在项目的开发中最有可能的错误就是①和②&#xff0c;考虑到本项目数组用的比较少&#xff0c;所以主要是考虑错误①指针的误用。 有时候错误就是那么离谱&#xff0c;声音也算是一种设备&#xff1f;&#xff1f;&#xff…

35.HarmonyOS App(ArkUI)使用父组件@Builder装饰的方法初始化子组件@BuilderParam报错

HarmonyOS App(ArkUI)使用父组件Builder装饰的方法初始化子组件BuilderParam报错 Type void is not assignable to type () > void. <tsCheck> 去掉括号()就可以了 装饰器&#xff1a; 用于装饰类、结构、方法以及变量&#xff0c;并赋予其特殊的含义。如上述示例中En…

SpringBoot实现RabbitMQ的简单队列(SpringAMQP 实现简单队列)

文章目录 1. 前言2. Basic Queue 简单队列模型2.1 父工程导入依赖2.2 消息发送2.2.1 消息发送方必要的配置2.2.2 发消息 3. 消息接收3.1 消息接收方必要的配置3.2 接收消息 1. 前言 SpringAMQP 是基于 RabbitMQ 封装的一套模板&#xff0c;并且还利用 SpringBoot 对其实现了自…

2024.3.26学习总结

一&#xff0c;正则匹配 正则匹配是用来搜索&#xff0c;匹配&#xff0c;替换的一种字符串模式&#xff0c;使用正则匹配可以让搜索匹配的语句更加简洁&#xff0c;在php中会使用一些函数来处理正则匹配 常用的语法&#xff1a; 字符类 [abc]: 匹配单个字符a、b或c[^abc]: 匹…