IO流用来处理设备之间的数据传输(上传文件和下载文件)
java对数据的操作是通过流的方式
java用于操作流的对象都在IO包中
IO流分类
按照数据流向
输入流 ,读入数据
输出流 ,写出数据
按照数据类型
字节流
字符流
什么情况下使用哪种流呢
如果数据所在的文件通过Windows自带的记事本打开并能读懂里面的内容,就用字符流其他用字节流
IO流的常用基类
字节流的抽象基类
InputStream OutputStream
字符流的抽象基类 (字符流=字节流+编码表)
Reader Writer
注:这四个类派生出来的子类名称都是以其父类名做为子类名称的后缀
如InputStream的子类FileInputStream
如Reader的子类FileRader
字节流输出流的操作步骤
A 创建字节输出对象
B 写数据
C 释放资源
为什么一定要close(呢)?
1.让流对象变成垃圾,这样可以被垃圾回收站回收啦
2.通知系统去释放跟该文件相关的资源
字节流写数据的方式
FileOutputStream(String name,boolean append)
FileOutputStream(File file,boolean)
如果参数append的值为true时 输入流的write()方法将在文件的末尾追加写入数据(假设文件已经存在),如果append的参数为false,输入流的write()方法将会刷新文件(假设文件已经存在),如果不设置append的值时 默认为false。
public void write(int b)
public void write(byte[] b)
public void write(byte[] b,int off,int len)
字节流读取数据
InputStream
FileInputStream
把刚才写的数据读取出来显示在控制台上
FileInputStream的构造方法
FileInputStream(File file)
FileInputStream(String name)
FileInputStream的成员方法
public int read()
public int read(byte[] b)
计算机中是如何识别什么时候该把两个字节转换为一个中文呢
第一个字节肯定是负数
第二个字节常见的是负数,可能有正数,但是没影响
方式一:一次读取一个字节
FileReader fr=new FileReader("a.txt");
int by=0;
while((by=fr.read())!=-1){
system.out.ptint((char) by);
}
fr.close();
方式二:一次读入一个字节数组
FileReader fr=new FileReader("a.txt");
byte[] bys=new byte[5];
int len=0;
while((len=fr.read(bys))!=-1){
System.out.print(new String(bys,0,len));
}
fr.close();
字节缓冲流
字节流一次读写一个数组的速度明显比一次读写一个字节的速度快很多,这是加入了数组这样的缓冲区的效果,java本身在设计的时候也考虑到了这样的设计思想(装饰设计模式)所提供的字节流缓冲区流
字节缓冲输出流
BufferedOutputStream
字节缓冲输入流
BufferedInputStream
字节流四种方式复制文件
基本字节流一次读一个字节
基本字节流一次读写一个字节数组
高效字节流一次读写一个字节
高效字节流一次读写一个字节数组
OutputStreamWriter的方法
public void write(int c); 写一个字符
public void write(char[] cbuf); 写一个字符数组
pubic void write(char[] cbuf,int off,int len); 写一个字符数组的一部分
public void write(String str) 写一个字符串
public void write(String str,int off,int len);写一个字符串的一部分
面试题:close()和flush()的区别
close()关闭流对象,但是先刷新一次缓冲区,关闭之后流对象不可以在使用
flush()仅仅刷新缓冲区 刷新之后,流对象还可以继续使用
OutputStreamWriter 读数据方法
InputStreamReader 读数据方法
public int read();
public int read(char[] cbuf)