Io概述
输入和输出的概念
- 输入:input
- 从其他设备到内存的过程
- 输出:output
- 从内存到其他设备的过程
I\O流
- 说明:
- jdk提供的一些比较简单的手段来完成输入和输出,将这些手段封装到某些对象中,称为流对象,I\O流
- java中操作输入和输出的,都是使用io包中的流类型
I\O分类
-
根据上述两种分类方式有四种顶层的抽象父类:
- 字节流:
- 字符输入流:InputStream
- 字节输出流:OutputStream
- 字符类:
- 字符输入流:Reader
- 字节输出流:Writer
- 字节流:
Io程序书写的注意事项
-
在程序书写之前:
- 导包:java.Io.xxx;
-
书写中:
- 处理或者声明异常
-
书写后:
- 关闭流对象
字节流
概述:
- 含义:
- 用于操作中字节数据的流对象
- 说明:
- 计算机中的一切数据都是字节数据,因此字节流可以处理一切数据
- 顶层父类:
- 字符输入流:InputStream
- 字节输出流:OutputStream
inputStream
- 常用方法:
-
abstract int read()
- 从输入流中读取数据的下一个字节。
- 如果因为已经到达流末尾而没有可用的字节,则返回值 -1
-
int read(byte[] b)
- 从输入流中读取一定数量的字节,并将其存储在缓冲区数组 b 中。
-
int read(byte[] b, int off, int len)
- 将输入流中最多 len 个数据字节读入 byte 数组。
-
void close()
- 关闭此输入流并释放与该流关联的所有系统资源。
-
int available()
- 返回此输入流下一个方法调用可以不受阻塞地从此输入流读取(或跳过)的估计字节数。
-
FileinputStream
- 方法:
- 继承自InputStream类
OutputStream
- 含义:
- 字节输出流的顶层父类
- 是一个抽象类
FileOutptStream
- 说明:
- 构造方法摘要
-
FileOutputStream(File file)
- 创建一个向指定 File 对象表示的文件中写入数据的文件输出流。
-
FileOutputStream(File file, boolean append)
- 创建一个向指定 File 对象表示的文件中写入数据的文件输出流。
- 如果第二个参数为 true,则将字节写入文件末尾处,而不是写入文件开始处(清空该文件写入)
-
FileOutputStream(FileDescriptor fdObj)
- 创建一个向指定文件描述符处写入数据的输出文件流,该文件描述符表示一个到文件系统中的某个实际文件的现有连接。
-
FileOutputStream(String name)
- 创建一个向具有指定名称的文件中写入数据的输出文件流。
-
FileOutputStream(String name, boolean append)
- 创建一个向具有指定 name 的文件中写入数据的输出文件流。
-
文件拷贝
-
方式:
- 使用字节输出输出流
FileInputStream fis = new FileInputStream("a.txt");
FileOutputStream fos = new FileOutputStream("a_copy.txt");
int b;
while((b = fis.read()) != -1) {//判断a.txt还有没有字节
fos.write(b);//将字节b写在fos a_copy.txt
}
文本拷贝效率提升
- 情况:
- 字节流拷贝是一个字节一个字节的拷贝,
需要读取和写出的次数就会非常多,称为“I\o频繁”,效率非常低,速度非常慢 - 利用数组拷贝,以此将源文件所有的字节,读取到数组中,一次将数组中的字节写到目标文件,效率非常高。(但是这种一般都不太现实,以为要考虑到内存的大小,有的不能一次将文件存储到内存中)
- 利用小数组,每次拷贝文件的一部分,通过循环,将文件的所有数据拷贝到目标文件
- 这样的优势:不需要一个字节一个字节的拷贝,拷贝次数少,效率比较高 ,数组长度使用1024的整数倍会比较好分配,一般使用1024*8效率最高
- 字节流拷贝是一个字节一个字节的拷贝,
@SuppressWarnings("resource")
FileInputStream fis = new FileInputStream("a.txt");
@SuppressWarnings("resource")
FileOutputStream fos = new FileOutputStream("a_copy.txt");
byte[] b = new byte[1024 * 8];
int len;
while((len = fis.read(b)) != -1) {
fos.write(b, 0, len);
}
//关流
fis.close();
fis.close();
高校缓冲流
-
原理:
- 在该对象的底层定义了一个大小为8192个字节的数组,当第一次调用read()方法是,本来是读取一个字节,但是Bufferdeinputstream直接读取了8192个字节到数组,并且将第一个字节返回给调用者。第2次~第8192次,读取read()方法时,就不需要再在磁盘中读取啦,可以直接冲数组中取出一个现成的字节返回。和磁盘的交互少了8千多次,效率提高。
高效缓冲输出字节流的flush和close方法
字符流
使用字节流处理字符
- 使用直接流写出字符:
- 可以完成,但是要先将字符串的内容,编码形成字节数组,然后才能通过字节流输出字节数组
- 字符流:
- 字符流也是通过将字符转换成字节后,再利用字节流输出
字符流概述
- 含义:
- 可以直接处理字符的流对象,程序员可以通过从字符输入流获取一个完整的字符,写入到目标设备
- 分类:
- 字符输入流:reader
- 字符输出流: writer
Reader
-
定位:
- 字符输入流的顶层抽象父类
-
常用功能:
- int read()
- 读取一个完整的字符,并返回,如果返回-1,表示没有读取到任何字符,到达文件末尾
- int read()
-
int read(char[] cbuf)
- 将字符读入数组。
-
abstract void close()
- 关闭该流并释放与之关联的所有资源。
FileReader
- Reader的一个子类继承Reader所有的方法
FileReader fr = new FileReader("a.txt");
int b;
while((b = fr.read()) != -1) {
System.out.println((char)b);
}
fr.close();
Writer
-
字符输出流的顶层父类
-
常用功能:
- writer(int c)
- 将参数指定的字符,写入到目标文件
- int是32位,只把后面的16位写出,前16被干掉
- writer(char【】 chs)
- 将字符数组的全部写写入到目标文件
- writer(int c)
-
abstract void write(char[] cbuf, int off, int len)
- 写入字符数组的某一部分。
-
void write(String str)
- 写入字符串。 -
void write(String str, int off, int len)
-
写入字符串的某一部分。
-
FileWriter
- 定位:
writer的子类和磁盘文件系统交互,可以将字符写出到文件中
字符流的拷贝
FileReader fr = new FileReader("a.txt");
FileWriter fw = new FileWriter("a_copy.txt");
int b;
while((b = fr.read()) != -1) {
fw.write(b);
}
fr.close();
fw.close();
- 字符流拷贝的必要性:
- 不需要使用字符流拷贝
字符流不能拷贝非文本文件
字符高效缓冲流
- 类型:
- BufferedReader和BufferedWriter
- BufferedReader和BufferedWriter
字符高效缓冲流的特有方法
BufferedReader bf =
new BufferedReader(new FileReader("a.txt"));
BufferedWriter bw =
new BufferedWriter(new FileWriter("a_copy.txt"));
String line;
while((line = bf.readLine()) != null) {
bw.write(line);
bw.newLine();
}
bf.close();
bw.close();