IO流
I :input,输入
O :output,输出
流 :一种抽象概念,对数据传输的总称,即 数据在设备之间的传输流。
- 流的本质:数据传输
PS:IO流要存在异常 IOException,要么抛出,要么try catch
一、IO流分类及抽象基类
(一)IO流的分类
- 根据数据流向
- 输入流
- 输出流
- 根据数据类型[一般用数据类型]
- 字节流【万能的流】
- 字节输入流 [ InputStream ]
- FileInputStream
- BufferedInputStream
- 字节输出流 [ OutputStream ]
- FileOutputStream
- BufferedOutputStream
- 字节输入流 [ InputStream ]
- 字符流
- 字符输入流 [Reader]
- InputStreamReader----------简写-----------FileReader
- BufferedReader
- 字符输出流 [Writer]
- OutputStreamWriter----------简写-----------FileWriter
- BufferedReader
- 字符输入流 [Reader]
- 使用场景
- 纯文本文件--------------------------->字符流
- 图片、视频等二进制文件-------->字节流
- 不确定文件类型--------------------->字节流
- 字节流【万能的流】
(二)IO流的抽象基类【4个】
1.字节流抽象基类
- InputStream
- OutputStream
2.字符流抽象基类
- Reader
- Writer
**PS : **这四个类派生的子类都以父类名作为子类名的后缀。如:InputStream----------> FileInputStream
Reader ----------> FileReader
二、字节流
抽象基类:InputStream OutputStream
(一)FileOutputStream
1、构造方法
public FileOutputStream(File file) //路径名
public FileOutputStream(String name) //File对象
如果第二个参数是true ,则字节将写入文件的末尾而不是开头 即 实现追加。
2、写数据的方法
public void write(int b)
public void write(byte[] b)
public void write(byte[] b,int off,int len)
3、释放资源
字节输出流对象.close();
4、补充
如果是字符串要写入呢?可以通过 getBytes() 方法,得到字符串对应的 byte
(二)FileInputStream
1、构造方法
public FileInputStream(File file)
public FileInputStream(String name)
2、读数据的方法
public int read()
public int read(byte[] b)
public int read(byte[] b, int off, int len)
3、释放资源
字节输入流对象.close();
三、字符流\转换流
抽象基类:Writer Reader
(一)OutputStreamWriter
1、构造方法
public OutputStreamWriter(OutputStream out)
public OutputStreamWriter(OutputStream out,String charset)
2、写数据的方法(throws IOException)
public void write(int c) //写入的其实是int c对应的ASCII表的字符
public void write(char[] chs)
public void write(char[] chs,int off,int len )
public void write(String s)
public void write(String s,int off,int len)
//写完数据可以刷新一下
public void flush()
3、释放资源
字符输出流对象.close();
4、flush()与close()
flush() : 刷新流 / 缓冲区,刷新完还可以接着写入数据
close() : 关闭流并释放资源,会刷新一次缓冲区,再关闭,关闭后不能写入数据
5、代码
//字符输出流
public class OutputStreamWriterDemo{
Public static void main(String[] args) throws IOException{
//一、创建对象
OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream(".."));
//二、写数据
//方法1、public void write(int c) //写入的其实是int c对应的ASCII表的字符
osw.write(97); //输出a
//方法2、public void write(char[] chs)
char[] ch = {'a','b','c'};
osw.write(ch); //输出abc
//方法3、public void write(char[] chs,int off,int len )
osw.write(ch,0,1); //输出a
//方法4、public void write(String s)
osw.write("123好"); //输出123好
//方法5、public void write(String s,int off,int len)
osw.write("123赵云澜",0,5); //输出123赵云
//三、释放资源
osw.close();
}
}
(二) InputStreamReader
1、构造方法
public InputStreamReader (InputStream in)
public InputStreamReader (InputStream in,String charsetName)
public InputStreamReader (InputStream in,charset cs)
public InputStreamReader (InputStream in,charseDecoder dec)
2、读数据的方法
public int read() //读一个字符 结果:下一个 数据字符char
public int read(char[] cbuf) //读一个字符数组 结果:读到的 总字节数
3、释放资源
字符输入流对象.close();
4、代码
public class InputStreamReaderDemo{
Public static void main(String[] args){
//一、创建对象 本地文本文件是utf-8编码的,eclipse默认gbk,所有需要设置解码方式
InputStreamReader isr = new InputStreamReader(new FileInputStream("a.txt"),"utf-8");
//二、读数据
//1、一次读一个字符,read()从输入流中读取 下一个 数据字符char。
// int len;
// while((len=isr.read())!=-1){
// System.out.println((char)len);
// }
//2、一次读一个字符数组char[],返回的是读到的 总字节数
//int read(byte[] b)从输入流中读取一些字节数并将它们存储到缓冲区数组 b 。
//结果: 读入缓冲区的 总字节数 ,如果由于已到达流末尾而没有更多数据, -1 。
int len;
char[] b = new char[1024];
while((len=isr.read(b))!=-1){
String s = new String(b,0,len); //读出的字符数组转换为字符串
System.out.println(s);
}
//三、释放资源
isr.close();
}
}
(三)简写
转换流的名字比较长,而我们常见的操作都是按照本地默认编码实现的,所以,为了简化我们的书写,转换流提供了对应的子类。
OutputStreamWriter------------>FileWriter
InputStreamReader------------>FileReader
1、FileWriter
用于写入字符文件的方便类。该类的构造函数假定默认字符编码和默认字节缓冲区大小是可以接受的。指定这些值在一个自己构建一个OutputStreamWriter。
(1)构造方法
public FileWriter(File file)//构建了一个文件对象FileWriter对象
public FileWriter(File file,boolean append)//true,然后字节将写入末尾
FileWriter(FileDescriptor fd) //构建了一个文件
FileWriter(String fileName, boolean append) //构造FileWriter对象给出一个文件名和一个布尔值,判断是否附加写入
(2)写数据的方法
write(int c) //写一个字符
write(char[] cbuf) //写一个字符数组
writer(char[] cbuf, int off, int len)//写一个字符数组的一部分
write(String str) //写一个字符串
write(String str, int off, int len) //写一个字符串的一部分
//写完可刷新一下
public abstract void flush() //冲流
(3)释放资源
public abstract void close();
2、FileReader
(1)构造方法
FileReader(File file)
FileReader(String fileName)
(2)读数据方法
同InputStreamReader的方法
//可以刷新
public abstract void flush() //冲流
(5)释放资源
public abstract void close();
(四)字符缓冲出流Bufferedwriter
1、构造方法
public void BufferedWriter(Writer out)
public void BufferedWriter(Writer out,int sz)//缓冲区的大小
2、写数据的方法
write(int c) //写一个字符。
write(char[] cbuf, int off, int len) //写入一个字符数组的一部分。
write(String s, int off, int len) //写入字符串的一部分。
newLine() //写行分隔符。
3、释放资源
对象.close()
特殊方法
public String readLine() //读一行 输出string
public void newLine() throws IOException //写一个行分隔符
public void write(String s) //读出的一行字符串,可以直接写入
三、序列流
可以把多个字节输入流整合为一个,从序列流中读取数据时,将从被整合的第一个流开始读
使用方式
整合两个输入流
SequenceInputStream(InputStream s1,InputStream s2)
SequenceInputStream
SequenceInputStream
表示其他输入流的逻辑串联。 它从一个 有序的输入流集合 开始,从第一个读取到文件结束,然后从第二个读取,依此类推,直到最后一个包含的输入流到达文件末尾。
1、构造方法
SequenceInputStream(InputStream s1,InputStream s2)
SequenceInputStream(Enumeration<? extends InputStream> e)
2、方法
//读取数据
public int read() throws IOException //结果 数据的下一个字节,如果到达流的末尾, -1 。
read(byte[] b, int off, int len) //从这个输入流读取到下一个数据字节
//释放资源
public void close() throws IOException //关闭此输入流并释放与该流关联的所有系统资源。
补充:
一、为什么要关闭资源
1.让输出 / 入流 对象变成垃圾,以便垃圾回收器回收
2.关闭系统资源,以免影响程序的运行速度