认识io流
什么是io
io就是输入(in)和输出(out)指应用程序和外部设备之间的数据传递,常见的外部设备包括文件、管道、网络连接。
什么是流
流是一种抽象概念,比如我们在电脑上插入u盘把一个视频拷贝到电脑硬盘中,就可以看作u盘里的数据流向电脑硬盘中。
我们java中I/O操作主要使用Java.io包下的内容 进行输入输出操作。
根据数据的流向分为:
输入流:把数据从其他设备上读取到内存中的流。
输出流:把数据从内存中写出到其他设备的流。
顶级父类
输入流 | 输出流 | |
字节流 | 字节输入流(InputStream) | 字节输出流(OutputStream) |
字符流 | 字符输入流(Reader) | 字符输出流(Writer) |
OutputStream
常用方法
void write(int i);写出一个字节的数据
void write(byte[] b);数据写入数组中
void write(byte[] b,int offset,int len);从指定的字节数组写入 len字节,从偏移量 offset开始输出到此输出流。
void flush();刷新(清空)缓冲区。
void close();关闭流
常用子类:
FileOutputStream(输出字节流)
构造方法
public FileOutputStream(String pathname);
public FileOutputStream(File pathname);
public FileOutputStream(String pathname,boolean append);
public FileOutputStream(File pathname,boolean append);
这四个构造方法其实底层最终使用的是第四个构造方法。
前面两个构造方法,布尔值参数默认是false(表示覆盖)写true表示继续添加
BufferedOutputStream(缓冲输出字节流)
构造方法
调用下面这个构造方法的时候,底层会创建一个长度是8192的byte数组
当写出数据的时候,会被数据存储在这个8192的byte数组中
当该数组存不下数据,或者显示的调用了flush(close)方法,会把缓冲区中的数据写出去
public BufferedOutputStream(OutputStream os);
通过下面的构造方法,可以指定缓冲区的大小
public BufferedOutputStream(OutputStream os,int size);
ObjectOutputStream(序列化)
构造方法:
public ObjectOutputStream (OutoutStream out)
创建一个指定OutputStream的ObjectOutputStream。
该类必须实现java.io.Serializable 接口,Serializable是一个标记接口,不实现此接口的类将不会使任何状态序列化或反序列化,会抛出 NotSerializableException 。
该类的所有属性必须是可序列化的。如果有一个属性不需要可序列化的,则该属性必须注明是瞬态的,使用transient关键字修饰。
InputStream
常用方法
int read();读取一个字节的数据,返回读取的数据,如果没有数据则返回-1
int read(byte[] b);读取数据存入byte数组中,返回读取的长度。如果没有数据则返回-1
void close();关闭流
常用子类:
FileInputStream(输入字节流)
构造方法:
public FileInputStream(String pathname);参数写文件地址
public FileInputStream(File pathname);参数写一个File对象
BuffInputStream(缓冲输入字节流)
构造方法:
public BufferedInputStream(InputStream is);
ObjectInputStream(反序列化)
构造方法:
public ObjectInputStream(InputStream in)
反序列化流,将之前使用ObjectOutputStream序列化的原始数据恢复为对象。
序列化后,类文件结构不能改变,如果改变了反序列化就会报错(InvalidClassException)。如果不能保证不修改类文件结构,则可以在该类中添加一个成员变量(常量):serialVersionUID
Writer
成员方法
void write(int b);//写出一个字符的数据
void write(char[] ch);
void write(char[] ch,int offset,int len);
void write(String str);
void write(String str,int offset,int len);
void flush();//可以把缓冲区中的数据写出去
void close();//关闭流,释放资源。在关闭流之前会把缓冲区中的数据写出去
常用子类:
File Writer(字符输出流)
构造方法:默认是false,表示覆盖
调用下列构造方法,底层会创建一个长度是8192的byte数组(缓冲区)
当缓冲区中的数据满了,存不下了会自动把缓冲区中的数据写出去
public FileWriter(String pathname);
public FileWriter(File pathname);
public FileWriter(String pathname,boolean append);
public FileWriter(File pathname,boolean append);
BufferedWriter(缓冲字符输出流)
调用下面这个构造方法的时候,底层会创建一个长度是8192的char数组
调用写出方法的时候,会把数据写出到8192的char数组中
当8192的char数组存不下数据的时候,会同一进行转换(成byte),
存储到8192的byte数组中,然后把8192byte数组中的数据写出去
public BufferedWriter(Writer w);
调用下面这个构造方法可以自己指定缓冲区的大小
public BufferedWriter(Writer w,int size);
成员方法:
void newLine();写出一个换行
OutputStreamWriter(转换输出流)
构造方法
public OutputStreamWriter(OutputStream os);使用默认的字符编码写出数据
public OutputStreamWriter(OutputStream os,String charsetName);使用自己指定的字符编码写出数据
Reader
成员方法
int read();读取一个字符的数据,如果 没有读到数据则返回-1
int read(char[] ch);读取数据,存入char数组中,返回读取的长度,如果没有数据则返回-1
void close();释放资源
常用子类:
File Reader(字符输入流)
构造方法:
调用下列构造方法的时候,底层会创建一个长度是8192的byte数组
(数据量大) 每次读取8192字节的数据,数据量小(有多少数据读多少)
public FileReader(String pahtname);
public FileReader(File pahtname);
BufferedReader(缓冲字符输入流)
构造方法:
调用下面这个构造方法的时候,底层会创建一个长度是8192的char数组
调用读取方法,把数据读取存入8192的byte数组
把8192byte数组中的数据统一转换成字符存入8192的char数组中
从char数组中的对应位置获取元素,进行操作
public BufferedReader(Reader r);
public BufferedReader(Reader r,int size);
成员方法:
String readLine();读取一行数据,如果没有数据则返回null
字符输入流和缓冲字符输入流读取数据,读取的次数是一样的
高效体现在字节到字符的转换。
InputStreamReader(转换输入流)
构造方法
public InputStreamReader(InputStream is);这个构造方法读取数据使用的是默认的字符编码
public InputStreamReader(InputStream is,String charsetName);这个构造方法读取数据使用的是自己指定的编码