概述
一个流(stream)是一个有序的字节序列。当进行输入(读)或输出(写)数据操作时,数据从信息源流向目的地就像水在水管中流淌一样。给水管注入水的一端就是信息源。水流出的端就是目的地。流既可以作为输入流,也可以作为输出的目的地。流中的字节具有严格的顺序,按先进先出要求操作,因此流式I/O是一种顺序存取方法。
IO流是用来处理设备之间的数据传输。
java对数据的操作时通过流的方式。
java用于操作流的对象都在IO包中。
IO流的分类
IO流按照数据流向分为输入流和输出流。
输入流是从某种数据源(如:键盘、磁盘文件、网络等)到程序的一个流,程序可以从这个流中读取数据。程序从外部设备输入数据时要使用输入流。
输出流是从程序到某种目的地(如:键盘、磁盘文件、网络等)的一个流,程序可以将信息写入到这个流。将程序的数据输出到外部设备时要使用输出流。
一个程序可以同时处理多个输入流和输出流,但一个流不能同时即是输入流又是输出流。
IO流按数据类型分为字节流和字符流。
字节流可以读写任何类型的文件。
字符流只能读写文本文件。
字节流
字节流式面向字节的流,流中的数据以8位字节为单位进行读写。
字节流的基本抽象基类:
InputStream和OutpueStream
InputStream是字节输入流,用来读取数据。OutputStream是字节输出流,用来写入数据。
InputStream中的常用方法:
- close()
关闭流 - read()
读取一个字节 - read(byte[] b)
读取一个字节数组 - read(byte[] b, int off, int len)
读取一个字节数组,从指定位置开始到指定位置结束。
OutputStream中的常用方法 - flush()
刷新一下 - write(int b)
写入一个字节 - write(byte[] b)
写入一个字节数组 - write(byte[] b, int off, int len)
写入一个数组的指定位置
FileOutputStream
FileOutputStream是OutputStream抽象类的子类
构造方法:
- FileOutputStream(File file)
此构造需要传入一个File类型对象 - FileOutputStream(String name)
此构造需要传入一个文件的绝对路径或者相对路径 - FileOutputStream(File file, boolean append)
创建一个字节输出流,是否开启追加 - FileOutputStream(String name, boolean append)
创建一个字节输出流,是否开启追加
如果使用FileOutputStream(String name)关联的文件不存在,那么它会自动的创建这个文件。
注意事项:创建字节输出流对象做的事情
- 调用系统资源创建xx.txt文件
- 创建了一个fos对象
- 把fos对象指向这个文件
在每次使用完流之后要关闭。第一是通知系统释放关于管理xx.txt文件的资源。第二是让IO流对象变为垃圾,等待垃圾回收器对其回收。
FileOutputStream的常用方法:
- public void write(int b)
写入一个字节 - public void write(byte[] b)
写入一个字节数组 - public void write(byte[] b,int off,int len)
写入一个字节数组的指定部分。
FileOutputStream如何实现换行:
windows下的换行符只用是 \r\n
Linux \n
Mac \r
使用write方法只能传入一个字节或字节数组,如果要传入一个换行字符串,那么使用getBytes()方法,把换行符转换成字节数组再写入就实现了换行的功能。
FileInputStream
FileInputStream构造方法:
- FileInputStream(File file)
创建一个字节输入流,需要传入一个File类型的对象 - FileInputStream(String name)
创建一个字节输入流,需要传入一个文件的绝对路径或相对路径
FileInputStream的常用方法:
- int read()
读取一个字节 - int read(byte[] b)
读取一个字节数组
注意事项:
在使用FileInputStream和FileOutputStream都会产生异常。我们可以抛出异常也可以捕捉获取异常
案例:复制一个mp3文件
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
public class Demo {
public static void main(String[] args) throws IOException {
FileInputStream in = new FileInputStream("C:/音乐/我曾.mp3");
FileOutputStream out = new FileOutputStream("C:/音乐/我曾2.mp3");
int len=0;
byte[] bytes = new byte[1024 * 8];
while ((len=in.read(bytes))!=-1){
out.write(bytes,0,len);
out.flush();
}
in.close();
out.close();
}
}
BufferedOutputStream和BufferedInputStream
BufferedOutputStream和BufferedInputStream称为高效字节输出流和高效字节输入流。我们在使用FileInputStream和FileOutputStream每一次只能读写一个字节(不创建字节数组的情况),这样效率会很低,所以我们会创建字节数组来提高效率,每次读写一个字节数组速度会变得很快。
java针对这种情况为我们提供了高效字节流,它的底层还是普通的字节流,但是在创建时候,会自动创建缓冲区,也就是字节数组。这样就不需要我们每次使用普通的字节流时主动的创建缓冲区。当然在创建高效字节流时我们要传入一个普通的字节流。