分类
1.按数据流向
- 输入流
- 输出流
- 按数据类型
- 字节流
- 字符流
IO流常用基类
- 字节流的抽象基类:InputStream,OutputStream
- 字符流的抽象基类:Reader,Writer
这四个类的子类都以他们为名字结尾
由于他们都是抽象的类,无法实例化,因此需要寻找他们的子类
FileOutputStream 写入/输出数据字节流
构造方法
FileOutputStream(File file) 参数为File类型的对象
FileOutputStream(File file,boolean append) 参数为File类型的对象,若append为true,则在文件末尾继续写
FileOutputStream(String name) 参数为路径
写入数据
-步骤:1. 创建流对象 2. 写数据 3.释放资源
public void write(byte[] b) 将字节数组写入文件
public void write(byte[] b, int off, int len) 将字节数组的一部分写入文件,从off开始,写len个
public void write(int b) 写一个字节,根据编码表找到对应字符,如97对应a
实现换行
write("\n".getBytes()); 写入换行符 “\n” 的字节
注意:可能通过某些软件打开会发现没有换行,是因为不同操作系统的换行符不同,但高级记事本软件可以识别任意换行符
异常处理
标准写法
FileOutputStream fos = null;
try {
fos = new FileOutputStream("fos2");
fos.write("Java".getBytes());
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally {
if(fos!=null){
try {
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
FileInputStream 字节流读入数据
构造方法
FileInputStream(File file) 参数为File类型的对象
FileInputStream(String name) 参数为路径
读入数据
public int read() 从该输入流读取一个字节的数据,如果返回是-1,则读完了
public int read(byte[] b) 一次读一个字节数组的数据,返回读到的字节个数
计算机如何识别中文?
在计算机中,中文占两个字节,第一个字节一定是负数
自带数组的IO流
BufferedOutputStream 自带缓冲区的流,BufferedInputStream 自带缓冲区的流
构造函数
public BufferedInputStream(InputStream in) 创造默认大小的流
public BufferedInputStream(InputStream in,int size) 创建指定大小的流
public BufferedOutputStream(OutputStream out) 创造默认大小的流
public BufferedOutputStream(OutputStream out,int size) 创建指定大小的流
为什么要传递一个流对象,而不传递一个具体的文件或文件路径呢?
此流仅仅提供缓冲区,真正读写还需要基本的流对象实现
OutputStreamWriter 写入/输出数据字符流,从字节流到字符流的桥
构造函数
public OutputStreamWriter (OutputStream out) 参数为OutputStream 对象,可以用子类对象入FileOutputStream
public OutputStreamWriter (OutputStream out,String charsetName) charsetName 为编码名称
方法
public void write(int c) 写一个字符
public void write(char[] cbuf) 写一个字符数组
public void write(char[] cbuf,int odd,int len) 写一个字符数组的一部分
public void write(String str ) 写一个字符串
public void write(String str,int odd,int len) 写一个字符串的一部分
public void flush() 刷新
InputStreamReader 读取数据字符流,从字节流到字符流的桥
构造函数
public InputStreamReader (InputStream in) 参数为InputStream 对象,可以用子类对象入FileInputStream
public InputStreamReader (InputStream in,String charsetName) charsetName 为编码名称
方法
public int read(int c) 读一个字符,没读到返回-1
public int read(char[] chs) 读一个字符数组,结果在chs数组中,返回读到的长度,没读到返回-1
FileWriter 和FileReader
在使用本地默认编码表时,使用这两个字符流的类
FileWriter 继承 OutputStreamWriter ,FileReader 继承 InputStreamReader ,使用方法如上
字符缓冲流BufferedWriter和BufferedReader
特殊功能
BufferedWriter : public void newLine() 产生一个新的行
BufferedReader : public String readLine() 一次读取一行,将读到的内容以String 返回,若没有读到,返回null