Java基础知识点(IO流)

文章目录

  • 序列化和反序列化
  • IO流
    • IO流的简介和分类
    • Java IO流四大家族
    • 要掌握的16个流
      • 文件专属
        • java.io.FileInputStream,字节输入流
        • java.io.FileOutputStream,字节输出流,
        • java.io.FileReader(文件字符输入流)
        • java.io.FileWriter(文件字符输入流)
      • 转换流(将字节流转换成字符流)
      • 缓冲流专属
        • java.io.BufferedReader,带有缓冲区的字符输入流
        • java.io.BufferedWriter,带有缓冲去的字符输入流
        • java.io.BufferedInputStream
        • java.io.BufferedOutputSteam
      • 数据流专属
        • java.io.DataInputStream,数据字节写入流
        • java.io.DataOutputStream,数据字节输出流
      • 标准输出流
        • java.io.PrintWriter,标准字节输出流
        • java.io.PrintStream
      • 对象流
        • java.io.ObjectInputStream
        • java.io.ObjectOutputStream

序列化和反序列化

  1. 序列化:Serialize ,将内存中的Java对象存储到文件中的过程

Java实现序列化有两种方式:

  • 实现serializable接口:直接实现Serializable接口的类是JDK自动把这个类的对象序列化
  • 实现externaliazble接口:如果实现public interface Externalizable extends Serializable的类则可以自己控制对象的序列化,建议能让JDK自己控制序列化的就不要让自己去控制

transient关键字修饰的属性是透明的,序列化时候就不需要考虑这个属性了

  1. 反序列化:DeSerialize,将文件中的数据重新读取到内存中,恢复成Java对象的过程

  2. Java是通过什么机制来确定是否是一个类的?
    第一,首先通过类名来确定,类名不一样,肯定不是一个类。
    第二,类名一样,通过序列化版本号进行区分。

IO流

IO流的简介和分类

通过IO可以完成硬盘文件的读和写,IO流又称输入输出流,输入和输出均是以内存作为参照。IO流按照流的方向可以分为:输入(读),输出(写)。按照读取数据方式不同进行分类:

  1. 字节流: 按照字节的方式读取数据,一次读写一个字节(Byte),等同于一次读取8个二进制位,这种流是万能的,什么文件都可以读取,包括:文本文件,图片,声音文件,视频文件等。
    例如: a中国bo账单fe
    第一次读取,一个字节,刚好读取‘a’,
    第二次读取,一个字节,读取”中“字符的一半,
    第三次读取,一个字节,读取”中“字符的另一半

  2. 字符流: 按照字符的方式读取数据,一次读取一个字符,这种流是为了方便普通文本文件而存在的,字符流不能读取图片、声音、视频文件。只能读取存文本文件。
    例如:a中国bo账单fe
    第一次读取,‘a’字符,
    第二次读取,‘中’字符

  3. 节点流、包装流(处理流):
    节点流:当一个流的构造方法需要一个流的时候,这个被传入的流就叫做节点流。
    包装流(处理流):外部负责包装的流就叫做包装流,也称为处理流。
    包装流关闭资源时候,只需要关闭外部包装流即可,内部节点流会自动关闭。

Java IO流四大家族

Java IO有四大家族,均是抽象类,分别是:
java.io.InputStream :字节输入流
java.io.OutputStream: 字节输出流
java.io.Reader:字符输入流
java.io.Writer:字符输出流

所有流均实现了java.io.Closeable接口,都是可关闭的,都有close()方法。
所有输出流也实现了java.io.Flushable接口,都是可刷新的, 都有flush()方法,输入流输出之后,一定要进行flush()操作,保证将管道、通道中剩余未输出的数据输出完成,清空管道。

Java中类名以”Stream“结尾的都是字节流,以”Reader、Weiter“结尾的都是字符流。

要掌握的16个流

文件专属

java.io.FileInputStream,字节输入流

任何形式文件都能读取,但是一个字节一个字节的读取,内存和硬盘的交互太频繁了,所以一般采取一次读取一个字节数组(byte[])的方式进行读取。

int read():一次读取一个字节,读取长度为-1时候,就是最后一次读取
int read(byte[] b): 一次读取b.length个字节,当读取长度小于b.length时候,就是最后一次读取
int available(): 返回六种剩余没有读取的字节数量
long skip(long n):跳过几个字节不读

 	FileInputStream fileInputStream = null;try{fileInputStream = new FileInputStream("C:\\Users\\Administrator\\Desktop\\temp.txt");// 准备读取byte数组,一次读取4个字节byte[] bytes = new byte[1024];// 定义读取长度int readCount;while((readCount = fileInputStream.read(bytes))!=-1) {System.out.println(new String(bytes,0,readCount));}}catch (Exception e) {e.printStackTrace();}finally {// 关闭流if(fileInputStream != null) {try {fileInputStream.close();} catch (IOException e) {e.printStackTrace();}}}
java.io.FileOutputStream,字节输出流,

负责写,从内存到硬盘,为了减少内存和硬盘的交互,一般也是采用一次写入一个字节数据(byte[])方式进行写入。以不清空源文件的方式写入,要选择追加的方式写入们需要在创建对象时候设置参数true,用来表示追加写入。

FileOutputStream fileOutputStream = null;try{// 设置true 表示追加fileOutputStream = new FileOutputStream("C:\\Users\\Administrator\\Desktop\\temp.txt",true);// 定义写入数组//byte[] bytes = new byte[1024];String s = "FileOutputStreamDemo" + Calendar.getInstance();fileOutputStream.write(s.getBytes());}catch (Exception e) {e.printStackTrace();}finally {try {fileOutputStream.flush();fileOutputStream.close();} catch (IOException e) {e.printStackTrace();}}
java.io.FileReader(文件字符输入流)
FileReader reader = null;
try{// 创建文件字符输入流reader = new FileReader("C:\\Users\\Administrator\\Desktop\\temp.txt");// 开始读char[] chars = new char[10];int readCounts = 0;while((readCounts = reader.read(chars)) != -1){System.out.print(new String(chars,0,readCounts));}}catch (Exception e){e.printStackTrace();}finally {try {reader.close();} catch (IOException e) {e.printStackTrace();}}
java.io.FileWriter(文件字符输入流)
 FileWriter out = null;try {// 初始化一个文件字符输出流对象out = new FileWriter("C:\\Users\\Administrator\\Desktop\\temp03.txt",true); // 不想清空一直累加的话  可以在此处加true// 开始写char[] chars = {'我','是','中','国','人'};// 刷新out.write(chars);out.write(chars,0,2);out.write("我是一名java工程师!");}catch (Exception e) {e.printStackTrace();}finally {try {out.flush();out.close();} catch (IOException e) {e.printStackTrace();}}

转换流(将字节流转换成字符流)

  • java.io.InputStreamReader

  • java.io.OutputStreamWriter

缓冲流专属

java.io.BufferedReader,带有缓冲区的字符输入流

使用的时候不需要创建数组了,自带缓冲区

FileReader fileReader = null;BufferedReader bufferedReader = null;try{fileReader = new FileReader("C:\\Users\\Administrator\\Desktop\\temp01.txt");// 当一个流的构造方法中需要一个流的时候,这个被传进来的流叫做: 节点流.// 外部负责包装的这个流,叫做:包装流,还有一个名字叫做 : 处理流// 像当前这个程序来说: FileReader就是一个节点流。BufferedReader就是包装流/处理流。bufferedReader = new BufferedReader(fileReader);String s ;while((s = bufferedReader.readLine())!=null){System.out.println(s);}}catch (Exception e ) {e.printStackTrace();} finally {// 关闭流// 对于包装流来说,只需要关闭最外层流就行,里面的节点流会自动关闭!try {bufferedReader.close();} catch (IOException e) {e.printStackTrace();}}
java.io.BufferedWriter,带有缓冲去的字符输入流
BufferedWriter bw = null;
try{bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("C:\\Users\\Administrator\\Desktop\\temp04.txt",true)));bw.write("hello world");bw.write("\n");bw.write("xxliao");
}catch (Exception e){e.printStackTrace();
}finally {try {bw.flush();// 关闭最外层bw.close();}catch (Exception e) {e.printStackTrace();}
}
java.io.BufferedInputStream
java.io.BufferedOutputSteam

数据流专属

java.io.DataInputStream,数据字节写入流

对于DataOutputStream写入的文件,只能使用DataInputStream去读取,并且读的时候需要提前知道写入的顺序,只有写和读取的顺序一致,才能正确取出数据。

 DataInputStream dis = new DataInputStream(new FileInputStream("data"));// 开始读Byte b = dis.readByte();Short s = dis.readShort();int i = dis.readInt();Float f = dis.readFloat();Boolean sex = dis.readBoolean();Double d = dis.readDouble();System.out.println(b);System.out.println(s);System.out.println(i);System.out.println(f);System.out.println(sex);System.out.println(d);
java.io.DataOutputStream,数据字节输出流

这个流可以将数据、以及该数据的数据类型一同写入文件,但是这个文件不是普通的文本文件。

 // 创建数据专属的字节输出流DataOutputStream dos = new DataOutputStream(new FileOutputStream("data"));// 写数据byte b =100;short s =200;int i =300;long l = 400L;float f =3.0f;double d = 3.14;boolean sex = false;char c = 'a';// 写dos.writeByte(b);dos.writeShort(s);dos.writeInt(i);dos.writeFloat(f);dos.writeBoolean(sex);dos.writeDouble(d);dos.flush();dos.close();

标准输出流

java.io.PrintWriter,标准字节输出流

默认输出到控制台上,也就是System.out.println()方法

PrintStream ps = null;
try {// 指向一个日志文件ps = new PrintStream(new FileOutputStream("C:\\Users\\Administrator\\Desktop\\log.txt",true));// 改变流的输出方向System.setOut(ps);// 获取系统当前时间Date nowTime = new Date();// 日期格式化SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss SSS");String strTime = sdf.format(nowTime);System.out.println(strTime+": "+msg);} catch (FileNotFoundException e) {e.printStackTrace();}finally {ps.close();}
java.io.PrintStream

对象流

java.io.ObjectInputStream
 ObjectInputStream ois = new ObjectInputStream(new FileInputStream("students"));// 开始反序列化  从硬盘中读到内存当中Object obj = ois.readObject();// 反序列化回来是一个学生对象  所以会调用学生对象的toString方法System.out.println(obj);ois.close();
  ObjectInputStream oos = new ObjectInputStream(new FileInputStream("users"));// 自己测试的时候  用 instanceOf 判断过返回的对象是 list集合List<User> userList = (List<User>)oos.readObject();for(User user : userList){System.out.println(user);}oos.close();
java.io.ObjectOutputStream
// 实现可序列化的接口 接口中无任何内容 只是一个标志性接口
public class Student implements Serializable {/*** Java虚拟机看到Serializable接口后,会自动生成一个序列化版本号* 这里没有手动写出来,java虚拟机会吗,默认提供这个序列化版本号* 建议将序列化版本号写出来,不建议自动生成*/private static  final long serialVersionUID = 1L; // 手动写出序列化版本号private int no;private String name;// 过了很久,Student这个类源代码改动了// 源代码改动之后,需要重新编译,编译之后生成了全新的字节码文件。// 并且class文件再次运行的时候,java虚拟机生成的序列化版本号也会发生相应的改变。private int age;
}
// 创建java对象Student s = new Student(111, "张三");// 序列化ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("students"));// 序列化对象oos.writeObject(s);// 刷新oos.flush();// 关闭oos.close();

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

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

相关文章

看图猜成语微信小程序源码

后台可以自行设置关卡、等级、也可以一键部署&#xff0c; 开通流量主之后实现躺赚&#xff0c;你懂得。 个人号也可以开通&#xff0c;审核一次性必过。 类目选择 教育&#xff0c;源码仅供您参考&#xff01; 源码下载 https://download.csdn.net/download/huayula/8938579…

【计算机毕业设计】基于SSM+Vue的网上花店系统【源码+lw+部署文档】

目录 目 录 1 绪论 1.1 选题背景 1.2 选题意义 1.3 研究内容 2 系统开发技术 2.1 Java语言 2.2 SSM框架 2.3 MYSQL数据库 2.4 Vue框架 3 系统分析 3.1可行性研究 3.1.1经济可行性 3.1.2时间可行性 3.1.3操作可行性 3.2系统性能分析 3.2.1系统易用性 3.2.2系统健壮性 3.2.3系统…

电脑没电关机,wsl和docker又挂了,附解决过程

如题&#xff0c;开了个会没带笔记本电源&#xff0c;点啊弄关机后docker打不开&#xff0c;我以为是docker坏了&#xff0c;结果docker报错&#xff1a; An unexpected error occurred while executing a WSL command. Either shut down WSL down with wsl --shutdown, and/or…

【蓝桥杯国赛】双指针

适用于以下的情境&#xff1a; ① 数组 / 字符串中&#xff0c;有多少个满足情况的连续区间。 ② 数组 / 字符串&#xff0c;合并。 【第十三届pythonB组试题&#xff1a;近似gcd】 1. 题目描述 2. 难度&#xff1a;⭐⭐⭐⭐ 3. 思考分析&#xff1a; 具体参考&#xff…

深入理解Go语言中的可比较数据类型

文章目录 前言1 可比较数据类型是什么&#xff1f;2 可比较数据类型有哪些&#xff1f;3 基本数据类型比较3.1 不同数据类型比较是无效的3.2 实现不同数据类型比较&#xff1a;转换同数据类型 4 指针数据类型比较5 接口类型比较5.1 方式1&#xff1a;设置动态数据类型和动态值5…

依据SAM大模型识别的英国农田(农业田野)边界(FIBOA)矢量数据集

简介 fiboa 是一项旨在提高农田边界数据互操作性和相关农业数据的合作计划。最近推出的 fiboa 不仅仅是一个规范&#xff0c;它还是一个全面的系统&#xff0c;包括符合规范的数据、不断完善规范的讨论以及积极促进其发展的活跃社区。本项目的重点是促进创建更多有关田地边界和…

用c语言实现简易三子棋

本篇适用于C语言初学者。 目录 完整代码&#xff1a; 分步介绍&#xff1a; 声明&#xff1a; 代码主体部分&#xff1a; 模块功能实现&#xff1a; 完整代码&#xff1a; #include<stdio.h> #include <stdlib.h> #include <time.h>#define ROW 3 #d…

黑马程序员——Spring框架——day03

目录&#xff1a; AOP AOP简介 问题导入AOP简介和作用【理解】AOP的应用场景为什么要学AOPAOP入门案例【重点】 问题导入AOP入门案例思路分析AOP入门案例实现AOP中的核心概念AOP工作流程【理解】 问题导入AOP工作流程AOP核心概念在测试类中验证代理对象AOP切入点表达式 问题导…

【python】爬虫记录每小时金价

数据来源&#xff1a; https://www.cngold.org/img_date/ 因为这个网站是数据随时变动的&#xff0c;用requests、BeautifulSoup的方式解析html的话&#xff0c;数据的位置显示的是“--”&#xff0c;并不能取到数据。 所以采用webdriver访问网站&#xff0c;然后从界面上获取…

webserver服务器从零搭建到上线(十)|⭐️EventLoop类(二)——成员方法详解

首先&#xff0c;在阅读本章之前&#xff0c;我们需要搞清楚为什么EventLoop类这么复杂 其次&#xff0c;我们还需要再强调一次关于mainLoop唤醒subLoop的流程&#xff08;可以看完该类代码后再回顾该流程&#xff09;&#xff1a; 为什么需要唤醒 subLoop? subLoop&#xff0…

C语言 指针——函数指针的典型应用:计算定积分

目录 梯形法计算函数的定积分 函数指针的典型应用 梯形法计算函数的定积分 函数指针的典型应用 用函数指针编写计算任意函数定积分的 通用 函数

15届蓝桥杯决赛,java b组,蒟蒻赛时所写的题思路

这次题的数量是10题&#xff0c;初赛是8题&#xff0c;还多了两题&#xff0c;个人感觉java b组的题意还是比较清晰的&#xff08;不存在读不懂题的情况&#xff09;&#xff0c;但是时间感觉还是不够用&#xff0c;第4题一开始不会写&#xff0c;后面记起来写到结束也没调出来…

Vivado 比特流编译时间获取以及FPGA电压温度获取(实用)

Vivado 比特流编译时间获取以及FPGA电压温度获取 语言 &#xff1a;Verilg HDL 、VHDL EDA工具&#xff1a;ISE、Vivado Vivado 比特流编译时间获取以及FPGA电压温度获取一、引言二、 获取FPGA 当前程序的编译时间verilog中直接调用下面源语2. FPGA电压温度获取&#xff08;1&a…

深度学习中测量GPU性能的方式

在深度学习中&#xff0c;测量GPU性能是至关重要的步骤&#xff0c;尤其是在训练和推理过程中。以下是一些常见的测量GPU性能的方式和详细解释&#xff1a; 1. 运行时间&#xff08;Runtime&#xff09;测量 描述&#xff1a;运行时间测量是评估GPU性能的最直接方式&#xff…

es的总结

es的collapse es的collapse只能针对一个字段聚合&#xff08;针对大数据量去重&#xff09;&#xff0c;如果以age为聚合字段&#xff0c;则会展示第一条数据&#xff0c;如果需要展示多个字段&#xff0c;需要创建新的字段&#xff0c;如下 POST testleh/_update_by_query {…

信息与未来2015真题笔记

[信息与未来 2015] 加数 题目描述 给出一个正整数 n n n&#xff0c;在 n n n 的右边加入 ⌊ n 2 ⌋ \left\lfloor\dfrac n2\right\rfloor ⌊2n​⌋&#xff0c;然后在新数的右边 再加入 ⌊ ⌊ n 2 ⌋ 2 ⌋ \left\lfloor\dfrac{\left\lfloor\dfrac n2\right\rfloor}2\rig…

MyBatis:PostGreSQL的jsonb类型处理器

接前一篇《MyBatis Plus:自定义typeHandler类型处理器》,这里介绍PostGreSQL数据库的jsonb数据类型,以及如何实现jsonb类型处理器。 PostGreSQL:jsonb数据类型 json和jsonb之间的区别 PostgreSQL 提供存储JSON数据的两种类型:json 和 jsonb,两者之间的区别在于: js…

JVM学习-详解类加载器(一)

类加载器 类加载器是JVM执行类加载机制的前提 ClassLoader的作用 ClassLoader是Java的核心组件&#xff0c;所有的Class都是由ClassLoader进行加载的&#xff0c;ClassLoader负责通过各种方式将Class信息的二进制数据流读入JVM内部&#xff0c;转换为一个与目标类型对应的ja…

Java学习【String类详解】

Java学习【String类详解】 String的介绍及定义方式String类型的比较String类型的查找charAt()访问字符indexOf()查找下标 转化和替换数值和字符串转化大小写的转换字符串转数组格式化替换 字符串的拆分和截取split()拆分substring()截取trim()去除两边空格 StringBuilder和Stri…

苏州金龙客车为新疆哪吒车队提供车辆交车

2024年旅游旺季提前到来、时间延长&#xff0c;新疆旅游市场有望延续去年火爆态势。 近期&#xff0c;新疆哪吒运输服务有限公司&#xff08;以下简称“哪吒车队”&#xff09;订购的最新一批10辆苏州金龙海格高端旅游大巴在苏州金龙厂区正式交付。哪吒车队负责人伍亚丽笑容满…