javaseday28 IO

IO流

IO流;存储和读取数据的解决方案。

纯文本文件:Windows自带的记事本打开能读懂的文件,word和Excel不是纯文本文件,txt和md是纯文本文件。

小结

 IO流体系

FileOutputStream

public class Demo1 {public static void main(String[] args) throws IOException {//创建对象FileOutputStream fos = new FileOutputStream("javaseday28Io\\a.txt");//传输数据(字节),根据asicii码为 afos.write(97);//关闭资源fos.close();}
}

a

FileOutputStream细节

 

FileOutputStream写数据的3种方式

public class Demo2 {public static void main(String[] args) throws IOException {//创建对象FileOutputStream fos = new FileOutputStream("javaseday28Io\\a.txt");//传输数据(字节),根据asicii码为 a
//        fos.write(97);//传输byte数组byte[] bytes = {97,98,99,100,101,102};
//        fos.write(bytes);fos.write(bytes,1,3);/*** 参数一:要写入的数组* 参数二:写入的起始索引* 参数三:写入的个数*///关闭资源fos.close();}
}

换行和续写

public class Demo3 {public static void main(String[] args) throws IOException {/*** 不同的操作系统的换行符号不同* windos \r\n*linux \n* mac \r*//*** 续写 在创建FileOutputStream对象时调用不用的构造方法即可* FileOutputStream fos = new FileOutputStream("javaseday28Io\\a.txt",true);即为保存数据的续写*///创建对象FileOutputStream fos = new FileOutputStream("javaseday28Io\\a.txt",true);//传输数据(字节),根据asicii码为 a//换行和续写//换行String s1 = "duzhelaiyizhengshui";byte[] bytes1 = s1.getBytes();fos.write(bytes1);//将换行符号使用字符串表示并写入String s2 = "\r\n";byte[] bytes2 = s2.getBytes();fos.write(bytes2);String s3 = "666";byte[] bytes3 = s3.getBytes();fos.write(bytes3);//关闭资源fos.close();}
}

FileOutputStream的小结

FileInputStream

public class Demo1 {public static void main(String[] args) throws IOException {/*** 如果读取到空值则返回-1*/FileInputStream fos = new FileInputStream("javaseday28Io\\a.txt");int r1 = fos.read();System.out.println((char) r1);int r2 = fos.read();System.out.println((char) r2);int r3 = fos.read();System.out.println((char) r3);int r4= fos.read();System.out.println((char) r4);int r5 = fos.read();System.out.println((char) r5);int r6 = fos.read();//-1System.out.println(r6);fos.close();}
}

细节

FileInputStream的循环读取

public class Demo2 {public static void main(String[] args) throws IOException {/*** 如果读取到空值则返回-1*/FileInputStream fos = new FileInputStream("javaseday28Io\\a.txt");int r1;while ((r1 = fos.read()) != -1){System.out.println((char)r1);}fos.close();}
}

FileInputStream的拷贝文件

public class Demo3 {public static void main(String[] args) throws IOException {/*** 如果读取到空值则返回-1*/FileInputStream fis = new FileInputStream("C:\\Users\\20724\\Desktop\\123.jpg");FileOutputStream fos = new FileOutputStream("javaseday28Io\\123.jpg");int r1;//将读取到的信息写入目标文件while ((r1 = fis.read()) != -1){fos.write(r1);}//关闭资源fos.close();fis.close();}
}

文件拷贝的弊端和解决方法

文件拷贝单个字符拷贝较慢,可以使用数组进行拷贝。

public class Demo4 {public static void main(String[] args) throws IOException {/*** 如果读取到空值则返回-1*/FileInputStream fis = new FileInputStream("C:\\Users\\20724\\Desktop\\123.jpg");FileOutputStream fos = new FileOutputStream("javaseday28Io\\123.jpg");//创建一个5MB的数组存储数据byte[] bytes = new byte[1024*1024*5];//记录每次数组中写入的数据的长度,一遍输出的时候知道输出几个字符int len;//将读取到的信息写入目标文件//将数据读取到数组是是将读取的字符覆盖数组中已有的字符,如果没有被覆盖到就会保留while ((len = fis.read(bytes)) != -1){//由于没有被覆盖到就会保留,所以向文件写入时要根据读取数据的长度写入fos.write(bytes,0,len);}//关闭资源fos.close();fis.close();}}

IO流中不同JDK版本捕获异常的方式

基本写法:
public class Demo5 {public static void main(String[] args) throws IOException {/*** 如果读取到空值则返回-1*/long start = System.currentTimeMillis();//由于代码块中的变量只能在本块中访问,为了在final中关闭流因此定义在外面。//定义之后不赋值会出现未初始化错误所以赋值为nullFileInputStream fis = null;FileOutputStream fos = null;try {fis = new FileInputStream("C:\\Users\\20724\\Desktop\\123.jpg");fos = new FileOutputStream("javaseday28Io\\123.jpg");byte[] bytes = new byte[1024*1024*5];int len;while ((len = fis.read(bytes)) != -1){fos.write(bytes,0,len);}} catch (IOException e) {throw new RuntimeException(e);} finally {//关闭资源//判断是否为空,即是否成功创建了流对象if (fos != null){//捕获关闭流时的异常try {fos.close();} catch (IOException e) {throw new RuntimeException(e);}}//判断是否为空,即是否成功创建了流对象if (fis != null){//捕获关闭流时的异常try {fis.close();} catch (IOException e) {throw new RuntimeException(e);}}}long end = System.currentTimeMillis();System.out.println((end-start)/1000.0);}
}

public class Demo6 {public static void main(String[] args) throws IOException {/*** 如果读取到空值则返回-1*//*** JDK7 的写法* 不需要关闭流*/try(FileInputStream fis = new FileInputStream("C:\\Users\\20724\\Desktop\\123.jpg");FileOutputStream fos = new FileOutputStream("javaseday28Io\\123.jpg")) {byte[] bytes = new byte[1024*1024*5];int len;while ((len = fis.read(bytes)) != -1){fos.write(bytes,0,len);}} catch (IOException e) {throw new RuntimeException(e);}}
}
public class Demo7 {public static void main(String[] args) throws IOException {/*** 如果读取到空值则返回-1*//*** JDK9 的写法* 不需要关闭流*/FileInputStream fis = new FileInputStream("C:\\Users\\20724\\Desktop\\123.jpg");FileOutputStream fos = new FileOutputStream("javaseday28Io\\123.jpg");try(fis;fos) {byte[] bytes = new byte[1024*1024*5];int len;while ((len = fis.read(bytes)) != -1){fos.write(bytes,0,len);}} catch (IOException e) {throw new RuntimeException(e);}}
}

字符集

ASCII

GBK

小结

Unicode

小结

出现乱码的原因

扩展

java中的编码和解码

public class Demo1 {public static void main(String[] args) throws UnsupportedEncodingException {String str = "hao读者";//使用默认编码方法即utf8byte[] bytes1 = str.getBytes();System.out.println(Arrays.toString(bytes1));//[104, 97, 111, -24, -81, -69, -24, -128, -123]//使用GBK编码byte[] bytes2 = str.getBytes("GBK");System.out.println(Arrays.toString(bytes2));//[104, 97, 111, -74, -63, -43, -33]//解码String s2 = new  String(bytes1);System.out.println(s2);//hao读者//使用错误的解码方式String s3 = new  String(bytes1,"GBK");System.out.println(s3);//出现乱码 hao璇昏��String s4 = new  String(bytes2,"GBK");System.out.println(s4);//hao读者}
}

字符流

FileReader

    public static void main(String[] args) throws IOException {/*第一步:创建对象public FileReader(File file)        创建字符输入流关联本地文件public FileReader(String pathname)  创建字符输入流关联本地文件第二步:读取数据public int read()                   读取数据,读到末尾返回-1public int read(char[] buffer)      读取多个数据,读到末尾返回-1第三步:释放资源public void close()                 释放资源/关流*///1.创建对象并关联本地文件FileReader fr = new FileReader("myio\\a.txt");//2.读取数据 read()//字符流的底层也是字节流,默认也是一个字节一个字节的读取的。//如果遇到中文就会一次读取多个,GBK一次读两个字节,UTF-8一次读三个字节//read()细节://1.read():默认也是一个字节一个字节的读取的,如果遇到中文就会一次读取多个//2.在读取之后,方法的底层还会进行解码并转成十进制。//  最终把这个十进制作为返回值//  这个十进制的数据也表示在字符集上的数字//  英文:文件里面二进制数据 0110 0001//          read方法进行读取,解码并转成十进制97//  中文:文件里面的二进制数据 11100110 10110001 10001001//          read方法进行读取,解码并转成十进制27721// 我想看到中文汉字,就是把这些十进制数据,再进行强转就可以了int ch;while((ch = fr.read()) != -1){System.out.print((char)ch);}//3.释放资源fr.close();}

带参数的Reader方法

    public static void main(String[] args) throws IOException {/*第一步:创建对象public FileReader(File file)        创建字符输入流关联本地文件public FileReader(String pathname)  创建字符输入流关联本地文件第二步:读取数据public int read()                   读取数据,读到末尾返回-1public int read(char[] buffer)      读取多个数据,读到末尾返回-1第三步:释放资源public void close()                 释放资源/关流*///1.创建对象FileReader fr = new FileReader("myio\\a.txt");//2.读取数据char[] chars = new char[2];int len;//read(chars):读取数据,解码,强转三步合并了,把强转之后的字符放到数组当中//空参的read + 强转类型转换while((len = fr.read(chars)) != -1){//把数组中的数据变成字符串再进行打印System.out.print(new String(chars,0,len));}//3.释放资源fr.close();}

FileWriter

构造方法

成员方法

书写细节

    public static void main(String[] args) throws IOException {//保存文件中的数据FileWriter fw = new FileWriter("javaseday28Io\\a.txt",true);//        fw.write(97);String st = "asd哈哈哈";
//        fw.write(st);
//        fw.write(st,2,4);char[] chars = {'a','c','b','你','好'};
//        fw.write(chars);fw.write(chars,1,4);fw.close();}

字符流的原理解析

输入流解析

    public static void main(String[] args) throws IOException {FileReader fr = new FileReader("myio\\b.txt");fr.read();//会把文件中的数据放到缓冲区当中//清空文件FileWriter fw = new FileWriter("myio\\b.txt");//请问,如果我再次使用fr进行读取//会读取到数据吗?//会把缓冲区中的数据全部读取完毕//正确答案://但是只能读取缓冲区中的数据,文件中剩余的数据无法再次读取int ch;while((ch = fr.read()) != -1){System.out.println((char)ch);}fw.close();fr.close();}
输出流解析

flush和close方法

    public static void main(String[] args) throws IOException {FileWriter fw = new FileWriter("myio\\a.txt");fw.write("我的同学各个都很厉害");fw.write("说话声音很好听");fw.flush();fw.write("都是人才");fw.write("超爱这里哟");fw.close();fw.write("B站");}

使用场景

综合练习

练习一:拷贝

public class Test {public static void main(String[] args) throws IOException {/*** 拷贝文件*///目标文件夹File f1 = new File("C:\\Users\\20724\\Desktop\\FileTest");File f2= new File("C:\\Users\\20724\\Desktop\\123");copyfile(f1,f2);}//复制方法private static void copyfile(File f1, File f2) throws IOException {//创建文件夹防止无法存放文件f2.mkdir();//使用递归的方法//遍历数组//判断File[] files = f1.listFiles();for (File file : files) {if (file.isFile()){FileInputStream fis = new FileInputStream(file);FileOutputStream fos = new FileOutputStream(new File(f2,file.getName()));int len;byte[] bytes = new byte[1024];while ((len = fis.read(bytes)) != -1){fos.write(bytes,0,len);}fos.close();fis.close();}else {//为文件夹进行递归copyfile(file,new File(f2,file.getName()));}}}
}

练习二:文件加密

public class Test {public static void main(String[] args) throws IOException {//文件加密,解密都可以使用只需要修改输入文件和输出文件FileInputStream fis = new FileInputStream("javaseday28Io\\cnpy.jpg");FileOutputStream fos = new FileOutputStream("javaseday28Io\\678.jpg");int len;while (( len = fis.read()) != -1){fos.write(len ^ 1920);}fos.close();fis.close();}
}

练习三:修改文件数据

方法一:
public class Test1 {public static void main(String[] args) throws IOException {//普通方法写//获取文件,读取数据FileReader fr = new FileReader("javaseday28Io\\a.txt");//接受数据StringBuilder sb = new StringBuilder();int len;while ((len = fr.read()) != -1){sb.append((char)len);}fr.close();String string = sb.toString();System.out.println();//修改数据//读去数据ArrayList<Integer> list = new ArrayList<>();String[] split = string.split("-");for (String s : split) {list.add(Integer.parseInt(s));}//修改数据Collections.sort(list);//写入数据//获取写入文件的地址FileWriter fw = new FileWriter("javaseday28Io\\b.txt");for (int i = 0; i < list.size(); i++) {if (i!=list.size()-1){fw.write(list.get(i)+"");fw.write("-");}else {fw.write(list.get(i)+"");}}fw.close();}
}
方法二:
public class Test2 {public static void main(String[] args) throws IOException {//普通方法写//获取文件,读取数据FileReader fr = new FileReader("javaseday28Io\\a.txt");//接受数据StringBuilder sb = new StringBuilder();int len;while ((len = fr.read()) != -1){sb.append((char)len);}fr.close();//修改数据//读去数据//使用Stream流进行操作Integer[] array = Arrays.stream(sb.toString().split("-"))//.map(new Function<String, Integer>() {//                    @Override//                    public Integer apply(String s) {//                        return Integer.parseInt(s);//                    }//                })//将String类型转换为Int类型,Map进行类型转换.map(Integer::parseInt).sorted().toArray(Integer[]::new);//写入数据//获取写入文件的地址FileWriter fw = new FileWriter("javaseday28Io\\b.txt");//将 , 的间隔符装换位 - 的间隔符String s = Arrays.toString(array).replace(", ","-");//将头尾的中括号剪裁掉String res = s.substring(1, s.length() - 1);fw.write(res);fw.close();}
}

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

Ping32加密利器 vs ipguard,企业数据防护的实战对比

在数字化时代&#xff0c;企业数据的安全防护已成为不可忽视的重要议题。随着数据泄露事件的频发&#xff0c;企业迫切需要采用高效、可靠的数据防泄漏解决方案来保护其敏感信息。Ping32和IP-Guard作为市场上备受瞩目的两款数据保护工具&#xff0c;各自以其独特的功能和优势赢…

深入分析几个难以理解的Comparator源码

1.分析comparing单参数方法 网上很多帖子说实话&#xff0c;不咋地&#xff0c;讲的不细节&#xff0c;抄来抄去&#xff0c;就让我这个大二的垃圾&#xff0c;给大家梳理一下Comparator这几个难以理解public static方法吧。 1.1函数式接口Function 这个函数是使用的函数式编程…

OrCAD使用,快捷键,全选更改封装,导出PCB网表

1 模块名称 2 快捷键使用 H: 镜像水平 V&#xff1a;镜像垂直 R: 旋转 I: 放大 O&#xff1a; 放小 P&#xff1a;放置元器件 W&#xff1a; 步线 B&#xff1a; 总线&#xff08;无电气属性&#xff09; E: 总线连接符&#xff08;和BUS一起用&#xff09…

图的应用(关键路径)

基于你设计的带权有向无环图&#xff0c;写出所有合法的关键路径&#xff0c;并算出关键路径总长度 文字描述&#xff1a;关键路径总长度的现实意义是什么&#xff1f; 1.关键路径 总长度454316 2.现实意义 从源点到汇点的所有路径中&#xff0c;具有最大路径长度的路径称…

如何选择OS--Linux不同Distribution的选用

写在前言&#xff1a; 刚写了Windows PC的不同editions的选用&#xff0c;趁热&#xff0c;把Linux不同的Distribution选用也介绍下&#xff0c;希望童鞋们可以了解-->理解-->深入了解-->深入理解--...以致于能掌握特定版本的Linux的使用甚者精通。……^.^…… so&a…

云手机的便捷性和安全性体现在哪?

随着5G技术的迅速发展&#xff0c;云手机在游戏、电商以及新媒体营销等领域中的应用日益广泛。它不仅能够显著降低成本、提升效率&#xff0c;还随着边缘计算和云技术的进步&#xff0c;展现出无限的增长潜力。 云手机的便捷性体现在哪里&#xff1f; 云手机的便捷性毋庸置疑。…

网关登录校验(2)----网关如何将用户信息传递给微服务

1.微服务获取用户信息 现在&#xff0c;网关已经可以完成登录校验并获取登录用户身份信息。但是当网关将请求转发到微服务时&#xff0c;微服务又该如何获取用户身份呢&#xff1f; 由于网关发送请求到微服务依然采用的是Http请求&#xff0c;因此我们可以将用户信息以请求头…

MySQL高阶1892-页面推荐2

目录 题目 准备数据 分析数据 总结 题目 您正在为一个社交媒体网站实施一个页面推荐系统。如果页面被user_id的 至少一个朋友喜欢 &#xff0c;而 不被user_id喜欢 &#xff0c;你的系统将 推荐 一个页面到user_id。 编写一个解决方案来查找针对每个用户的所有可能的 页面…

LTE和NR空口技术区别

LTE和NR空口技术区别

一起对话式学习-机器学习03——模型评估与模型选择

【一】前言 这一部分其实已在第二节中介绍到&#xff0c;这节起到回顾归纳的作用。 【二】训练误差与测试误差 首先&#xff0c;在分类问题中&#xff0c;有误差率和准确率两个概念&#xff0c;二者和为1。 误差率&#xff1a;分类错误的样本数占总数的比例。 其次&#xff0c…

【Node.js Vue】还在为选什么乐器发愁?乐器推荐系统帮你解决难题,基于用户行为分析的智能推荐,让你不再为音乐器材烦恼

&#x1f34a;作者&#xff1a;计算机毕设匠心工作室 &#x1f34a;简介&#xff1a;毕业后就一直专业从事计算机软件程序开发&#xff0c;至今也有8年工作经验。擅长Java、Python、微信小程序、安卓、大数据、PHP、.NET|C#、Golang等。 擅长&#xff1a;按照需求定制化开发项目…

用AI制作专属欧美漫画头像!FLUX大模型-漫画情侣lora应用教程

​ ​ 新上线了一个漫画风格的lora《漫画情侣&#xff08;欧美黄金时代风&#xff09;v1.0》 感兴趣的朋友可以去下载使用&#xff0c;下载是免费的。 下面跟大家说一下这个lora的特点、使用方法以及这个lora的延伸应用&#xff1a;欧美漫画头像制作 lora风格特点 欧美漫画/人…

【2024/09/20更新】植物大战僵尸杂交版V2.5下载

植物大战僵尸杂交版V2.5 2.5版本更新公告&#xff1a; 增加新关卡– 益智模式–两面夹击模式关卡 挑战模式关卡 增加新铲子–骷髅铲子 --银币购买-挖掉植物触发亡语或召唤骷髅僵尸 增加新植物– 4张白卡植物-通过两面夹击获得 2张金卡植物和4张星卡植物 游戏调整– 调整…

单片机——ADC采样

1、什么是ADC采样&#xff1f; ADC是指将模拟信号转换成数字信号的过程。通俗理解ADC采样就是采集电路中的电压&#xff0c;通过数值的方式表现出来。以STM32F103系列为例&#xff0c;它可以反应0~4095&#xff0c;换句话说&#xff0c;它采集的电压数值上表现为0~4095&#xf…

动态线程池(四)

动态线程池 dtp生命周期管理 生命周期相关类图 DtpExecutor EagerEtpExecutor OrderedDtpExecutor TaskWrapper任务包装器 MdcRunnable TaskWrappers NotifyEnum NoticeManager通知管理器 InvokerChain调用链

Unborn安装CUDA Toolkit 12.2

Unborn安装CUDA Toolkit 12.2 Unborn安装CUDA Toolkit前言下载安装配置验证 Unborn安装CUDA Toolkit 前言 今天在某台Unborn系统上安装某个依赖库时&#xff0c;提示环境中缺少CUDA_HOME环境变量&#xff0c;导致在安装某些依赖时出现问题。具体异常如下&#xff1a; Lookin…

什么是大数据?一文讲清大数据的概念、演进、趋势、产业链及关键技术!

前言 数字经济浪潮下&#xff0c;数据已成为当今最为核心的资源之一&#xff0c;数据成为推动企业和社会发展、转型、创新的新型生产要素。 大数据这个词&#xff0c;不管您是不是相关行业的从业者&#xff0c;也都听过无数遍了&#xff0c;但对于大多数人来说&#xff0c;并…

共享单车轨迹数据分析:以厦门市共享单车数据为例(五)

先来聊聊啥是共享单车电子围栏&#xff1f; 共享单车电子围栏是一种基于地理位置技术的虚拟边界&#xff0c;用于管理和规范共享单车的停放和使用。这种技术通过在地图上划定特定区域&#xff0c;帮助用户了解哪些地方可以停车&#xff0c;哪些地方不能停车&#xff0c;从而减…

博导团队指导、解读实验结果、SCI论文润色

表观组&#xff1a; DAP-seq:转录因子-DNA互作研究工具 ATAC-seq :染色质开放程度研究工具 H3K4me3 ChIP-seq:组蛋白甲基化修饰工具 BS-seq :DNA甲基化研究工具 H3K27ac ChIP-seq:组蛋白乙酰化修饰研究工具 Cut&Tag:转录因子研究工具 ChIP-seq:转录因子-DNA互作工具 互作组…

HarmonyOS学习(十三)——数据管理(二) 关系型数据库

文章目录 1、基本概念2、运行机制3、默认配置与限制4、接口说明5、实战&#xff1a;开发“账本”5.1、创建RdbStore5.2、创建数据库5.3、增加数据5.4、删除数据5.5、修改数据5.6、查询数据5.7、备份数据库5.8、恢复数据库5.9、删除数据库 官方文档地址&#xff1a; 通过关系型…