《JavaSE-第十五章》之文件(二)

news/2024/4/28 18:33:56/文章来源:https://blog.csdn.net/qq_60308100/article/details/127530442

前言

在你立足处深挖下去,就会有泉水涌出!别管蒙昧者们叫嚷:“下边永远是地狱!”

博客主页:KC老衲爱尼姑的博客主页

博主的github,平常所写代码皆在于此

刷题求职神器

共勉:talk is cheap, show me the code

作者是爪哇岛的新手,水平很有限,如果发现错误,一定要及时告知作者哦!感谢感谢!


File(二)

文章目录

  • File(二)
    • 转换流
    • 打印流
      • 输出语句重定向
      • 序列化
      • 对象序列化
      • 对象反序列化
      • 序列化ID
          • 序列化ID的作用
    • commons-io

转换流

由于文件编码与代码文件编码不一致,从而会导致乱码,为了解决上述问题,可以使用转换流,在将数据输入和输出时指定流的编码格式与文件的编码格式保持一致。

字符输入转换流

字符输入转换流:InputStreamReader,可以把原始的字节流按照指定编码转换成字符输入流。

构造器说明
public InputStreamReader(InputStream is ,String charset)可以把原始的字节流按照指定编码转换成字符输入流,这样字符流中的字符就不乱码了

代码示例

package com.kc.system.io;import java.io.*;public class InputStreamReaderDemo01 {//代码UTF-8public static void main(String[] args) throws Exception {InputStream is = new FileInputStream("./bbb.txt");//GBK// 把原始字节流转换成字符输入流// Reader isr = new InputStreamReader(is); // 默认以UTF-8的方式转换成字符流。 还是会乱码的  跟直接使用FileReader是一样的Reader isr = new InputStreamReader(is , "GBK"); // 以指定的GBK编码转换成字符输入流  完美的解决了乱码问题BufferedReader br = new BufferedReader(isr);String line;while ((line = br.readLine()) != null){System.out.println(line);}}
}

字符输出转换流
字符输入转换流:OutputStreamWriter,可以把字节输出流按照指定编码转换成字符输出流。

构造器说明
public OutputStreamWriter(OutputStream os,String charset)可以把原始的字节输出流按照指定编码转换成字符输出流(重点)

代码示例

package com.kc.system.io;public class OutputStreamWriterDemo02 {public static void main(String[] args) throws Exception {// 1、定义一个字节输出流OutputStream os = new FileOutputStream("./bbb.txt");// 2、把原始的字节输出流转换成字符输出流// Writer osw = new OutputStreamWriter(os); // 以默认的UTF-8写字符出去 跟直接写FileWriter一样Writer osw = new OutputStreamWriter(os , "GBK"); // 指定GBK的方式写字符出去// 3、把低级的字符输出流包装成高级的缓冲字符输出流。BufferedWriter bw = new BufferedWriter(osw);bw.write("今天天气真好");bw.write("今天天气真好");bw.write("今天天气真好");bw.close();}
}

打印流

打印流可以实现方便、高效的打印数据到文件中去。打印流一般是指:PrintStream,PrintWriter两个类。这两个类分类继承FilerOutStream,Writer。打印流可以看做是输出流的升级版。可以实现打印什么数据就是什么数据,例如打印整数97写出去就是97,打印boolean的true,写出去就是true,打印Hello World,写出去就是Hello World。

PrintStream构造器

构造器说明
public PrintStream(OutputStream os)打印流直接通向字节输出流管道
public PrintStream(File f)打印流直接通向文件对象
public PrintStream(String filepath)打印流直接通向文件路径

方法

方法说明
public void print(Xxx xx)打印任意类型的数据出去

PrintWriter构造器

构造器说明
public PrintWriter(OutputStream os)打印流直接通向字节输出流管道
public PrintWriter (Writer w)打印流直接通向字符输出流管道
public PrintWriter (File f)打印流直接通向文件对象
public PrintWriter (String filepath)打印流直接通向文件路径

方法

方法说明
public void print(Xxx xx)打印任意类型的数据出去

代码示例

package com.kc.system.io;import java.io.*;/*** PrintWriter 继承Writer* PrintStream 继承自FilerOutStream*/
public class PrintDemo {public static void main(String[] args) throws FileNotFoundException {//可追加数据
//        PrintStream ps= new PrintStream(new FileOutputStream("bbb.txt",true));
//        ps.println("Hello World");
//        ps.print("今天是10月25日");
//        ps.close();//PrintStream和PrintWriter的使用方式几乎一样PrintWriter pw= new PrintWriter("bbb.txt");pw.println("今天天气真好");pw.println(12);pw.println(12.09);pw.println('a');pw.println(true);pw.println(97);pw.close();}
}

输出语句重定向

重定向:可以将输出语句打印位置改为某个文件

代码示例

package com.kc.system.io;import java.io.FileNotFoundException;
import java.io.PrintStream;/*** PrintStream 继承自FilerOutStream*/
public class PrintDemo2 {public static void main(String[] args) throws FileNotFoundException {System.out.println("我为如来,又有何惧?");System.out.println("相遇皆是缘缘尽莫强求。");//重定向到bbb.txt文件PrintStream ps = new PrintStream("bbb.txt");//改变语句的重定向System.setOut(ps);System.out.println("他宁愿死,也不肯输。");System.out.println("如来是什么,如是道来。");}
}

上述重定向前

重定向后

在这里插入图片描述

序列化

对象序列化

序列化:以堆内存为基准,将生活在这上面的对象,通过某种的方式,以二进制的形式保存到硬盘上。
在这里插入图片描述

对象序列化API

使用对象字节输出流:ObjectOutStream

ObjectOutStream构造器

构造器说明
public ObjectOutputStream(OutputStream out)把低级字节输出流包装成高级的对象字节输出流

ObjectOutStream方法

方法说明
public final void writeObject(Object obj)把对象写出去到对象序列化流的文件中去

对象反序列化

反序列化:以堆内存为基准,将存放在硬盘上的对象数据还原对象。

在这里插入图片描述

反序列化

使用对象字节输入流:ObjectInputStream

ObjectInputStream构造方法

构造器说明
public ObjectInputStream(InputStream out)把低级字节输如流包装成高级的对象字节输入流

反序列化的方法

方法说明
public Object readObject()把存储到磁盘文件中去的对象数据恢复成内存中的对象返回

序列化ID

通常在序列化的时候会给类加上一个字段serialVersionUID,这个字段就是序列化ID

private static final long serialVersionUID = -4985775903060349049L;
序列化ID的作用

序列化ID是为了保证能够成功反序列化的成功,在进行反序列化的过程中,JVM会将来自输入流的当中的序列化ID和本地实体类的ID进行,若ID相同则说明保存在硬盘上的对象数据是该类所实例化的对象,反之则不能反序列化成功。如果在类中没有手动添加一个序列化ID,编译时会默认分配一个序列化ID,这样就会导致一个问题,那就是如果我们再次向类中添加字段时,重新编译就意味着重新分配一个序列化ID,假设没有添加字段前序列化后的对象数据为版本一,添加字段后,再次反序列化,此时由于实体类和序列化对象的ID不一致,就会导致序列化失败,为了解决上述问题可以一开始就手动添加一个类型为long的serialVersionUID,值保证不变,这种情况下,无论后序对类进行修改,编译时,总是使用自己手动加的,就不会出现反序列化失败了。

SerializeUtil

将上述序列化以及反序列化的方法封装成一个工具类,以便后续重复使用。

package com.kc.system.io;import java.io.*;public class SerializeUtil {//序列化,将对象转换成二进制public static void saveObject(Object object) throws IOException {ObjectOutputStream oos = null;OutputStream out = null;try{out = new FileOutputStream("D:/demo.txt");oos = new ObjectOutputStream(out);oos.writeObject(object);} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}finally{out.close();oos.close();}}//反序列化,还原成对象public static  Object readObject() throws IOException {ObjectInputStream ois = null;InputStream is = null;try {is = new FileInputStream("D:/demo.txt");ois = new ObjectInputStream(is);Object object = ois.readObject();return object;} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();} catch (ClassNotFoundException e) {e.printStackTrace();}finally{is.close();ois.close();}return null;}
}

Student

Studne类必须实现Serializable,Studnet才可以被序列化。Serializable一个空接口,可以将其视为可以序列化的标志。

package com.kc.system.io;import lombok.Data;import java.io.Serializable;@Data
public class Student implements Serializable {private String name;private int age;private String address;private String school;
}

对Studnet序列化和反序列化

package com.kc.system.io;import java.io.IOException;public class SerializeUtilDemo {public static void main(String[] args) throws IOException {Student s = new Student();s.setName("叶秋涵");s.setAge(18);s.setAddress("北海");s.setSchool("哔哩哔哩");SerializeUtil.saveObject(s);System.out.println("序列化完成了");System.out.println("-----");Student student = (Student)SerializeUtil.readObject();System.out.println(student);}
}

Student序列化结果

在这里插入图片描述

Studnent反序列化结果

在这里插入图片描述

向Student中添加weight字段

package com.kc.system.io;import lombok.Data;import java.io.Serializable;@Data
public class Student implements Serializable {private String name;private int age;private String address;private String school;private double weight;
}

再次反序化

package com.kc.system.io;import java.io.IOException;public class SerializeUtilDemo {public static void main(String[] args) throws IOException {Student student = (Student)SerializeUtil.readObject();System.out.println(student);}
}

控制台异常

java.io.InvalidClassException: com.kc.system.io.Student; local class incompatible: stream classdesc serialVersionUID = -2853823296530063815, local class serialVersionUID = 6312346039733332667//流中的ID与本地的类中ID不一致

解决异常

向类中添加serialVersionUID

private static final long serialVersionUID = -4985775903060349049L;

再次序列化覆盖上一个版本的对象数据,然后再反序列化

示例代码

package com.kc.system.io;import java.io.IOException;public class SerializeUtilDemo {public static void main(String[] args) throws IOException {Student s = new Student();s.setName("叶秋涵");s.setAge(18);s.setAddress("北海");s.setSchool("哔哩哔哩");SerializeUtil.saveObject(s);System.out.println("序列化完成了");System.out.println("-----");Student student = (Student)SerializeUtil.readObject();System.out.println(student);}
}
//运行结果
//序列化完成了
//-----
//Student(name=叶秋涵, age=18, address=北海, school=哔哩哔哩, weight=0.0)

再向Studnet中添加一个gender字段,在执行上述的代码就不会出异常了

在这里插入图片描述

properties

Properties是一个存储键值对数据的文件对象,该文件后缀为.properties。

构造器说明
void load(Reader reader)从输入字符流读取属性列表(键和元素对)
void store(Writer writer, String comments)将此属性列表(键和元素对)写入此 Properties表中,以适合使用 load(Reader)方法的格式写入输出字符流
void load(InputStream inStream)从输入字节流读取属性列表(键和元素对)
void store(OutputStream out, String comments)将此属性列表(键和元素对)写入此 Properties表中,以适合于使用 load(InputStream)方法的格式写入输出字节流
public Object setProperty(String key, String value)保存键值对
public String getProperty(String key)使用此属性列表中指定的键搜索属性值 (get)
public Set stringPropertyNames()所有键的名称的集合 (keySet())

首先创建一个user.properties,再向user.properties文件中添加是数据

package com.kc.system.io;import java.io.FileWriter;
import java.io.IOException;
import java.util.Properties;public class PropertiesDemo1 {public static void main(String[] args) throws IOException {Properties properties = new Properties();properties.setProperty("admin","123456");properties.setProperty("name","叶秋涵");properties.setProperty("pwassword","123456");System.out.println(properties);properties.store(new FileWriter("./user.properties"),"用户信息");//该文件必须是存在的}
}

从user.properties获取数据

package com.kc.system.io;import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.Properties;
import java.util.Set;public class PropertiesDemo2 {public static void main(String[] args) throws IOException {//读取properties文件中的键值对信息Properties properties = new Properties();System.out.println(properties);//加载属性文件中的键值对数据到属性对象properties中去properties.load(new FileReader("./user.properties"));System.out.println(properties);String name = properties.getProperty("name");System.out.println(name);String admin = properties.getProperty("admin");System.out.println(admin);String pwassword = properties.getProperty("pwassword");System.out.println(pwassword);//获取配置文件中所有的键Set<String> str = properties.stringPropertyNames();for (String s : str) {System.out.print(s+" ");}}
}

commons-io

commons-io是apache开源基金组织提供的一组有关IO操作的类库,就是对常见文件操作的封装,如文件的复制,删除,移动等。可以大的的提高效率。commons-io工具包提供了很多有关io操作的类。有两个主要的类FileUtils, IOUtils。

方法

方法说明
String readFileToString(File file, String encoding)读取文件中的数据, 返回字符串
void copyFile(File srcFile, File destFile)复制文件
void copyDirectoryToDirectory(File srcDir, File destDir)复制文件夹

maven依赖

commons-io commons-io 2.6

代码示例

package com.kc.system.io;import org.apache.commons.io.FileUtils;
import org.apache.commons.io.IOUtils;import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;public class FileUtilsDemo {public static void main(String[] args) throws IOException {//完成文件的复制IOUtils.copy(new FileInputStream("./bbb.txt"), new FileOutputStream("./bbb2.txt"));//完成文件复制到某个文件夹下FileUtils.copyFileToDirectory(new File("D:/picture/1.jpg"),new File("D:/tools"));//完成文件夹复制到某个文件夹下FileUtils.copyDirectoryToDirectory(new File("D:/picture"),new File("D:/tools"));//读取文件中的数据String str = FileUtils.readFileToString(new File("./bbb.txt"),"UTF-8");System.out.println(str);//复制文件FileUtils.copyFile(new File("./bbb.txt"),new File("./bbb3.txt"));//删除文件夹FileUtils.deleteDirectory(new File("D:/demo"));}  
}

最后的话

各位看官如果觉得文章写得不错,点赞评论关注走一波!谢谢啦!

在这里插入图片描述

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

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

相关文章

neovim图标显示乱码,utf8字体显示乱码(Windows10和Centos安装nerd-fonts)

前言 作为一名想成为大神的菜鸟程序员&#xff0c;一个牛X的代码编辑环境是必不可少的&#xff0c;在这里我推荐neovim和emacs。我使用的是neovim&#xff0c;github上有neovim-from-scratch工程可以一步一步学习搭建&#xff0c;B站上也有相关视频可供学习&#xff0c;在这里…

升级python环境时gdal出现缺少proj的问题

gdal在做坐标转换时报出如此的错误。原系统的代码没有改变&#xff0c;为了更新sentinelhub包&#xff0c;将python环境由3.6升级至3.7。升级了python环境之后&#xff0c;所有相关的py包和第三方库重新进行安装。安装过程中基本没有遇到问题。但是在运行代码时gdal报出错误。 …

IDEA全局搜索快捷键方法

1、CtrlN 按名字搜索类 相当于eclipse的ctrlshiftR&#xff0c;输入类名可以定位到这个类文件&#xff0c;就像IDEA在其他的搜索部分表现一样&#xff0c;搜索类名也能对你所要搜索的内容多个部分进行匹配&#xff0c;而且如果能匹配的自己写的类&#xff0c;优先匹配自己写的类…

java实验报告4;

一、实验目的:【目的要求】 了解接口和抽象类的使用 熟悉类中成员的定义及权限的设定 掌握完整类的设计 【注意事项】 注意电源插座的用电安全&#xff1b; 遵守计算机的使用注意事项&#xff1b; 防范病毒。 二、使用工具 电脑 window系统 JDK环境 eclipse开发环境…

本博主二哈喇子!特此声明

免责声明 本博主二哈喇子&#xff01;为了避免各种纠纷&#xff0c;特做如下说明: 本博主一向尊重他人的知识产权&#xff0c;同时也注意保护自己的知识产权&#xff0c;因此建议您在进入本博客的各个页面前&#xff0c;请务必仔细阅读本声明。 一切网民以任何方式在进入本博客…

模拟登陆系统

1.问题 日常生活中我们会遇到许多需要密码来登陆账户的场景&#xff0c;如何使用Java来创建此类登陆代码呢&#xff1f; 2.方法 import java.util.Scanner; public static void main (String[] args) { Scanner sc new Scanner (System.in); int count 3; while(cou…

控制“恶意”代码,安全运行沙箱类技术崛起

据CNNIC的最新估算&#xff0c;截至10月31日&#xff0c;我国上网用户人数达到5800万&#xff0c;上网计算机数升至2300万&#xff0c;从七月份至今&#xff0c;在短短的四个月间分别增加了1220万和687万。 这预示着我国互联网在经过一段时间的发展低潮之后正在开始回暖。 但…

贪婪算法(Huffman编码)

如果一个算法分阶段的工作&#xff0c;并且在每一个阶段都认为所做的决定是最好的&#xff0c;而不考虑将来的后果&#xff0c;这样的算法就叫做贪婪算法。贪婪算法只考虑当前局部的最优解&#xff0c;而不去考虑全局的情况&#xff0c;如果最终得到的结果是全局最优的&#xf…

【pytest官方文档】解读- 开发可pip安装的第三方插件

在上一篇的 hooks 函数分享中,开发了一个本地插件示例,其实已经算是在编写插件了。今天继续跟着官方文档学习更多知识点。 一个插件包含一个或多个钩子函数,pytest 正是通过调用各种钩子组成的插件,实现了配置、搜集、运行和报告的所有方面的功能。 通常 pytes t中的插件有…

OS实战笔记(7)-- Linux同步机制

上一篇笔记中对x86平台上原子变量、关中断、自旋锁和信号量的原理做了复习&#xff0c;本笔记回顾一下Linux使用的几种常用的同步机制。 Linux上的原子变量 Linux上提供了一个atomic_t类型表示原子变量。32位和64位版本的结构体定义如下&#xff1a; typedef struct {int coun…

文件描述符0,1,2+lseek()+共享文件覆盖解决

1.文件描述符0&#xff0c;1&#xff0c;2 程序开始运行时&#xff0c;有三个文件被自动打开&#xff0c;打开时分别使用了这三个文件描述符依次打开的三个文件分别是 /dev/stdin&#xff0c;/dev/stdout&#xff0c;/dev/stderr /dev/stdin 标准输入文件 程序开始运行时&…

requests模块和openpyxl模块

第三方模块的下载和使用 1,第三方模块就是别人大神们已经写好的模块,功能特别强大。我们如果像使用第三方模块就先要进行下载。下载完成后 才可以在python中直接调用2.下载方式一:pip工具pip工具注意每个解释器都有pip工具 如果我们的电脑上有多个版本的解释器那么我们在使用…

模型交易平台--信用卡客户消费行为分析

业务问题&#xff1a; 据《中国银行卡产业发展蓝皮书&#xff08;2021&#xff09;》显示&#xff0c;截至2020年末&#xff0c;中国信用卡累计发卡量为11.3亿张&#xff0c;其中6个月内有使用记录的活卡为7.4亿张&#xff0c;有近4亿张信用卡处于“睡眠”状态。 睡眠信用卡…

【JUC】12.读写锁与StampedLock[完结]

文章目录1. 什么是读写锁2. 锁的演化历程3. 锁降级4. 锁降级的策略5. StampedLock简介6. StampedLock的特点7. StampedLock之传统读写8. StampedLock之乐观锁9. StampedLock缺点1. 什么是读写锁 读写锁是指ReentrantReadWriteLock类 该类能被多个读线程访问或者一个写线程访问…

第二节:数据类型与变量【java】

目录 &#x1f4c3;前言 &#x1f4d7;1.数据类型 &#x1f4d5;2. 变量 2.1 变量概念 2.2 语法格式 &#x1f4d9;3.整型变量 3.1 整型变量 3.2 长整型变量 3.3 短整型变量 3.4 字节型变量 &#x1f4d8;4.浮点型变量 4.1 双精度浮点型 4.2 单精度浮点型 &#…

拓端tecdat|用Python进行图像模糊处理和特征提取

全文链接&#xff1a;http://tecdat.cn/?p9015 原文出处&#xff1a;拓端数据部落公众号 在本文中&#xff0c;我将带您了解图像处理的一些基本功能。特征提取。但是这里我们需要更深入的数据清理。但是数据清理是在数据集&#xff0c;表格&#xff0c;文本等上完成的。如何在…

vue使用canvas实现手写电子签名;vue使用vue-esign插件实现手写电子签名;H5使用画布签名

功能&#xff1a; 1.兼容 PC 和 Mobile&#xff1b; 2.画布自适应屏幕大小变化&#xff08;窗口缩放、屏幕旋转时画布无需重置&#xff0c;自动校正坐标偏移&#xff09;&#xff1b; 3.自定义画布尺寸&#xff08;导出图尺寸&#xff09;&#xff0c;画笔粗细、颜色&#xff0…

Arduino UNO 可视化GT-24工业级无线透传

Arduino UNO 可视化GT-24工业级无线透传一、前言二、硬件要求三、参数基础四、原理剖析五、透传思路六、程序概要七、arduino使用接线八、成果展示一、前言 无线透传市面上较为常见的是基于蓝牙、esp的多种透传模块&#xff0c;今天介绍的则是用NRF24L01芯片构成的电路。&…

Python第七章作业

实例一: class Geese: 大雁类 def __init__(self,beak,wing,claw): print("我是大雁类!我有以下特征:") print(beak) print(wing) print(claw) def fly(self,state): print(state)**********调用方法**********beak_…

MyBatis中的reflection包(一)ObjectFactory,PropertyTokenizer, Invoker, Reflector

内容概要 reflection是MyBatis关于反射的工具包&#xff0c;是实现其它功能的基石之一。这里我不准备贴上源码然而逐行解释&#xff0c;而是从需求分析的角度来复现。 ObjectFactory 现在有这样的需求&#xff1a;给你一个Class对象&#xff0c;要求你创建它的实例&#xff…