我爱Java系列---【缓冲流、转换流、序列/反序列化流、打印流】

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

一.缓冲流
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) 重新分配“标准”输出流。

posted on   少年攻城狮  阅读(338)  评论(0编辑  收藏  举报

编辑推荐:
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

导航

统计

点击右上角即可分享
微信分享提示