1、概念:
数据的输入和输出
2、使用场景:
导入 导出
上传 下载
3、流
1.分类
字节流 字符流
**2.API------Io**
字节流:
InputStream 输入流 序列化
OutputStream 输出流 反序列化
流的关闭:close();
InputStream API 文本反序列化
abstract int read()
从输入流中读取数据的下一个字节。 返回-1表示到文档最后
int read(byte[] b)
从输入流中读取一定数量的字节,并将其存储在缓冲区数组 b 中。
(给定一个长度的瓢 并且将byte的数据装进去)之后可以用new string(bytes)转换成字符串
void close()
关闭此输出流并释放与此流有关的所有系统资源。
ObjectInputStream 对象反序列化
构造方法
ObjectInputStream(InputStream in) //同样传入 InputString 的子类对象的实例
创建从指定 InputStream 读取的 ObjectInputStream。
普通方法:
使用 .WriteObject()就可以反序列化(读取)传入参数对象中的 对象
返回值是Object 然后强制转换成该类 就可以读取该类中的内容
OutputStream API 文本序列化
void close()
关闭此输出流并 释放与此流有关的所有系统资源。
void flush()
刷新此输出流并强制写出所有缓冲的输出字节。
void write(byte[] b)
将 b.length 个字节从指定的 byte 数组写入此输出流。可以提前声明字符串然后调用字符串的.getbytes()方法 转换成byte数组传入就可以实现数据的输入
void write(byte[] b, int off, int len)
将指定 byte 数组中从偏移量 off 开始的 len 个字节写入此输出流。
abstract void writeObject(int b)
将指定的字节写入此输出流。
字节流存在的问题:
1. 写字符串的时候比较麻烦
2. 字节流读中文的时候很麻烦 容易乱码 2个字节 是一个中文 一旦断开就乱码了
outputstream字符串的时候存在的问题
1.字符串每次都需要new String 对象 存在过多新建对象的问题
解决方案
使用字符流
新建过多对象的问题的解决
使用字符串缓冲区 BufferedWriter BufferedReader
通过多态的方式可以传入参数
ObjectOutputStream 对象序列化
构造方法
ObjectOutputStream(OutputStream out) //里面的参数 是需要序列化的序列化对象因为里面是一个抽象类 因此只能传入子类实例对象
创建写入指定 OutputStream 的 ObjectOutputStream。
protected ObjectOutputStream()
为完全重新实现 ObjectOutputStream 的子类提供一种方法,让它不必分配仅由 ObjectOutputStream 的实现使用的私有数据
然后 用Object.write()就可以将对象写入File指定的位置
字符流
Writer
Reader
都是抽象方法 无法实例化 因此需要实例子类来继承实现这两个类的功能于是就产生了
FileWrite FileReader 他们一个是继承outputStreamWriter 另一个继承 inputStreamReader
FileWrite– inputStreamWriter
构造方法:
FileWriter(File file) 也可以是String string
根据给定的 File 对象构造一个 FileWriter 对象。
FileWriter(File file, boolean append) String string,Boolean appemd
根据给定的 File 对象构造一个 FileWriter 对象。
普通方法(继承自InoutSrtringWriter)
void close()
关闭此流,但要先刷新它。
void flush()
刷新该流的缓冲。
void write(char[] cbuf, int off, int len)
写入字符数组的某一部分。
void write(int c)
写入单个字符。
void write(String str, int off, int len)
写入字符串的某一部分。
从类 java.io.Writer 继承的方法
append, append, append, write, write
FileRead-outPutStreamReader
构造方法
**FileReader(File file) **
在给定从中读取数据的 File 的情况下创建一个新 FileReader。
**FileReader(FileDescriptor fd) **
在给定从中读取数据的 FileDescriptor 的情况下创建一个新 FileReader。
FileReader(String fileName)
在给定从中读取数据的文件名的情况下创建一个新 FileReader。
普通方法
void close()
关闭该流并释放与之关联的所有资源。
String getEncoding()
返回此流使用的字符编码的名称。
int read()
读取单个字符。
int read(char[] cbuf, int offset, int length)
将字符读入数组中的某一部分。
boolean ready()
判断此流是否已经准备好用于读取。
从类 java.io.Reader 继承的方法
mark, markSupported, read, read, reset, skip
BufferedWriter
解决输入的时候新建过多对象的问题
构造方法----一般使用多态的形式传入参数Writer==>OutputStreamWriter==>FileWriter
BufferedWriter(Writer out)
创建一个使用默认大小输出缓冲区的缓冲字符输出流。
BufferedWriter(Writer out, int sz)
创建一个使用给定大小输出缓冲区的新缓冲字符输出流。
普通方法
void close()
关闭此流,但要先刷新它。
void flush()
刷新该流的缓冲。
void newLine()
写入一个行分隔符。
void write(char[] cbuf, int off, int len)
写入字符数组的某一部分。
void write(int c)
写入单个字符。
void write(String s, int off, int len)
写入字符串的某一部分。
BufferedReader
解决读取的时候空间浪费和文本过大的问题 可以一行一行的读取
构造方法----一般使用多态的形式传入参数Reader-InputStreamReaderFileReader
BufferedReader(Reader in)
创建一个使用默认大小输入缓冲区的缓冲字符输入流。
BufferedReader(Reader in, int sz)
创建一个使用指定大小输入缓冲区的缓冲字符输入流。
普通方法
void close()
关闭该流并释放与之关联的所有资源。
void mark(int readAheadLimit)
标记流中的当前位置。
boolean markSupported()
判断此流是否支持 mark() 操作(它一定支持)。
int read()
读取单个字符。
int read(char[] cbuf, int off, int len)
将字符读入数组的某一部分。
String readLine()
读取一个文本行。
boolean ready()
判断此流是否已准备好被读取。
void reset()
将流重置到最新的标记。
long skip(long n)
跳过字符。