一、流的定义
流就是程序和设备之间嫁接起来的一根用于数据传输的管道,这个管道上有很多按钮,不同的按钮可以实现不同的功能(这根带按钮的用于数据传输的管道就是流,流就是一根管道)。
(有点像c用的fopen和fgets)
二、流的分类标准:
- java.io包中定义了多个流类型(类或抽象类)来实现输入/输出功能:可以从不同的角度对其进行分类:
- 按数据流的方向不同可以分为输入流和输出流;
- 按处理数据单位不同可以分为字节流和字符流;
- 按照功能不同可以分为节点流和处理流。
- 所有位于java.io包内的流类型都分别继承自以下四种抽象流类型:
字节流 | 字符流 | |
---|---|---|
输入流 | InputStream | Reader |
输出流 | OutputStream | Writer |
三、四大基本抽象流
- InputStream 和OutputStream 读写数据的单位是一个字节
- Reader 和Writer 读写数据的单位是一个字符
- 在Java中一个字符占两个字节
字节流 | 字符流 | |
---|---|---|
输入流 | InputStream | Reader |
输出流 | OutputStream | Writer |
(凡是以stream结尾的都是字节流)
- InputStream、OutputStream 、Reader、Writer 都是抽象类,或者说都是抽象流,通常使用的都是它们的子类
四、节点流(也叫原始流)和处理流(也叫包裹流)
- 流与类的关系:
如果一个类是用作设备和程序之间的数据传输,则这个类有一个新的名字叫流(流一定是类,但类不一定是流)。
五、InputStream 流中常用的方法
public int read() throws IOException;
- 读取一个字节并以整数形式返回,
- 如果读取到输入流的末尾则返回-1。
public int read(byte b) throws IOException;
- 从输入流中读取一定数量的字节,并将其存储在缓冲区数组 b中。以整数形式返回实际读取的字节数
- 如果 b的长度为0,则不读取任和字节并返回0;如果因为流位于文尾而没有可用的字节,则返回值-1:
例如:
FilelnputStream fis = new FilelnputStream("d:llsharellerrorlog.txt");
len=fis.read(buf);
//从fis流所关联的 d:llsharellerrorlogtxt 文件中读取数据,
//并将读取出来的数据写入buf数组中,返回值是实际写入buf数组的字节个数,
//如果读取到文件的结尾,则返回-1
package com.ittanya.demo1;
import java.io.FileReader;
import java.io.IOException;
public class TestFileReader {
public static void main(String[] args)throws IOException {
FileReader fr=new FileReader("D:\\ideaProjects\\basic code\\javaday\\src\\com\\ittanya\\demo1\\TestFileReader.java");
int ch;
ch=fr.read();
while(-1!=ch){
//读的是二进制数据
System.out.printf("%c",(char)ch);
ch=fr.read();
}
fr.close();
}
}
运行结果: