一、什么是字节流?
字节流通俗的说就是通过以二进制数字的形式,对任意文件数据进行一个字节一个字节的传输过程我们就称为字节流。
二、字节流分类
字节流是程序中最常用的流,根据数据的传输方向可将其分为字节输入流和字节输出流。在JDK中, 提供了两个抽象类InputStream和OutputStream,它们是字节流的顶级父类,所有的字节输入流都继 承自InputStream,所有的字节输出流都继承自OutputStream。
三、FileInputStream、FileOutputStream常用方法
InputStream输入流( 实现磁盘文件数据到程序,读文件 )
InputStream是以字节为单位的输出流,它是所有以字节输入流类的公共父类,是表示字节输入流 的所有类的超类。
方法 | 说明 |
int read() | 读取一个字节,返回int表示,如果文件没有数据则返回-1 |
int len = read(buf) | 读取一组数据字节,并返回成功读取字节的个数。len保存字节 个数 |
bytes[] readAllBytes() | 一次全部读取所有文字的字节 |
int read(buf,2,3) | 读取3个字节,赋值到数组2位置开始 |
void close() | 关闭流 |
transferTo(OutputStream out) | 此方法是java9 新方法,直接实现复制文件 |
int skip(long) | 跳过并从输入流中丢弃 n 字节的数据 |
OutputStream输出流( 实现程序数据到磁盘文件,写文件 )
OutputStream是以字节为单位的输出流的超类,提供了write()函数从输出流中读取字节数据。
方法 | 说明 |
void write(byte[] b) | 输出流写入字节数组 |
void write(int b) | 输出流写入97(a) 一个字符 |
void write(byte[] b,int off,int len) | 输出流写入指定数组数据字节 |
void flush() | 写入数据 |
void close() | 关闭流 |
FileOutputStream("user.txt") | 构造方法 |
FileOutputStream("user.txt",true) | 构造方法,采用追加模式 |
四、为什么输入流是读数据,而输出流是写数据?
因为输入输出都是相对于内存来说的。input是将数据从磁盘读取到内存当中,而输出就是将数据从内存输出道磁盘。
我们程序在运行地时候也会从磁盘中被调入内存中,程序和其运行时数据都是会在内存中驻留,然后在真正执行的时候,cpu会从中读取到相应的数据指令,执行相应的指令。
五、缓冲字节流
BufferedInputStream 顾名思义就是它有一个内部的buffer(缓存),它的read方法表面上 看,虽然是只读了一个字节,但它是开始时猛然从硬盘读入一大堆字节到自己的缓 存,当你read 时,它是从缓存读进一个字节到内存。而前面讲的FileInputStream字节流,read时,都是真正每 个字节都从硬盘到内存,导致很慢。同理,BufferedOutputStream缓冲输出流是一样的。
构造方法
BufferedInputStream bis = new BufferedInputStream(InputStream is)
六、Object字节流
对象流是一对高级流,在流链接中的作用是完成对象的序列化与反序列化:
1.序列化:把Java对象转换为字节序列的过程。
2.反序列化:把字节序列恢复为Java对象的过程。
对象的序列化主要有两种用途:
1.把对象的字节序列永久地保存到硬盘上,通常存放在一个文件中;(持久化对象)
2.在网络上传送对象的字节序列。(网络传输对象)
java.io.ObjectInputStream
常用构造器
ObjectInputStream(InputStream in):创建一个对象输入流并连接到参数in这个输入流上 常用方法 Object readObject():进行对象反序列化,将读取的字节转化为一个对象并以Object形式返回(多 态),如果读取的字节表示的不是一个java对象,会抛出java.io.ClassNotFoundException
java.io.ObjectOutputStream
常用构造器
ObjectOutputStream(OutputStream out):创建一个对象输出流并连接到参数out这个输入流上 常用方法 void writeObjecat(Object obj):进行对象序列化