IO流(1)

定义:存取和读取数据的解决方案

作用:用于读写数据(本地文件、网络)

分类:

一种是:输出流和输入流。

一种是:字节流和字符流。

字节流

字节流——FileOutputStream(字节输出流)(byte数组)

把程序中的数据写到本地文件中。

public class test {
    public static void main(String [] args) throws IOException  {
    	FileOutputStream f=new FileOutputStream("a.txt");
    	f.write(97);
    	f.close();
	}
}

 

FileOutputStream写数据的3种方式

 1.一次写一个字节数据

public class test {
    public static void main(String [] args) throws IOException  {
    	FileOutputStream f=new FileOutputStream("a.txt");
    	f.write(97);
    	f.close();
	}
}

2.一次写一个字节数组数据

public class test {
    public static void main(String [] args) throws IOException  {
    	FileOutputStream f=new FileOutputStream("a.txt");
    	byte[] b= {97,98,99,100,101};
    	f.write(b);    	
    	f.close();
	}
}

3.一次写一个字节数组的部分数据

public class test {
    public static void main(String [] args) throws IOException  {
    	FileOutputStream f=new FileOutputStream("a.txt");
    	byte[] b= {97,98,99,100,101};
    	f.write(b,1,2);    	
    	f.close();
	}
}

换行写和续写

换行写:再写一个换行符就可以了,windows中的换行符:\r\n

public class test {
    public static void main(String [] args) throws IOException  {
    	FileOutputStream f=new FileOutputStream("a.txt");
    	//第一个字符串
    	String str1=("gywiliydqwmz");
        byte[] b1=str1.getBytes();
        f.write(b1);
    	 //换行符
        String str2=("\r\n");
        byte[] b2=str2.getBytes();
        f.write(b2);
        //第二个字符串
        String str3=("666");
        byte[] b3=str3.getBytes();
        f.write(b3);
    	f.close();
	}
}

续写:

打开续写开关即可,开关位置:创建对象的第二个参数;默认false:表示关闭续写,此时创建对象会清空文件;手动传递true:表示打开续写,此时创建对象不会清空文件。

public class test {
    public static void main(String [] args) throws IOException  {
    	FileOutputStream f=new FileOutputStream("a.txt",true);
    	//第一个字符串
    	String str1=("gywiliydqwmz");
        byte[] b1=str1.getBytes();
        f.write(b1);
    	 //换行符
        String str2=("\r\n");
        byte[] b2=str2.getBytes();
        f.write(b2);
        //第二个字符串
        String str3=("666");
        byte[] b3=str3.getBytes();
        f.write(b3);
    	f.close();
	}
}

执行第二次没有清空,还继续传入程序中写好的字符。

字节流——FileInputStream(字节输入流)(byte数组)

把本地文件的数据读取到程序中。

public class test {
    public static void main(String [] args) throws IOException  {
    	//创建字节输入流
    	FileInputStream f=new FileInputStream("a.txt");
    	//读取数据
    	int b1=f.read();
    	System.out.println((char)b1);
    	int b2=f.read();
    	System.out.println((char)b2);
    	int b3=f.read();
    	System.out.println((char)b3);
    	int b4=f.read();
    	System.out.println((char)b4);
    	int b5=f.read();
    	System.out.println((char)b5);
    	
    	f.close();
	}
}

字节输入流循环读取(while)
public class test {
    public static void main(String [] args) throws IOException  {
    	//创建字节输入流
    	FileInputStream f=new FileInputStream("a.txt");
    	//循环读取数据
    	int b;
    	while((b=f.read())!=-1) {
    		System.out.print((char)b);
    	}
    	
    	f.close();
	}
}

一次读多个字节

一次读多个字节数据,具体读多少与数组长度有关,读取完成后会把数据存储在数组中,要把数组转成字符串,查看。

public class test {
    public static void main(String [] args) throws IOException  {
    	FileInputStream f=new FileInputStream("a.txt");
    	//读取数据
    	//定义数组长度
    	byte[] bytes=new byte[2];
    	int len1=f.read(bytes);//将读取到的数据放入数组中
    	System.out.println(len1);
     	String str1=new String(bytes, 0, len1);//将数组转换成字符串
    	System.out.println(str1);
    	
    	int len2=f.read(bytes);
    	System.out.println(len2);
     	String str2=new String(bytes, 0, len2);
    	System.out.println(str2);
    	
    	int len3=f.read(bytes);
    	System.out.println(len3);
     	String str3=new String(bytes, 0, len3);
    	System.out.println(str3);
    	//释放资源
    	f.close();
	}
}

读和写的小练习

文件拷贝:把“D:\Date\c.txt”拷贝到当前模块下。

分析:先创建读流(input)、再创建写流(output),然后边读边写,最后再释放,先开的最后再关。

public class test {
    public static void main(String [] args) throws IOException  {
    	//创建字节输入、输出流
    	FileInputStream fi=new FileInputStream("D:\\Date\\c.txt");
    	FileOutputStream fo=new FileOutputStream("c.txt");
    	//边读边写
    	int b;
    	while((b=fi.read())!=-1) {
    		fo.write(b);
    	}
    	fo.close();
    	fi.close();
    	
    	
	}
}

快速拷贝:
public class test {
    public static void main(String [] args) throws IOException  {
    	FileInputStream fi=new FileInputStream("D:\\Date\\c.txt");
    	FileOutputStream fo=new FileOutputStream("c.txt");
    	//读取数据;
    	int len;
    	byte[] bytes=new byte[1024];
    	while((len=fi.read(bytes))!=-1) {
    		fo.write(bytes,0,len);
    	}
    	fo.close();
    	fi.close();
	}
}

字符集

有ASCll字符集(美国)、GBK字符集(中国有汉字)、Unicode字符集(万国码)

一个字节8位。

ASCll字符集编码与解码

GBK字符集编码与解码

Unicode字符集编码与解码

编码和解码方法

public class test {
    public static void main(String [] args) throws IOException  {
    	//编码:将一个字符串转为二进制
    	String str="ai你呢";
    	byte[] b1=str.getBytes();//将字符串转为字节,默认编码规则
    	System.out.println(Arrays.toString(b1));
    	byte[] b2=str.getBytes("gbk");//指定编码规则
    	System.out.println(Arrays.toString(b2));
    	
    	//编码和解码要采用相同的字符集,否则会出现乱码
    	
    	//解码,将字节转为字符串
    	String s1=new String(b1);
    	System.out.println(s1);
    	String s2=new String(b2,"gbk");
    	System.out.println(s2);
	}
}

字符流

FileReader——字符输入流(char类型数组)

空参Read()方法
public class test {
    public static void main(String [] args) throws IOException  {
    	//创建字符输入流
    	FileReader fr=new FileReader("a.txt");
    	//read()方法:读取后解码,返回一个整数
    	int t;
    	while((t=fr.read())!=-1) {
    		System.out.print((char)t);
    	}
    	//释放资源
    	fr.close();
	}
}

有参Read()方法

read(c):将读取,解码(解码后是一个十进制整数),强转放在一起,将强转后的字符放进一个数组中。

public class test {
    public static void main(String [] args) throws IOException  {
    	//创建字符输入流
    	FileReader fr=new FileReader("a.txt");
    	//read(有参)方法:将读取,解码,强转放在一起,把强转后的字符放在数组中
    	int len;
    	char[] c=new char[2];//两个两个字节打印
    	while((len=fr.read(c))!=-1) {
    		System.out.print(new String(c,0,len));
    		
    	}
    	
    	//释放资源
    	fr.close();
	}
}

FileWriter——字符输出流(char类型数组)

 

 

public class test {
    public static void main(String [] args) throws IOException  {
    	//创建字符输出流
    	FileWriter fr=new FileWriter("a.txt");
    	//写入数据
    	fr.write("你好啊aaa");//写入一个字符串
    	//释放资源
    	fr.close();
	}
}

字符输入流与字符输出流底层原理类似,都是先写入缓冲区中。

字符输出流的方法:

综合练习

 练习1:拷贝文件夹,考虑到子文件夹

public class test {
    public static void main(String [] args) throws IOException  {
    	//将一个文件夹拷贝
    	//创建一个对象表示原文件
    	File f1=new File("D:\\Date\\aaa");
    	//目的文件夹
    	File f2=new File("D:\\Date\\dest");
    	copy(f1, f2);
	}
    //创建一个方法进行文件夹的拷贝
    public static void copy(File f1,File f2) throws IOException {//(原文件,目标文件)
    	f2.mkdirs();
    	//进入文件,进行遍历
       File[] files=f1.listFiles();
    	for(File file:files) {
    		//判断是否为文件,是拷贝
    		if(file.isFile()) {
    			//文件,拷贝用字节流,读取方法
    			FileInputStream fi=new FileInputStream(file);//读,原文件
    			FileOutputStream fo=new FileOutputStream(new File(f2,file.getName()));//写,目标文件(父级路径,子级路径)
    			byte[] b=new byte[1024];
    			int len;
    			while((len=fi.read(b))!=-1) {
    				fo.write(b,0,len);
    			}
    			fo.close();
    			fi.close();
    			
    		}else {
    			//文件夹
    			//递归方法
    			copy(file,new File(f2,file.getName()));
    		}
    	}
    }
}

 

练习2:文件加密

  为了保证文件的安全性,就需要对原始文件进行加密存储,再使用的时候再对其进行解密处理。加密原理:对原始文件中的每一个字节数据进行更改,然后将更改以后的数据存储到新的文件中。
解密原理:读取加密之后的文件,按照加密的规则反向操作,变成原始文件。
  分析:加密和解密文件其实相当于拷贝,只不过对拷贝内容进行异或。例如:100^10为110;110^10=100,^为异或,这个过程就相当于加密和解密。

加密:

public class test {
    public static void main(String [] args) throws IOException  {
    	//文件加密
    	//创建文件对象和加密对象
    	FileInputStream fi=new FileInputStream("a.txt");
    	FileOutputStream fo=new FileOutputStream("m.txt");//将文件a的内容加密到文件b
    	//加密处理
    	int len;
    	while((len=fi.read())!=-1) {
    		fo.write(len^10);//原字节数异或10写入文件
    	}
    	fo.close();
    	fi.close();
    }
}

加密后:

解密:

其实相当于将两者路径一调换

public class test {
    public static void main(String [] args) throws IOException  {
    	//文件加密
    	//创建文件对象和加密对象
    	FileInputStream fi=new FileInputStream("m.txt");
    	FileOutputStream fo=new FileOutputStream("l.txt");
    	//加密处理
    	int len;
    	while((len=fi.read())!=-1) {
    		fo.write(len^10);//原字节数异或10写入文件
    	}
    	fo.close();
    	fi.close();
    }
}

解密后:

练习3:修改文件中的数据

文本文件中有以下的数据:2-1-9-4-7-8
将文件中的数据进行排序,变成以下的数据:1-2-4-7-8-9
分析:

先读取文件内容,将文件内容赋值给StringBuilder容器,将容器转为字符串,利用字符串中的方法对字符进行切割,将数字切割出来,为字符数组,创建一个集合将字符数组中的数组存入,利用for循环,将字符型数组变成int类型,再加入到集合中,利用Collections方法,对集合进行排序。

再写出,利用for循环获取数字,写入到文件中,进行判断索引位置,要对其格式输出。

public class test {
    public static void main(String [] args) throws IOException  {
    	//读取,将文件内容赋给一个容器
    	FileReader fr=new FileReader("m.txt");
    	StringBuilder sb=new StringBuilder();
    	int len;
    	while((len=fr.read())!=-1) {
    		sb.append((char)len);
    	}
    	fr.close();
    	//排序
    	String s=sb.toString();//赋给一个字符串
        String[] arr=s.split("-");//将字符串按-切割
        ArrayList<Integer> list=new ArrayList<>();//将数组添加到集合中
        for (String str : arr) {
		int i=Integer.parseInt(str);
		list.add(i);
	    }  
    Collections.sort(list);
    System.out.println(list);
	//写出
    FileWriter fw=new FileWriter("l.txt");
    //获取集合中的元素按规定格式写出
    for(int i=0;i<list.size();i++) {
    	if(i==list.size()-1) {
    		fw.write(list.get(i)+"");
    	}else {
    		fw.write(list.get(i)+"-");
    	}
    }
    fw.close();
    
    }
}

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

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

相关文章

MoeCTF 2022 usb

直接找 URB的第一个输入协议 我们需要提取的数据 HID Data 提取过滤器 tshark -r usb.pcapng -Y "usb.src\"2.2.1\"" -T json >1.json 拿 usbhid.data 字段 tshark -r usb.pcapng -Y "usb.src\"2.2.1\"" -T json -e usbhid.data …

【记录】打印|用浏览器生成证件照打印PDF,打印在任意尺寸的纸上(简单无损!)

以前我打印证件照的时候&#xff0c;我总是在网上找在线证件照转换或者别的什么。但是我今天突然就琢磨了一下&#xff0c;用 PDF 打印应该也可以直接打印出来&#xff0c;然后就琢磨出来了&#xff0c;这么一条路大家可以参考一下。我觉得比在线转换成一张 a4 纸要方便的多&am…

Git常用命令1

1、设置用户签名 ①基本语法&#xff1a; git config --global user.name 用户名 git config --global user.email 邮箱 ②实际操作 ③查询是否设置成功 cat ~/.gitconfig 注&#xff1a;签名的作用是区分不同操作者身份。用户的签名信息在每一个版本的提交…

2.1 OpenCV随手简记(二)

为后续项目学习做准备&#xff0c;我们需要了解LinuxOpenCV、Mediapipe、ROS、QT等知识。 一、图像显示与保存 1、基本原理 1.1 图像像素存储形式 首先得了解下图像在计算机中存储形式&#xff1a;(为了方便画图&#xff0c;每列像素值都写一样了)。对于只有黑白颜色的灰度…

OSM历史10年(2014-2024)全国数据下载(路网、建筑物、POI、水系、地表覆盖利用······)

点击下方全系列课程学习 点击学习—>ArcGIS全系列实战视频教程——9个单一课程组合系列直播回放 零、前沿 这次向大家介绍一下OSM&#xff08;OpenStreetMap&#xff09;十年历史数据&#xff08;2014—2014&#xff09;的下载方法。当然我们也下载好分享给大家&#xff…

如何上传模型素材创建3D漫游作品?

一、进入3D空间漫游互动工具编辑器 进入720云官网-点击“开始创作”-选择3D空间漫游-进入到作品创建页面。 二、上传模型及素材&#xff0c;创建生成3D空间漫游模型 1.创建3D空间作品&#xff1a;您可以选择新建空白作品或使用720云提供的预设空间模板&#xff0c;本篇主要介绍…

顶级商圈词汇,你听过哪些?

能把复杂的事情说到简单才是真正的高手&#xff0c;堆砌时髦名词的人&#xff0c;大多是被别人影响后的盲从之辈&#xff0c;高认知的人不扯这些虚头巴脑的东西。 顶级商圈词汇&#xff0c;你听过哪些&#xff1f; 生命周期&#xff0c;价值转化&#xff0c;完善逻辑业模式&a…

Elasticsearch 认证模拟题 - 4

一、题目 生成快照&#xff0c;或快照生命周期 1.1 考点 快照生命周期&#xff08;最好通过界面化配置&#xff09;创建仓库创建快照 &#xff08;因为这个需要部署共享文件&#xff0c;所以这个我就在虚拟机上简单操作一下&#xff09; 注&#xff1a; 部署共享文件系统可…

Java Web基础知识(Servlet、Cookie、Session、Filter、Listener)

文章目录 Servlet什么是Servlet&#xff1f;Servlet的生命周期ServletConfig对象ServletContext对象Servlet请求转发和重定向Servlet请求转发&#xff08;forward和include&#xff09;Servlet重定向&#xff08;redirect&#xff09;重定向和转发的区别? 读取文件、下载文件 …

攻防对抗少丢分,爱加密帮您筑起第二防线

应用程序通常处理和存储大量的敏感数据&#xff0c;如用户个人信息、财务信息、商业数据、国家数据等&#xff0c;用户量越大的应用程序&#xff0c;其需要存储和保护的用户数据越多。因此应用层长期是攻击方的核心目标&#xff0c;传统应用安全依靠防火墙(FireWall)、入侵检测…

一周学会Django5 Python Web开发 - Django5内置Admin系统二次开发

锋哥原创的Python Web开发 Django5视频教程&#xff1a; 2024版 Django5 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili2024版 Django5 Python web开发 视频教程(无废话版) 玩命更新中~共计56条视频&#xff0c;包括&#xff1a;2024版 Django5 Python we…

规则引擎Drools,基于mysql实现动态加载部署

文章目录 一、使用1、参考资料2、引包3、创建规则实体类4、实现drools动态规则5、模拟数据库&#xff0c;实现规则的CRUD6、创建控制层7、测试规则的动态添加&#xff08;1&#xff09;添加规则&#xff08;2&#xff09;修改规则&#xff08;3&#xff09;删除规则 8、模拟2个…

01PCB设计概述

PCB设计概述 EDA electronic design automatic 电子设计自动化&#xff08;利用计算机来实现电子设计&#xff09; 分为 &#xff1a; 微电子&#xff08;芯片设计&#xff09;、硬件板卡&#xff08;PCB设计&#xff09; 画原理图、画PCB布线 要会绘制原理图库、和封装图库 元…

短信发送验证码及邮件发送验证码

发送短信验证码 阿里云发送验证码 public Integer sendTelCode(String tel) {String url "https://dfsns.market.alicloudapi.com/data/send_sms";String appcode "a3198282fbdf443d97aa9f3cfbe1232e";int code RandomUtil.randomInt(1000,10000);emai…

Ubuntu系统安装

目录 安装准备 安装步骤 虚拟机配置 系统安装 安装准备 Ubuntu系统镜像&#xff0c;虚拟机环境 虚拟机环境 使用的虚拟机软件为VMware Workstation 系统镜像 阿里镜像站&#xff1a;阿里巴巴开源镜像站-OPSX镜像站-阿里云开发者社区 (aliyun.com)https://developer.aliyun.com…

掌握 NestJS 10.x:从零开始构建高效可扩展的服务器端应用详解

NestJS 是一个用于构建高效、可扩展的 Node.js 服务端应用的框架&#xff0c;基于 TypeScript 构建&#xff0c;并且受 Angular 的启发&#xff0c;提供了模块化、易测试、易维护的架构。NestJS 10.x 引入了一些新特性和改进&#xff0c;进一步提升了开发体验。本文将详细介绍如…

HarmonyOS鸿蒙学习笔记(27)resources目录说明

resources目录说明 目录结构目录说明base目录rawfile目录resfile目录资源组目录 参考资料 目录结构 在HarmonyOS的项目结构中&#xff0c;有resources目录&#xff0c;用于存放应用/服务所用到的资源文件&#xff0c;如图形、多媒体、字符串、布局文件等。关于资源文件&#x…

计网ppt标黄知识点整理第(1)章节——谢希仁版本、期末复习自用

大众熟知的三大网络&#xff1a;电信网络、有线电视网络、计算机网络。发展最快起到核心的是计算机网络。Internet是全球最大、最重要的计算机网络。互联网&#xff1a;流行最广、事实上的标准译名。互连网&#xff1a;把许多网络通过一些路由器连接在一起。与网络相连的计算机…

AI网络爬虫:无限下拉滚动页面的另类爬取方法

现在很多网页都是无限下拉滚动的。可以拉动到底部&#xff0c;然后保存网页为mhtml格式文件。 接着&#xff0c;在ChatGPT中输入提示词&#xff1a; 你是一个Python编程高手&#xff0c;要完成一个关于爬取网页内容的Python脚本的任务&#xff0c;下面是具体步骤&#xff1a; …

C++——list

目录 前言 一、list 1.1 list的介绍 1.2 list的使用 1.2.1 list的构造 1.2.2 list iterator的使用 1.2.3 list capacity 1.2.4 list element access 1.2.5 list modifiers 1.2.6 list的迭代器失效 二、list的模拟实现 2.1 模拟实现list 三、list与vector的对比 总结 前言 今天…