IO流学习总结

IO流学习总结

IO流思维导图

在这里插入图片描述

IO流概述

概述:
	IO流用来处理设备之间的数据交流,复制,上传,下载,都需要用到IO。作为编码人员,我们是站在内存角度来看待输入和输出,输入就是把硬盘上的数据读取到内存中,输出就是把内存中的数据写到硬盘上。

异常与File类

1.异常:我们在进行数据的传输时,难免会出现一些异常,所以我们需要处理这些异常,因此Java提供了异常处理机制,所以我们在学习IO流之前,先要学习一下异常处理机制。
2.File类:再一个,这些数据在电脑上是以文件的形式来体现的,你操作数据实际上就是在操作文件,所以Java也给我们提供了一个file类来描述文件或文件夹。

IO流分类

1.按照数据流向分类(站在内存角度)
(1)输入流:读入数据
(2)输出流:写入数据
2.按照数据类型
(1)字节流:可以读写任何类型的文件,比如音频,视频,文本文件
(2)字符流:只能读写文本文件
	字符流出现的原因:由于字节流操作中文不是特别方便,所以,Java就提供了字符流。
	字符流 = 字节流 + 编码表
3.使用各种流的情况
	如果数据所在的文件通过Windows自带的记事本打开并能读懂里面的内容,就用字符流。其他的用字节流,如果你什么都不知道,就用字节流。

IO流基类

字节流抽象基类

1.InputStream
(1)概述:
	此抽象类是表示字节输入流的所有类的超类。需要定义 InputStream 子类的应用程序必须总是提供返回下一个输入字节的方法。
(2)子类:FileInputStream
	a.概述:FileInputStream 从文件系统中的某个文件中获得输入字节。哪些文件可用取决于主机环境。FileInputStream 用于读取诸如图像数据之类的原始字节流。
	b.方法:
	public void write(int b):写一个字节  超过一个字节 砍掉前面的字节
	public void write(byte[] b):写一个字节数组
	public void write(byte[] b,int off,int len):写一个字节数组的一部分
	int read(byte[] b):一次读取一个字节数组,返回的int类型的值表示的意思是读取到的字节的个数,如果没有数据了就返回-1
    int read():一次读取一个字节,如果没有数据返回的就是-1
    d.BufferedInputStream
    概述:BufferedInputStream 为另一个输入流添加一些功能,即缓冲输入以及支持 mark 和 reset 方法的能力。
    c.数据输入流:DataInputStream
    概述:数据输入流允许应用程序以与机器无关方式从底层输入流中读取基本 Java 数据类型。应用程序可以使用数据输出流写入稍后由数据输入流读取的数据。DataInputStream 对于多线程访问不一定是安全的。 线程安全是可选的,它由此类方法的使用者负责。
(3)操作字节数组:ByteArrayInputStream
	概述:ByteArrayInputStream 包含一个内部缓冲区,该缓冲区包含从流中读取的字节。内部计数器跟踪 read 方法要提供的下一个字节。关闭 ByteArrayInputStream 无效。此类中的方法在关闭此流后仍可被调用,而不会产生任何 IOException。
(4)反序列化流:ObjectInputStream
	概述:ObjectInputStream 对以前使用 ObjectOutputStream 写入的基本数据和对象进行反序列化。
(5)标准输入流:public static final InputStream in 对应的设备是键盘
2.OutputStream
(1)概述:
	此抽象类是表示输出字节流的所有类的超类。输出流接受输出字节并将这些字节发送到某个接收器。需要定义 OutputStream 子类的应用程序必须始终提供至少一种可写入一个输出字节的方法。 
(2)子类:FileOutputStream
	a.概述:文件输出流是用于将数据写入 File 或 FileDescriptor 的输出流。
	b.BufferedOutputStream
	概述:该类实现缓冲的输出流。通过设置这种输出流,应用程序就可以将各个字节写入底层输出流中,而不必针对每次字节写入调用底层系统。
    缓冲思想:字节流一次读写一个数组的速度明显比一次读写一个字节的速度快很多,这是加入了数组这样的缓冲区效果,java本身在设计的时候,也考虑到了这样的设计思想,所以提供了字节缓冲区流。
	c.数据输出流:DataOutputStream
	概述:数据输出流允许应用程序以适当方式将基本 Java 数据类型写入输出流中。然后,应用程序可以使用数据输入流将数据读入。
(3)操作字节数组:ByteArrayOutputStream
	概述:此类实现了一个输出流,其中的数据被写入一个 byte 数组。缓冲区会随着数据的不断写入而自动增长。可使用 toByteArray() 和 toString() 获取数据。关闭 ByteArrayOutputStream 无效。此类中的方法在关闭此流后仍可被调用,而不会产生任何 IOException。 
(4)序列化流:ObjectOutputStream
	概述:ObjectOutputStream 将 Java 对象的基本数据类型和图形写入 OutputStream。
(5)标准输出流:public static final PrintStream out 对应的设备是显示器

字符流抽象基类

1.Reader
(1)概述:
	用于读取字符流的抽象类。子类必须实现的方法只有 read(char[], int, int) 和 close()。但是,多数子类将重写此处定义的一些方法,以提供更高的效率和/或其他功能。
(2)InputStreamReader
	a.概述:InputStreamReader 是字节流通向字符流的桥梁:它使用指定的 charset 读取字节并将其解码为字符。它使用的字符集可以由名称指定或显式给定,或者可以接受平台默认的字符集。
	b.构造方法:
	InputStreamReader(InputStream in):用默认的编码(GBK)读取数据
	InputStreamReader(InputStream in,String charsetName):用指定的编码读取数据
	c.方法:
	public int read() 一次读取一个字符,如果没有读到 返回-1
	public int read(char[] cbuf) 一次读取一个字符数组 如果没有读到 返回-1
	d.FileReader
	概述:用来读取字符文件的便捷类。此类的构造方法假定默认字符编码和默认字节缓冲区大小都是适当的。要自己指定这些值,可以先在 FileInputStream 上构造一个 InputStreamReader。
	构造方法:
	public BufferedReader(Reader e)
	特殊方法:
	public String readLine():一次读取一行数据 ,是以换行符为标记的,读到换行符就换行,没读到数据返回null;包含该行内容的字符串,不包含任何行终止符,如果已到达流末尾,则返回 null
(3)操作字符数组:CharArrayReader
	概述:此类实现一个可用作字符输入流的字符缓冲区。
(4)操作字符串:StringReader
	概述:其源为一个字符串的字符流。
2.Writer
(1)概述:
	写入字符流的抽象类。子类必须实现的方法仅有 write(char[], int, int)、flush() 和 close()。但是,多数子类将重写此处定义的一些方法,以提供更高的效率和/或其他功能。 
(2)OutputStreamWriter
	a.概述:OutputStreamWriter 是字符流通向字节流的桥梁:可使用指定的 charset 将要写入流中的字符编码成字节。它使用的字符集可以由名称指定或显式给定,否则将接受平台默认的字符集。
	b.构造方法:
	OutputStreamWriter(OutputStream out):根据默认编码(GBK)把字节流的数据转换为字符流
	OutputStreamWriter(OutputStream out,String charsetName):根据指定编码把字节流数据转换为字符流
	c.方法:
	public void write(int c) 写一个字符
	public void write(char[] cbuf) 写一个字符数组
	public void write(char[] cbuf,int off,int len) 写一个字符数组的 一部分
	public void write(String str) 写一个字符串
	public void write(String str,int off,int len) 写一个字符串的一部分
	d.FileWriter
	概述:用来写入字符文件的便捷类。此类的构造方法假定默认字符编码和默认字节缓冲区大小都是可接受的。要自己指定这些值,可以先在 FileOutputStream 上构造一个 OutputStreamWriter。
	构造方法:
	public BufferedWriter(Writer w)
	特殊方法:
	public void newLine():根据系统来决定换行符 具有系统兼容性的换行符
(3)操作字符数组:CharArrayWriter
	a.概述:此类实现一个可用作 Writer 的字符缓冲区。缓冲区会随向流中写入数据而自动增长。可使用 toCharArray() 和 toString() 获取数据。
	b.注意:在此类上调用 close() 无效,并且在关闭该流后可以调用此类中的各个方法,而不会产生任何 IOException。
(4)操作字符串:StringWriter
	a.概述:一个字符流,可以用其回收在字符串缓冲区中的输出来构造字符串。
	b.注意:关闭 StringWriter 无效。此类中的方法在关闭该流后仍可被调用,而不会产生任何 IOException。 

编码与解码

1.编码
(1)概述:
	就是把字符串转换成字节数组
(2)方法:
	public byte[] getBytes();使用平台的默认字符集将此 String编码为 byte 序列,并将结果存储到一个新的 byte 数组中
	public byte[] getBytes(String charsetName) 使用指定的字符集将此 String 编码为 byte 序列,并将结果存储到一个新的 byte 数组中
2.解码
(1)概述:
	就是把字节数组转换成字符串
(2)方法:
	public String(byte[] bytes):	通过使用平台的默认字符集解码指定的 byte 数组,构造一个新的 String
	public String(byte[] bytes, String charsetName) 通过使用指定的 charset 解码指定的 byte 数组,构造一个新的 String
3.注意:
	使用什么字符集进行编码,那么就使用字符集进行解码

序列化与反序列化

1.序列化:
	把对象转换为字节序列的过程称为对象的序列化。
2.反序列化:
	把字节序列恢复为对象的过程称为对象的反序列化。
3.序列化与反序列化的使用场景
(1)当我们需要将内存中的对象持久化到磁盘, 数据库中时
(2)当我们需要与浏览器进行交互进行网络传输时
(3)只要我们对内存中的对象进行持久化或网络传输, 这个时候都需要序列化和反序列化.

IO流中特殊的流

打印流:PrintWriter

1.概述:
	向文本输出流打印对象的格式化表示形式。此类实现在 PrintStream 中的所有 print 方法。它不包含用于写入原始字节的方法,对于这些字节,程序应该使用未编码的字节流进行写入。
2.注意:
(1)与 PrintStream 类不同,如果启用了自动刷新,则只有在调用 println、printf 或 format 的其中一个方法时才可能完成此操作,而不是每当正好输出换行符时才完成。这些方法使用平台自有的行分隔符概念,而不是换行符。
(2)此类中的方法不会抛出 I/O 异常,尽管其某些构造方法可能抛出异常。客户端可能会查询调用 checkError() 是否出现错误。
3.启动自动刷新
	public PrintWriter(OutputStream out,  boolean autoFlush)
	通过现有的 OutputStream 创建新的 PrintWriter
	public PrintWriter(Writer out,  boolean autoFlush)
	创建新 PrintWriter

随机访问流:RandomAccessFile

1.概述:
	此类的实例支持对随机访问文件的读取和写入。
2.特点:
(1)最大的特点是能读能写
(2)RandomAccessFile类不属于流,是Object类的子类。但它融合了InputStream和OutputStream的功能。支持对随机访问文件的读取和写入。
(3)RandomAccessFile的父类是Object , 这个流对象可以用来读取数据也可以用来写数据.可以操作任意数据类型的数据。
(4)我们可以通过getFilePointer方法获取文件指针,并且可以通过seek方法设置文件指针。
3.构造方法:
	RandomAccessFile(File file, String mode) 
	创建从中读取和向其中写入(可选)的随机访问文件流,该文件由 File 参数指定
	RandomAccessFile(String name, String mode) 
	创建从中读取和向其中写入(可选)的随机访问文件流,该文件具有指定名称

Properties

1.概述:
	Properties 类表示了一个持久的属性集。Properties 可保存在流中或从流中加载。属性列表中每个键及其对应值都是一个字符串。 
2.Properties父类是Hashtable- 属于双列集合,这个集合中的键和值都是字符串 Properties不能指定泛型。
3.Properties的特殊功能使用
	public Object setProperty(String key,String value)
	以适合使用 load(InputStream) 方法加载到 Properties 表中的格式,将此 Properties 表中的属性列表(键和元素对)写入输出流
	public String getProperty(String key)
	用指定的键在此属性列表中搜索属性
	public Set<String> stringPropertyNames() 
	返回此属性列表中的键集,其中该键及其对应值是字符串,如果在主属性列表中未找到同名的键,则还包括默认属性列表中不同的键。
4.Properties的load()和store()功能
(1)方法:
	public void load(InputStream inStream)
	从输入流中读取属性列表(键和元素对)
	public void load(Reader reader)
	按简单的面向行的格式从输入字符流中读取属性列表(键和元素对)
	public void store(Writer writer, String comments) 
	以适合使用 load(InputStream) 方法加载到 Properties 表中的格式,将此 Properties 表中的属性列表(键和元素对)写入输出流
	public void store(Writer writer, String comments)
	以适合使用 load(Reader) 方法的格式,将此 Properties 表中的属性列表(键和元素对)写入输出字符
(2)Properties和IO流进行配合使用:
	public void load(Reader reader): 读取键值对数据把数据存储到Properties中
	public void store(Writer writer, String comments)把Properties集合中的键值对数据写入到文件中, comments注释
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值