【缓冲流、转换流、序列/反序列化流、打印流】

一.缓冲流

1.字节缓冲输出流

java.io.BufferedOutputStream extends OutputStream 高效字节输出流 写入文件 目标文件

底层定义个了一个长度为8192的数组,提高效率

常用方法:

write(int b): 写单个字节

write(byte[] bs): 写一个字节数组

write(byte[] bs,0,len): 写一个字节数组

		BufferedOutputStream 的构造方法:
BufferedOutputStream(OutputStream out)
参数:
OutputStream out: 字节输出流的抽象父类
传递子类对象: FileOutputStream 注意:
(1)高效缓冲流而言,千万不要使用flush方法
(2)只需要关闭高效缓冲流就可以,不用关闭它所关联的其它流对象
2.字节缓冲输入流
java.io.BufferedInputStream extends InputStream 高效字节输入流 读取文件 源文件
底层定义个了一个长度为8192的数组,提高效率
常用方法:
int read(): 读取一个字节
int read(byte[] bs): 读取一个字节数组 BufferedInputStream 构造方法:
BufferedInputStream(InputStream in)
参数:
InputStream in 字节输入流的抽象父类
传递子类对象 FileInputStream
3.字符缓冲输出流
java.io.BufferedWriter extends Writer 高效字符输出缓冲流 写文件 目标文件
底层定义了长度为8192的数组,提高效率
常用的方法:
write(int ch): 写一个字符
write(char[] chs): 写一个字符数组
write(char[] chs,0,len): 写字符数组的一部分
write(String str): 写一个字符串
write(String str,0,len): 写字符串的一部分 特有方法:
newLine(): 写一个自适应平台的换行符 java.io.BufferedWriter 构造方法
BufferedWriter(Writer w):
参数:
Writer w 字符输出流的抽象父类
传递FileWriter子类对象 4.字符缓冲输入流
jva.io.BufferedReader extends Reader 高效字符输入缓冲流 读取文件的 源文件
底层定义了长度为8192的数组,提高效率
常用方法:
int read(): 读取一个字符
int read(char[] chs): 读取一个字符数组
ab\r\n
特有方法:
String readLine(): 一次读取一行的内容,以回车换行作为一行的结束标志
但是读取到的内容当中,是不包含回车换行的
遇到文件结束标志,readLine方法返回的是null jva.io.BufferedReader 构造方法
BufferedReader(Reader r):
参数:
Reader r 字符输入流的抽象父类
传递子类对象: FileReader

二.转换流

1.编码表

编码表: 存储字符和数字对应关系的一张表格

	编码: 字符  ---> 字节

	解码: 字节 ---> 字符

	常用的编码表:
GBK : 中文windows系统默认编码表 GBK
一个汉字占2个字节 UTF-8 : idea项目空间默认编码表 UTF-8
一个汉字占3个字节 如何获取一个字符串对应编码方式的字节数组呢?
byte[] getBytes() :使用平台的默认字符集(idea项目空间默认编码表 UTF-8)将此 String 编码为 byte 序列
byte[] getBytes(String charsetName) :使用指定的字符集将此 String 编码为 byte 序列 如何按照指定编码,把字节数组变成字符串?
String(byte[] bs): 通过使用平台的默认字符集解码指定的 byte 数组,构造一个新的 String String(byte[] bytes, String charsetName): 通过使用指定的 charset 解码指定的 byte 数组,构造一个新的 String。 2.InputStreamReader
java.io.InputStreamReader extends Reader 字节流通向字符流的桥梁,它是一个字符流
构造方法:
InputStreamReader(InputStream is):
参数:
InputStream is: 字节输入流的抽象父类
传递子类FileInputStream
没有指定编码表,采用平台默认编码(idea中utf-8) InputStreamReader(InputStream is,String charsetName):
参数:
String charsetName: 编码表,常用gbk,utf-8 注意:
FileReader
底层: InputStream + 平台默认编码表
InputStreamReader:
底层: InputStream + 指定编码表
3.OutputStreamWriter
java.io.OutputStreamWriter extends Writer 字符输出流 字符流通向字节流的桥梁
构造方法:
OutputStreamWriter(OutputStream out)
参数:
OutputStream out: 字节输出流的抽象父类
传递子类FileOutputStream对象
没有指定编码表,采用平台默认编码表(utf-8) OutputStreamWriter(OutputStream out,String charsetName)
参数:
OutputStream out: 字节输出流的抽象父类
传递子类FileOutputStream对象
没有指定编码表,采用平台默认编码表(utf-8) 参数:
String charsetName: 编码表,常用gbk,utf-8

三.序列/反序列化流

1.序列化流

java.io.ObjectOutputStream extends OutputStream 字节输出流 写对象的

常用方法:

writeObject(Object obj): 把参数对象obj写入到文件中

构造方法:

ObjectOutputStream(OutputStream out)

参数:

OutputStream out: 字节输出流的抽象父类

传递的是子类对象,FileOutputStream

2.反序列化流
java.io.ObjectInputStream extends InputStream 字节输入流 读取对象的
常用方法:
Object readObject(): 读取文件中的一个对象,返回形式为Object类型 向上提升
构造方法:
ObjectInputStream(InputStream is)
参数:
InputStream is: 字节输入流的抽象父类
传递的是子类对象,FileInputStream 3.注意事项
一个类要想实现序列化和反序列化,必须实现接口:
java.io.Serializable : 类通过实现 java.io.Serializable 接口以启用其序列化功能
该接口中,没有抽象方法 称之为 标记型接口 注意:
1.被static修饰的成员变量,属于类,不属于对象,所以不能进行序列化
2.被transient修饰的成员变量,不能进行序列化
3.对java文件进行编译的时候,会根据成员变量计算出一个数字,序列号
同时该序列号,在写文件的时候,会被写入到文件中
只要修改了java文件中的内容,就会重新计算一个新的序列号
在读取文件时,文件中的序列号和class中的序列号不一致,就会出异常 解决方案:
在java类中指定一个固定的序列号,这样,不管如何修改java类,都不需要重新计算序列号了
public static final long serialVersionUID = 42L;

四.打印流

java.io.PrintStream类 extends OutputStream 字节输出流

特有方法:

print(...): 原样输出,不换行,不会抛出异常

println(...): 原样输出,换行,不会抛出异常

构造方法:

PrintStream(File file)

PrintStream(String file)

参数:

File/String 类型的文件路径

System类中的set方法

static void setOut(PrintStream out) 重新分配“标准”输出流。

我爱Java系列之《JavaEE学习笔记day12》---【缓冲流、转换流、序列/反序列化流、打印流】的更多相关文章

  1. JAVA的反射机制学习笔记(二)

    上次写JAVA的反射机制学习笔记(一)的时候,还是7月22号,这些天就瞎忙活了.自己的步伐全然被打乱了~不能继续被动下去.得又一次找到自己的节奏. 4.获取类的Constructor 通过反射机制得到 ...

  2. Java后端高频知识点学习笔记1---Java基础

    Java后端高频知识点学习笔记1---Java基础 参考地址:牛_客_网 https://www.nowcoder.com/discuss/819297 1.重载和重写的区别 重载:同一类中多个同名方 ...

  3. 我爱Java系列之《JavaEE面试宝典》---【IO流面试总结】

    1.什么是比特(Bit),什么是字节(Byte),什么是字符(Char),它们长度是多少,各有什么区别 答案 Bit最小的二进制单位 ,是计算机的操作部分 取值0或者1 Byte是计算机操作数据的最小 ...

  4. Java程序猿JavaScript学习笔记(14——扩大jQuery UI)

    计划和完成这个例子中,音符的顺序如下: Java程序猿的JavaScript学习笔记(1--理念) Java程序猿的JavaScript学习笔记(2--属性复制和继承) Java程序猿的JavaScr ...

  5. 《Java编程思想》学习笔记(二)——类加载及执行顺序

    <Java编程思想>学习笔记(二)--类加载及执行顺序 (这是很久之前写的,保存在印象笔记上,今天写在博客上.) 今天看Java编程思想,看到这样一道代码 //: OrderOfIniti ...

  6. [Java] LinkedList / Queue - 源代码学习笔记

    简单地画了下 LinkedList 的继承关系,如下图.只是画了关注的部分,并不是完整的关系图.本博文涉及的是 Queue, Deque, LinkedList 的源代码阅读笔记.关于 List 接口 ...

  7. Java程序猿JavaScript学习笔记(2——复制和继承财产)

    计划和完成在这个例子中,音符的以下序列: Java程序猿的JavaScript学习笔记(1--理念) Java程序猿的JavaScript学习笔记(2--属性复制和继承) Java程序猿的JavaSc ...

  8. Java程序猿JavaScript学习笔记(4——关闭/getter/setter)

    计划和完成这个例子中,音符的顺序如下: Java程序猿的JavaScript学习笔记(1--理念) Java程序猿的JavaScript学习笔记(2--属性复制和继承) Java程序猿的JavaScr ...

  9. Java框架spring Boot学习笔记(六):Spring Boot事务管理

    SpringBoot和Java框架spring 学习笔记(十九):事务管理(注解管理)所讲的类似,使用@Transactional注解便可以轻松实现事务管理.

随机推荐

  1. 【转】Python的下划线

    原文: 1. Python中的下划线(译文) 2. [转]关于python中带下划线的变量和函数的意义 总结: 1. 单下划线开头.保护变量,不可被其他包导入使用,除非在__all__声明可以显示引用 ...

  2. jmeter接口测试报java.net.SocketException: Socket closed错误。

    如题,jmeter报出java.net.SocketException: Socket closed,我查询了下,服务器是正常的,可以返回数据,基本确定问题出在我这边jmeter.查询原因,看到有人说 ...

  3. mac的terminal快捷键

    mac终端terminal快捷键: Command + K 清屏 Command + T 新建标签 Command +W  关闭当前标签页 Command + S  保存终端输出 Command + ...

  4. mybatis整合spring获取配置文件信息出错

    描述:mybatis整合spring加载jdbc.properties文件,然后使用里面配置的值来 配置数据源,后来发现用户变成了admin- jdbc.properties的配置: 加载配置: 报错 ...

  5. 给xmpphp添加了几个常用的方法

    给xmpphp添加给了以下的常用方法: registerNewUser            //注册一个新用户 addRosterContact           //发送添加好友的请求 acce ...

  6. 4.app是怎么炼成的

    很多刚进入app后端的小伙伴,有的是之前没有接触过这个行业,有的是只在学校学习了基本的技术知识,不知道开发app的整个流程是怎么样的,因此心里会有一股恐惧.听着别人口中的一大串app相关的术语,也不知 ...

  7. 玩转SSH--Hibernate(三)---手动修改数据库,前台查询信息不同步更新问题解决方法

    在用hibernate时遇到一个挺纠结的问题,就是我在手动修改数据库的信息后,前台页面查询到的信息还是之前的结果,一开始以为是缓存的问题,经过多次修改和在网上查询资料,最终发现可能是hibernate ...

  8. mysql(mariadb)如何更改root密码

    mysql(或者mariadb,她是mysql的一个分支,完全开源,新版本的linux系统默认安装的是mariadb)如何更改root密码呢?我们主要介绍命令mysqladmin来实现. mysql( ...

  9. 重设msyql数据库root密码

    重设密码的方法: 具体方法是: 1.先在安装目录找到my.ini配置文件,打开配置文件, 找到[mysqld]一行,在下面添加skip-grant-tables后保存该文件 重新启mysql动服务; ...

  10. 关于find命令的一些知识

    在服务器运维的过程中,我们会用到这样一个命令,关于这个命令,你知道多少呢?接下来,咱们一起来研究一下它的用途. find命令主要用来在硬盘上搜索文件, find命令主要用于文件查找,列出当前目录及子目 ...