什么是流:
- IO 流的 I 指 input,表示输入,O 指 output,表示输出。
- 流就是⼀组有序的数据序列,以先进先出的⽅式发送数据的通道。
Java中的流有很多种不同的分类:
- 按照⽅向分,可以分为输⼊流和输出流。 如何判断输⼊还是输出,站在Java程序⻆度,看数据是从外界来到Java中呢还是从Java中输出到外界,外届-Java 就是输⼊流, Java-外界 就是输出流。
- 按照单位分,可以分为字节流和字符流。 字节流指每次处理数据都是以字节为单位,字符流是指每次处理数据都是以字符为单位。
- 按照功能分,可以分为节点流和处理流。
InputStream 常用方法
InputStream是java.io包中的顶层⽗类,实现了Closeable接⼝,该接⼝的作⽤是每次操作结束之后释放资源
public abstract class InputStream implements Closeable
public abstract int read() 以字节为单位读取数据
public int read(byte b[]) 将数据存入 byte 类型的数组中,并且返回数据长度
public byte[] readAllBytes() 将数据存入 byte 类型的数组中返回
public int read(byte b[],int off,int len) 将数据存入 byte 类型的数组的指定区间中,并返回数据长度
public int available() 返回当前数据流中未读取的数据个数
public void close() 关闭当前输入流对象
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
public class Test2 {
public static void main(String[] args) {
File file = new File("C:/Users/73981/Desktop/test.txt");
try {
InputStream inputStream = new FileInputStream(file);
int temp = 0;
try {
System.out.println("当前未读取的数据个数"+inputStream.available());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("开始读取");
while((temp = inputStream.read())!=-1) {
System.out.println(temp);
System.out.println("当前未读取的数据个数"+inputStream.available());
}
inputStream.close();
System.out.println("**********************************");
inputStream = new FileInputStream(file);
byte[] bytes = new byte[6];
int length = inputStream.read(bytes);
System.out.println("数据长度"+length);
System.out.println("遍历byte数组");
for(byte b:bytes) {
System.out.println(b);
}
inputStream.close();
System.out.println("*********************************");
inputStream = new FileInputStream(file);
bytes = new byte[10];
length = inputStream.read(bytes, 2, 3);
System.out.println("数据长度"+length);
System.out.println("遍历byte数组");
for(byte b:bytes) {
System.out.println(b);
}
inputStream.close();
System.out.println("**********************************");
inputStream = new FileInputStream(file);
bytes = inputStream.readAllBytes();
System.out.println("遍历 byte 数组");
for(byte b:bytes) {
System.out.println(b);
}
inputStream.close();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
OutputStream 常用方法如下:
public abstract write(int b) 以字节为单位写数据
public void write(byte b[]) 将 byte 类型数组中的数据写出
public void write(byte b[],int off,int len) 将 byte 类型数组中指定区间的数据写出
public void flush() 可以强制将缓冲区的数据同步到输出流中
public void close() 关闭数据流
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
public class Test {
public static void main(String[] args) {
File file = new File("C:/Users/73981/Desktop/test.txt");
try {
OutputStream outputStream = new FileOutputStream(file);
try {
byte[] bytes = {105,111,99};
outputStream.write(bytes,1,2);
outputStream.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
以下为拓展部分:
- 实际开发中不能直接实例化InputStream,因为它是⼀个抽象类,应该实例化其实现了抽象⽅法的⼦类, FileInputStream
- FileInputStream的实例化就相当于⼀根连接到某个⽂件的管道,通过该管道就可以把⽂件中的数据取出读取到Java程序中, FileInputStream只能连接⽂件,不能连接⽬录,否则会抛出FileNotFoundException。
- read()读取数据,每⼀此read()返回值就是⼀个字节的数据,如果取出的数据为-1,则表示该⽂件的所有的数据已经全部取出。
- 以字节为单位的输入流的框架图:
(01) InputStream 是以字节为单位的输入流的超类。InputStream提供了read()接口从输入流中读取字节数据。
(02) ByteArrayInputStream 是字节数组输入流。它包含一个内部缓冲区,该缓冲区包含从流中读取的字节;通俗点说,它的内部缓冲区就是一个字节数组,而ByteArrayInputStream本质就是通过字节数组来实现的。
(03) PipedInputStream 是管道输入流,它和PipedOutputStream一起使用,能实现多线程间的管道通信。
(04) FilterInputStream 是过滤输入流。它是DataInputStream和BufferedInputStream的超类。
(05) DataInputStream 是数据输入流。它是用来装饰其它输入流,它“允许应用程序以与机器无关方式从底层输入流中读取基本 Java 数据类型”。
(06) BufferedInputStream 是缓冲输入流。它的作用是为另一个输入流添加缓冲功能。
(07) File 是“文件”和“目录路径名”的抽象表示形式。关于File,注意两点:
a), File不仅仅只是表示文件,它也可以表示目录!
b), File虽然在io保重定义,但是它的超类是Object,而不是InputStream。
(08) FileDescriptor 是“文件描述符”。它可以被用来表示开放文件、开放套接字等。
(09) FileInputStream 是文件输入流。它通常用于对文件进行读取操作。
(10) ObjectInputStream 是对象输入流。它和ObjectOutputStream一起,用来提供对“基本数据或对象”的持久存储。
- 以字节为单位的输出流的框架图:
- 以字节为单位的输入流和输出流关联的框架图: