IO流(3)

打印流

字节打印流

特有方法实现:数据原样写出。

public class test {
    public static void main(String [] args) throws IOException, ClassNotFoundException  {
      //打印流
    	//创建字节打印流对象
    	PrintStream ps=new PrintStream(new FileOutputStream("c.txt"), true, "UTF-8");
    	ps.println(97);
    	ps.print(true);
    	ps.println();
    	ps.printf("%s喜欢%s","z","w");
    	ps.close();
    }
}

字符打印流

public class test {
    public static void main(String [] args) throws IOException, ClassNotFoundException  {
      //打印流
    	//创建字符打印流
    	PrintWriter pw=new PrintWriter(new FileWriter("c.txt"), true);
    	pw.println("你好,java");
    	pw.close();
    }
}

压缩流与解压缩流

解压缩流

解压本质:把每一个zipEntry按层级拷贝到本地另一个文件夹中。

小练习:解压文件夹

将“D:\Date\aaa.zip”解压到“D:\Date”

public class test {
    public static void main(String [] args) throws IOException   {
     //解压文件夹
    	File src=new File("D:\\Date\\aaa.zip");//原压缩文件夹地址
    	File dest=new File("D:\\Date");//目的文件夹地址
    	unzip(src, dest);
    }
    //创建一个解压方法对文件夹进行解压
    public static void unzip(File src,File dest) throws IOException {
    	//创建解压流对象:(读压缩流)
    	ZipInputStream zip=new ZipInputStream(new FileInputStream(src));
    	//利用while循环将文件夹中的每个对象解压出来,
    	ZipEntry entry;
    	while((entry=zip.getNextEntry())!=null) {
    		//有文件和文件夹
    		//对于文件和文件夹的处理方法不同,需要将二者分开处理
    		if(entry.isDirectory()) {
    			//文件夹
    			//需要将文件夹拷贝到指定地址,在目的地址创建一个相同的文件夹
    			File file=new File(dest, entry.toString());//因为entry为zip类型,所以需要转换成字符串
    			file.mkdirs();
    		}else {
    			//文件
    			//需要读取压缩包的文件,将其写到指定目的地址
    			FileOutputStream fo=new FileOutputStream(new File(dest,entry.toString()));
    			int b;
    			while((b=zip.read())!=-1) {
    				fo.write(b);
    			}
    			fo.close();
    			//关闭zip,证明一个文件已经处理完毕
    			zip.closeEntry();
    		}
    	}
    	zip.close();
    }

压缩流

压缩包里面的每一个文件或文件夹,看成一个ZipEntry对象。

压缩本质:把每一个文件或文件夹看成一个ZipEntry对象,放入到压缩包中。

练习1:压缩文件

将“D:\Date\c.txt”压缩到“D:\Date”

public class test {
    public static void main(String [] args) throws IOException   {
    	 //压缩文件
    	File src=new File("D:\\Date\\c.txt");//要压缩的文件地址
    	File dest=new File("D:\\Date");//压缩包的文件地址
    	onZip(src, dest);
    }
    //创建一个压缩文件的方法
    public static void onZip(File src,File dest) throws IOException {

    	//创建一个压缩流来关联压缩包
    	ZipOutputStream zos=new ZipOutputStream(new FileOutputStream(new File(dest,"c.zip")));//在根目录下创建一个zip的压缩包(一个壳子)
    	//创建ZipEntry对象,路径为压缩包里面的路径
    	ZipEntry entry=new ZipEntry("c.txt");
    	//把entry对象放到压缩包中
    	zos.putNextEntry(entry);
    	//将c.txt的内容写到压缩包中
    	FileInputStream fi=new FileInputStream(src);//读
     	int b;
     	while((b=fi.read())!=-1) {
		zos.write(b);
    	}
    	zos.closeEntry();
    	zos.close();
    }
}

练习2:压缩文件夹

将“aaa”文件夹压缩成一个“aaa.zip”压缩包

public class test {
    public static void main(String [] args) throws IOException   {
    	//压缩文件夹
    	File src=new File("D:\\Date\\aaa");//文件夹的路径
    	//防止若改变了文件夹的路径,压缩包的路径找不到,所以将压缩包的路径拆开书写
    	//压缩包的父级路径
    	File parent=src.getParentFile();
    	//创建压缩包路径
    	File dest=new File(parent,src.getName()+".zip");
    	//创建压缩流关联压缩包
    	ZipOutputStream zos=new ZipOutputStream( new FileOutputStream(dest));
    	//获取src内的每一个文件,变成ZipEntry对象中,放入压缩包中
    	toZip(src, zos, src.getName());
    	zos.close();
    	
    }
    //原文件夹
    //压缩流
    //文件夹的名字,例如是src的aaa文件夹名
    public static void toZip(File src,ZipOutputStream zos,String name) throws IOException {
    	//先遍历src获取每一个文件或文件夹
       File[] files=src.listFiles();
       for(File file:files) {
    	   //判断文件还是文件夹
    	   if(file.isFile()) {
    		   //文件
    		   //先将文件的路径写到ZipEntry对象中
    		   //file为为文件,file.getname是获取它的文件名为:dsr.txt
    		   //例如:要写入压缩包的路径为:\aaa\dsr.txt(文件夹下的文件)
    		   ZipEntry entry=new ZipEntry(name+"\\"+ file.getName());
    		   zos.putNextEntry(entry);
    		   //再获取file文件中的内容,写入到压缩包中
    		   FileInputStream fi=new FileInputStream(file);
    		   int b;
    		   while((b=fi.read())!=-1) {
    			   zos.write(b);
    		   }
    		   fi.close();
    		   zos.closeEntry();
    	   }else {
    		   //文件夹
    		   //递归调用方法
    		   toZip(file,zos,name+"\\"+file.getName());
    	   }
       }
    }
}

Commons-io(工具包)

Commons-io是一组有关IO操作的开源工具包。

作用:提高IO流的开发效率。

这是一个第三方工具类。

copyDirectory()——是将文件夹里的内容复制到另一个文件夹里。

copyDirectoryToDirectory()——是将第一个文件夹整体复制到另一个文件夹中。

public class test1 {
    public static void main(String[] args) throws IOException {
        File src= new File("a.txt");
        File dest=new File("c.txt");
        FileUtils.copyFile(src,dest);

    }
}

都为静态方法之间调用使用。

Hutool(工具包)

IO的综合练习

练习1:制造假数据

需求:制造假数据也是开发中的一个能力,在各个网上爬取数据,是其中一个方法。
分析:先将各个网址定义出来,再定义一个方法进行网络爬取

只演示一个将姓氏爬取出来:

public class test {
    public static void main(String [] args) throws IOException   {
    //https://www.threetong.com/qiming/baobao/27260.html 男生名字
    //https://www.threetong.com/qiming/baobao/27261.html 女生名字
    //https://hanyu.baidu.com/shici/detail?pid=0b2f26d4c0ddb3ee693fdb1137ee1b0d 百家姓
    	String firstname="https://hanyu.baidu.com/shici/detail?pid=0b2f26d4c0ddb3ee693fdb1137ee1b0d";
    	String boyname="https://www.threetong.com/qiming/baobao/27260.html";
    	String girlString="https://www.threetong.com/qiming/baobao/27261.html";
    	//定义一个方法进行爬取
    	String fn=copy(firstname);
    	String girl=copy(girlString);
    	String boy=copy(boyname);
    	//System.out.println(fn);
    	//定义一个正则表达式将需要的数据爬取出来
    	//定义一个方法
    	ArrayList<String> first=getDate(fn,"(\\W{4})(,|。)",1);
    	System.out.println(first);
    }
    private static ArrayList<String> getDate(String str,String regex,int index){//爬取的网址,正则表达式,
    	//将数据放在集合中,以便后续使用
    	ArrayList<String> list=new ArrayList<>();
    	//按正则表达式的规则获取数据
    	Pattern p=Pattern.compile(regex);//获取正则表达式
    	//到str中获取数据
         Matcher m=p.matcher(str);
         while (m.find()) {
        	 list.add(m.group(index));
         }
         return list;
    }
    
    public static String copy(String net) throws IOException {
    	//定义sb来拼接爬取到的数据
    	StringBuilder sb=new StringBuilder();
    	//创建一个URL对象
    	URL url=new URL(net);
    	//要链接这个网址
    	URLConnection con=url.openConnection();
    	//利用输入流来读取数据
    	//因为con方法调用只有字节输入流,所以需要将字节输入流包装成字符输入流,因为有文字需要爬取
    	InputStreamReader isr=new InputStreamReader(con.getInputStream());
    	int b;
    	while((b=isr.read())!=-1) {
    		sb.append((char)b);//将数据拼接到容器中
    	}
    	isr.close();
    	return sb.toString();
    }
}

练习2:带权重的随机点名器

txt文件中事先准备好10个学生姓名,每个学生的名字独占一行。
要求1:每次被点到的学生,再次被点到的概率在原先的基础上降低一半。
本题需要用到集合,I0,权重随机算法

分析:1)把文件的学生信息读到内存,放入集合中,集合为Student类型。

2)计算权重总和,利用遍历,再计算每一个的人实际占比,再计算每个人的权重占比范围

3)随机抽取,获取一个在0~1的随机数,获取随机数在数组的位置。

4)将这个元素的权重除2,再放回到集合中

5)再将修改了的值写入文件中

public class Student {
	
	private String name;
	private String gender;
	private int age;
	private double weight;
	public Student() {
		
	}
	public Student(String name,String gender,int age,double weight) {
		this.name=name;
		this.gender=gender;
		this.age=age;
		this.weight=weight;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getGender() {
		return gender;
	}
	public void setGender(String gender) {
		this.gender = gender;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public double getWeight() {
		return weight;
	}
	public void setWeight(double weight) {
		this.weight = weight;
	}
	@Override
	public String toString() {
		return name+"-"+gender+"-"+age+"-"+weight;
	}
	
}
public class test {
    public static void main(String [] args) throws IOException {
    	//将文件的内容读取到内存
    	//然后放入集合中
    	ArrayList<Student>list=new ArrayList<>();
    	BufferedReader bf=new BufferedReader(new FileReader("n.txt"));
    	String len;
    	while((len=bf.readLine())!=null) {
    		String[] arr=len.split("-");
    		Student stu=new Student(arr[0],arr[1],Integer.parseInt(arr[2]),Double.parseDouble(arr[3]));
    		list.add(stu);
    	}
    	bf.close();
    	//计算权重总和
    	double weight=0;
    	for(Student s:list) {//遍历集合
    		weight+=s.getWeight();
    	}
    	//计算每一个人的权重占比,放入数组中
    	Double[] arr=new Double[list.size()];
    	int index=0;
    	for(Student stu:list) {
    		arr[index]=stu.getWeight()/weight;
    		index++;
    	}
    	//计算每个人权重占比范围
    	for(int i=1;i<arr.length;i++) {
    		arr[i]=arr[i]+arr[i-1];
    	}
    	 System.out.println(Arrays.toString(arr));
    	//获取一个随机数在0~1之间
    	  Double d= Math.random();
    	  System.out.println(d);
    	  //查找随机数在这个数组中的位置
    	  //利用二分查找
    	 int num= Arrays.binarySearch(arr, d);
    	 int result=-num-1;//将插入点转为正数
    	  Student s1= list.get(result);
    	  System.out.println(s1);
    	  //将这个元素的权重值要除2
    	 double w= s1.getWeight()/2;
    	 s1.setWeight(w);
    	 //将修改了的值再次写入到文件中
    	 BufferedWriter bw=new BufferedWriter(new FileWriter("n.txt"));
    	  for(Student s:list) {
    		  bw.write(s.toString());
    		  bw.newLine();
    	  }
    	  bw.close();
    }
}

练习3:登陆小案例(添加锁定账号功能)

将正确的用户名和密码手动保存在本地的文件中。格式为:username=zhangsan&password=123&count=0让用户键盘录入用户名和密码
比较用户录入的和正确的用户名密码是否一致
如果一致则打印登陆成功
如果不一致则打印登陆失败,连续输错三次被锁定。

public class test {
    public static void main(String [] args) throws IOException {
    	//先读取文件
    	BufferedReader br=new BufferedReader(new FileReader("n.txt"));
    	String len=br.readLine();
    	br.close();
    	//将这个字符串分隔开
    	 String[] arr=len.split("&");
    	 String arr1=arr[0];//用户名
    	 String arr2=arr[1];//密码
    	 String arr3=arr[2];//次数
    	 //再将这三个分割
    	 String[] str1=arr1.split("=");
    	 String name=str1[1];//用户名
    	 
    	 String[] str2=arr2.split("=");
    	 String passwd=str2[1];//密码
    	 
    	 String[] str3=arr3.split("=");
    	 int count=Integer.parseInt(str3[1]);//次数
    	 //从键盘输入
    	 Scanner sc=new Scanner(System.in);
    	 while(true) {
    	 System.out.println("请输入用户名");
    	 String n=sc.nextLine();
    	 System.out.println("请输入密码");
    	 String number=sc.nextLine();
    	 
    	 //与用户比较
    	 if(n.equals(name)&&number.equals(passwd)&&count<=3) {
    		 //一致
    		 System.out.println("登录成功");
    		 break;
    		 
    	 }else {
    		 //不一致
    		 System.out.println("登录失败");
    		 count++;
    		 if(count<3) {
    			 System.out.println("登录失败,还剩"+(3-count)+"机会");
    		 }else {
    			 System.out.println("账户被锁定");
    			 break;
    		 }
    	 }
    	 write("username="+name+" "+"passwd="+passwd+" "+"count="+count);
    }
    }
  //要将count写入到文件中
	 public static void write(String str) throws IOException {
		 BufferedWriter bw=new BufferedWriter(new FileWriter("t.txt"));
		 bw.write(str);
		 bw.close();
	 }

	
}

将读n文件的信息,写入到t文件中。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

macOS的word没有zotero怎么办

打开zotero,首选项,引用,重新安装加载项 然后到word里 点模板和加载项 把zotero勾上,OK了

MyBatis3.4全集笔记

MyBatis 1. MyBatis 简介 MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code&#xff0c;并且改名为MyBatis 。2013年11月迁移到Github。 iBATIS一词来源于“internet”和“abatis”的组合&#xff0c;是一个基于Ja…

Amazon云计算AWS(四)

目录 八、其他Amazon云计算服务&#xff08;一&#xff09;快速应用部署Elastic Beanstalk和服务模板CloudFormation&#xff08;二&#xff09;DNS服务Router 53&#xff08;三&#xff09;虚拟私有云VPC&#xff08;四&#xff09;简单通知服务和简单邮件服务&#xff08;五&…

list(二)和_stack_queue

嗨喽大家好&#xff0c;时隔许久阿鑫又给大家带来了新的博客&#xff0c;list的模拟实现&#xff08;二&#xff09;以及_stack_queue&#xff0c;下面让我们开始今天的学习吧&#xff01; list(二)和_stack_queue 1.list的构造函数 2.设计模式之适配器和迭代器 3.新容器de…

HMI-Board之LVGL应用

移植 使用默认模板工程新建一个RT-Thread项目&#xff0c;BSP版本为1.1.1 打开RT-Thread Settings&#xff0c;点击右侧箭头按钮进入详细页&#xff0c;在硬件栏开启以下几个配置选项&#xff08;LCD、触摸屏、demo&#xff09; 此时&#xff0c;打开board文件夹&#xff0c;发…

OSI协议集

国际标准化组织除了定义osi参考模型之外&#xff0c;还开发了实现7个功能层次的各种协议和服务标准&#xff0c;这些协议和服务统称为osi协议。osi协议是一些已有的协议和iso新开发的协议的混合体&#xff0c;例如&#xff0c;大部分物理层和数据链路层协议是采用现有的协议&am…

Postgre pg_fdw(foreign data wrappers)部署 实现PG到PG之间数据同步

结构&#xff1a; 主机名ip操作系统PG192.168.80.9centos7.9qilin192.168.80.99中标麒麟v7.0 fdw支持同构或异构数据库之间的访问。 部署FDW 需要在客户端部署。 1.编译postgre_fdw cd /usr/local/postgresql-12.4/contrib/postgres_fdwmakemake install 一般这里面会报权限…

雷池WAF-动态防护新功能体验

雷池WAF 雷池WAF&#xff08;Web Application Firewall&#xff0c;网络应用防火墙&#xff09;是由长亭科技开发的一个网络安全产品&#xff0c;它专注于保护Web应用免受黑客攻击。 今天主要讲的是长亭雷池最近新出的功能&#xff1a;动态防护 安装 雷池WAF支持多种安装方式…

【Linux】网络管理

1、查看网络管理程序的状态 systemctl status NetworkManager 2、查看网络子管理程序的状态 systemctl status network 配置网络的工具 1、图形界面网络设置 步骤如下&#xff1a; 还可在命令行输入&#xff1a; nmtui 或者&#xff1a; nm-connection-editor 打开…

Qt_C++ RFID网络读卡器Socket Udp通讯示例源码

本示例使用的设备&#xff1a; WIFI/TCP/UDP/HTTP协议RFID液显网络读卡器可二次开发语音播报POE-淘宝网 (taobao.com) #ifndef MAINWINDOW_H #define MAINWINDOW_H#include <QMainWindow> #include <QHostInfo> #include <QNetworkInterface> #include <…

[论文笔记]Mistral 7B

引言 今天带来大名鼎鼎的Mistral 7B的论文笔记。 作者推出了Mistral 7B&#xff0c;这是一个70亿参数的语言模型。Mistral 7B在所有评估基准中表现优于最佳的13B开源模型&#xff08;Llama 2&#xff09;&#xff0c;并且在推理、数学和代码生成方面胜过最佳发布的34B模型(Ll…

Patchwork++:基于点云的快速、稳健的地面分割方法

1. 背景 论文发表在2022IROS&#xff0c;是Patchwork的改进版本。算法通过数学方法进行快速而鲁棒性很强的地面分割&#xff0c;在智能机器人上的可操作性非常强。通过微调算法&#xff0c;可以应用于16-beams等多种规格的激光雷达。由于激光雷达点云数据标注的难度非常大&…

苹果CMS:怎么添加2019和2020年份筛选

我们进入搜索的时候看到一个关于年份的搜索&#xff0c;那如果上面没有出现19,20我们该如何处理呢&#xff1f; 我们进入管理后台 -【系统】-【网站参数配置】-【预留参数】 添加下视频年代逗号隔开即可 如果要设置地区&#xff0c;语言也实在这里直接配置即可&#xff01;&am…

新书推荐:1.3 内存管理模式

本节必须掌握的知识点&#xff1a; 4GB虚拟空间 虚拟内存 多任务切换 1.3.1 4GB虚拟空间 ■Win16操作系统 Windows1.0版本为16位操作系统&#xff0c;支持16位处理器实模式&#xff0c;最大寻址空间为1MB。Win16操作系统的内存管理非常简单&#xff0c;采用分段内存管理模式…

企业微信hook接口协议,ipad协议http,发送CDN语音消息

发送CDN语音消息 参数名必选类型说明uuid是String每个实例的唯一标识&#xff0c;根据uuid操作具体企业微信send_userid是long要发送的人或群idisRoom是bool是否是群消息 请求示例 {"uuid":"1753cdff-0501-42fe-bb5a-2a4b9629f7fb","send_userid&q…

树莓派4B 学习笔记3: 系统自动更新时间_测试CSI摄像头_安装OpenCv_4.6(未成功编译源码)_备份树莓派镜像

今日继续学习树莓派4B 4G&#xff1a;&#xff08;Raspberry Pi&#xff0c;简称RPi或RasPi&#xff09; 本文我只是安装了OpenCv 4.6&#xff0c;但编译源码失败了&#xff01;有关 OpenCv 部分仅做笔记暂存&#xff01; 本人所用树莓派4B 装载的系统与版本如下: 版本可用命令…

平板显示LED背光芯片OC6700,输入3.6V~60V,升压型 LED 恒流驱动器

概述 OC6700是一款内置60V功率NMOS高效率、高精度的升压型大功率LED恒流驱动芯片。OC6700采用固定关断时间的控制方式&#xff0c;关断时间可通过外部电容进行调节&#xff0c;工作频率可根据用户要求而改变。OC6700通过调节外置的电流采样电阻&#xff0c;能控制高亮度LED灯的…

汇编:数据定义数据填充

数组的定义 在32位汇编语言中&#xff0c;定义数组时&#xff0c;通常使用定义数据指令&#xff08;如 DB, DW, DD,DQ &#xff09;和标签来指定数组的名称和内容。DB定义字节数组&#xff08;每个元素占1字节&#xff09;、DW定义字数组&#xff08;每个元素占2字节&#xff…

【AI基础】第二步:安装AI运行环境

开局一张图&#xff1a; 接下来按照从下往上的顺序来安装部署。 规则1 注意每个层级的安装版本&#xff0c;上层的版本由下层版本决定 比如CUDA的版本&#xff0c;需要看显卡安装了什么版本的驱动&#xff0c;然后CUDA的版本不能高于这个驱动的版本。 这个比较好理解&#xff…

注意力机制篇 | YOLOv8改进之引入STA(Super Token Attention)超级令牌注意力机制 | CVPR2023

前言:Hello大家好,我是小哥谈。超级令牌注意力机制是一种基于Transformer的模型,用于处理长文本序列的任务。它通过引入超级令牌(Super Token)来减少输入序列中的填充标记,从而提高计算效率和模型性能。🌈 目录 🚀1.基础概念