流:
输入流和输出流,字节流和字符流。
输入和输出:基准是内存,
数据进入内存:就叫输入
输出写出内存:就叫输出
下面所有的类,都属于java.io包下的。
字节缓冲输入流和字节缓冲输出流作用:较少IO次数,提高IO的效率。
字节输入流(InputStream抽象类):
常用方法:
int read();//读取一个字节的数据,返回读取的数据,如果没有数据则返回-1
int read(byte[] b);//读取数据存入byte数组中,返回读取的长度。
//如果没有数据则返回-1
void close();
常用子类:FileInputStream
构造方法:
public FileInputStream(String pathname);
public FileInputStream(File pathname);
BufferedInputStream:
构造方法:
//调用下面这个构造方法的时候,底层会创建一个长度是8129的byte数组
//当第一次读取的时候,会读取数据存入该byte数组中
//然后从该数组对应位置获取元素,进行操作
public BufferedInputStream(InputStream is);
//下面这个构造方法可以自己指定缓冲区大小
public BufferedInputStream(InputStream is,int size);
字节输出流(OutputStream抽象类):
常用方法:
void write(int i);//写出一个字节的数据
void write(byte[] b);
void write(byte[] b,int offset,int len);
void flush();//刷新(清空)缓冲区。
void close();
常用子类:FileOutputStream
构造方法:
//当参数的某一个目录不存在,会抛出FileNotFoundException
public FileOutputStream(String pathname);
public FileOutputStream(File pathname);
public FileOutputStream(String pathname,boolean append);
public FileOutputStream(File pathname,boolean append);
这四个构造方法其实底层最终使用的是第四个构造方法。
前面两个构造方法,布尔值参数默认是false(表示覆盖)
注意事项:底层数据的传输来说只有字节流,没有字符流。
BufferedOutputStream:
构造方法:
//调用下面这个构造方法的时候,底层会创建一个长度是8192的byte数组
//当写出数据的时候,会被数据存储在这个8192的byte数组中
//当该数组存不下数据,或者显示的调用了flush(close)方法,会把缓冲区中的数据写出去
public BufferedOutputStream(OutputStream os);
//通过下面的构造方法,可以指定缓冲区的大小
public BufferedOutputStream(OutputStream os,int size);
字符输入流(Reader抽象父类):
常用方法:
int read();//读取一个字符的数据,如果 没有读到数据则返回-1
int read(char[] ch);//读取数据,存入char数组中,返回读取的长度,如果没有数据则返回-1
void close();//释放资源
常用子类:FileReader
构造方法:
//调用下列构造方法的时候,底层会创建一个长度是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);
//字符输入流和缓冲字符输入流读取数据,读取的次数是一样的
//高效体现在字节到字符的转换
OutputStreamWriter:
构造方法:
//使用默认的字符编码写出数据
public OutputStreamWriter(OutputStream os);
//使用自己指定的字符编码写出数据
public OutputStreamWriter(OutputStream os,String charsetName);
字符输出流(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();//关闭流,释放资源。在关闭流之前会把缓冲区中的数据写出去。
常用子类:FileWriter
构造方法://默认是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);
//字符缓冲输出流的高效体现在,字符到字节的转换上,写出次数这两种(FileWriter、BufferedWriter)是一样的
OutputStreamWriter:
构造方法:
//使用默认的字符编码写出数据
public OutputStreamWriter(OutputStream os);
//使用自己指定的字符编码写出数据
public OutputStreamWriter(OutputStream os,String charsetName);
对象输出流写出对象,序列化操作。
注意事项:
a.序列化的对象必须是Serializable类型
b.成员变量的类型也必须是Serializable类型
c.使用transient关键字修饰的成员变量不进行序列化
对象输入流读数据进来转换成对象,反序列化操作
注意事项:
a.序列化后,类文件结构不能改变,如果改变了反序列化就会报错。
如果不能保证不修改类文件结构,则可以在该类中添加一个成员变量(常量):
serialVersionUID
PrintStream:打印流
成员方法:
void println();
void print(参数);
构造方法:
public PrintStream(String pathname);
public PrintStream(File pathname);
public class Test04 {
public static void main(String[] args) throws IOException {
Reader r = new FileReader("b.txt");
int data = r.read();//读取一个字符的数据,第一次读的时候,从磁盘中把数据读取存入到8192的byte数组中
//把该数组中对应位置(前两个字节)的数据转换成字符
System.out.println(data);//字符
r.read();//又读取一个字符的数据,把byte数组中对应位置(索引值2 3)的数据转换成字符
r.read();//又读取一个字符的数据,把byte数组中对应位置(索引值4 5)的数据转换成字符
r.close();
InputStream is = new FileInputStream("b.txt");
is.read();//从磁盘中读取一个字节,真的从磁盘中读取一个字节