一、IO流
1、定义:
IO流指的是Input/Output流,即输入流/输出流。
输入流:将外界信息写入程序,即从外界获取信息,属于读操作。
输出流:将程序数据发送给外界,即向外界传输数据,属于写操作。
流一定要关闭,否则可能会出现一些异常。
2、分类:
(1)按照功能划分:
输入流:只能读数据,不能写数据。
输出流:只能写数据,不能读数据。
(2)按照处理单元划分:
字节流:读写字节,基类为InputStream/OutputStream。
字符流:读写字符,基类为Reader/Writer。(底层基于字节流进行操作,自动搜寻指定的编码集合并转换)
(3)按照角色划分:
节点流(低级流):直接从外部设备中读写数据。
处理流(高级流):处理一个已存在的流,不单独存在。
3、常用类与接口:
JAVA中I/O处理的相关类库主要存放在 java.io 包中。
基于字节操作的 I/O 类:InputStream 和 OutputStream
基于字符操作的 I/O 类:Reader 和 Writer
基于磁盘操作的 I/O 类:File
关闭I/O流的接口:Closeable
刷新I/O流的接口:Flushable
序列化接口:Serializable
二、字节流
1、字节输入流:
字节输入流的基类是InputStream,常用的子类是FileInputStream、BufferedInputStream。
(1)、InputStream
所有字节输入流的父类。
常用方法:
int read()// 读取并返回1字节数据,若返回-1,表示读到了输入流的末尾。
int read(byte[] b)// 将数据读入一个字节数组,同时返回实际读取的字节数。如果返回-1,表示读到了输入流的末尾。
int read(byte[] b, int off, int len)//将数据读入一个字节数组,同时返回实际读取的字节数。如果返回-1,表示读到了输入流的末尾,off指定在数组b中存放数据的起始偏移位置;len指定读取的最大字节数。
long skip(long n)// 跳过和丢弃此输入流中数据的n个字节
void close()// 关闭此输入流并释放与该流关联的所有系统资源。
(2)、FileInputStream
文件字节输入流,低级流。所有文件在系统中均以字节的形式保存,可以使用FileInputStream去读取保存在硬盘上的字节序列。
在创建时,将文件名作为构造参数来创建FileInputStream,从而与文件间建立起字节流传输通道。
通过read()、read(byte[])、read(byte[], int begin, int len)三种方法从字节流中读取一个字节或一组字节。
常用方法:
继承并重写父类(InputStream)的方法。
构造方法:
FileInputStream(File file)//通过打开一个到实际文件的连接来创建一个FileInputStream,该文件通过文件系统中的File对象file指定
FileInputStream(String name) //通过打开一个到实际文件的连接来创建一个FileInputStream,该文件通过文件系统中的路径name指定
样例:importjava.io.File;importjava.io.FileInputStream;importjava.io.FileNotFoundException;importjava.io.IOException;public classFISDemo{public static voidmain(String[] args) {
FileInputStream fis= null;try{//注:此处的test.txt由自己新建,没有的话会报异常的,此处我在文件内部写了 “hello world”。
fis = new FileInputStream("src" + File.separator + "test.txt");//与文件建立个字节传输通道
byte[] b = new byte[1024];//用于保存从文件读取的字节
try{
System.out.println("开始读取文件");int len = 1;while ((len = fis.read(b)) != -1) {//循环读取文件
String str = new String(b, "utf-8");//将字节数组转为字符串
System.out.println(str);//输出
}if (len == -1) {
System.out.println("文件读取完毕");
}
}catch(IOException e) {
e.printStackTrace();
System.out.println("读取文件异常");
}
}catch(FileNotFoundException e) {
e.printStackTrace();
System.out.println("文件异常");
}finally{try{
fis.close();//关流
} catch(IOException e) {
e.printStackTrace();
System.out.println("系统异常");
}
}
}
}
结果:
开始读取文件
hello world
你好
文件读取完毕
(3)、BufferedInputStream
带缓冲的字节输入流,高级流。若直接从文件中存取字节流,则可能受硬件的影响导致传输速度慢,解决办法:先在内存中建立一个缓冲区,每次将字节流从硬件中读取到缓冲区中,然后从内存中读取字节流。由于计算机与内存的交互速度比磁盘的交互速度快,所以效率会提高。
常用方法:
继承并重写父类(InputStream)的方法。
构造方法:
BufferedInputStream(InputStream in)//创建一个BufferedInputStream并保存其参数,即输入流in,以便将来使用。
BufferedInputStream(InputStream in, int size) //创建具有指定缓冲区大小的BufferedInputStream并保存其参数,即输入流in以便将来使用
样例:
FileInputStream fis= new FileInputStream("src" + File.separator + "test.txt");//与文件建立个字节传输通道
BufferedInputStream bis = new BufferedInputStream(fis);//用于操作字节流
其余操作与FileInputStream类似
2、字节输出流
字节输入流的基类是OutputStream,常用的子类是FileOutputStream、BufferedOutputStream。
(1)、OutputStream
所有字节输出流的父类。
常用方法:
void write(byte[] b)// 将b.length个字节从指定的byte数组写入此输出流
void write(byte[] b, int off, int len)// 将指定byte数组中从偏移量off开始的len个字节写入此输出流
void write(int b)// 将1字节写入此输出流
void close() // 关闭此输出流并释放与此流有关的所有系统资源
void flush() // 刷新此输出流并强制写出所有缓冲的输出字节
(2)、FileOutputStream
文件字节输出流&#