概念:存储和内存之间的传输数据的通道.(硬盘和内存之间)
一、流的分类:
1.按方向:
输入流(input):将“存储设备”中的数据留到“内存(程序)”中。
输出流(output):将“内存(程序)”中的数据流到“存储设备”中去。
2.按单位:
字节流:以字节为单位,可以读写所有数据。
字符流:以字符为单位,只能读写文本数据。
3.按功能:
节点流:具有实际传输数据的读写功能。
过滤流:在节点流的基础之上增强功能。
字节流的父类(抽象):
InputStream:字节输入流:
int available()
返回从该输入流中可以读取(或跳过)的字节数的估计值,而不会被下一次调用此输入流的方法阻塞。
void close()
关闭此输入流并释放与流相关联的任何系统资源。
void mark(int readlimit)
标记此输入流中的当前位置。
boolean markSupported()
测试这个输入流是否支持 mark
和 reset
方法。
abstract int read()
从输入流读取数据的下一个字节。
int read(byte[] b)
从输入流读取一些字节数,并将它们存储到缓冲区 b
。
int read(byte[] b, int off, int len)
从输入流读取最多 len
字节的数据到一个字节数组。
void reset()
将此流重新定位到上次在此输入流上调用 mark
方法时的位置。
long skip(long n)
跳过并丢弃来自此输入流的 n
字节数据。
OutputStream:字节输出:
void close()
关闭此输出流并释放与此流相关联的任何系统资源。
void flush()
刷新此输出流并强制任何缓冲的输出字节被写出。
void write(byte[] b)
将 b.length
字节从指定的字节数组写入此输出流。
void write(byte[] b, int off, int len)
从指定的字节数组写入 len
个字节,从偏移 off
开始输出到此输出流。
abstract void write(int b)
将指定的字节写入此输出流。
二、文件字节流:
1.FileInputStream:–public int read(byte[] b)// 从流中读取多个数据,将读到的内容存入b数组,返回实际读到的字节数,,如果达到文件的结尾,则返回-1.
2.FileOutputStream:–public void write(byte[] b)//一次写多个字节,将写的字节读入输出流.(就是把想要写进文件里面的字符串写在代码里面,代码会帮你写进字符串里面)
FileOutputStream fop = new FileOutputStream("D:\\aa.txt"); //如果改成FileOutputStream fop = new FileOutputStream("D:\\aa.txt",true);则会变成运行一次在后面加一次123456; String str = "123456"; fop.write(str.getBytes()); //就是用这三行代码可以把123456输入到aa.txt里面。 三、字节缓冲流 import java.io.BufferedInputStream; import java.io.BufferedOutputStream; 用处:1.提高IO流效率,减少访问磁盘的次数;2.数据存储在缓冲区,flush是将缓冲区的内容写进文件里面,也可以直接close。
在创建BufferedOutputStream对象之后,关闭bis对象时默认也会关闭fis对象,因此只用调用bis.close();即可关闭两个。
输出(output)缓冲区会把write方法里面的内容存在缓冲区,要输入文件就要调用flush方法写入文件。
四、对象流:(ObjectInputStream和ObjectOutputStream)
两个基本方法:
1.readObject:从流中读取一个对象。
2.writeObject(Object obj):向流中写入一个对象。
称为序列化和反序列化,下面来解释:
1.序列化:(类似于在硬盘里面输出对象)(ObjectOutputStream)
*注意:序列化时在要输出的类当中,必须要调用一个接口:implements Serializable。
2.反序列化:(类似于往流里面输入对象)(ObjectInputStream)
我们可以使用对象.toString方法打印出写入流的数据。(方法,属性等等)
*序列的注意事项:
1.必须使用Serializable接口。(包括属性也是一样)
2.序列化版本号ID可以在类中定义,保证序列化和反序列化的ID是相同的值。(更改了声明对象的类的序列化ID之后,不能直接反序列化,必须先序列化一次使得硬盘中的序列号相同才能下一步反序列化)。
3.使用transient(瞬间的)修饰属性,这个属性不能被序列化。
4.静态的属性不能序列化。