一、IO流的介绍
IO流:指的用来承载数据进出内存的流,【负责把数据从一个地方运输到另一个地方的方式】
作用:运输数据
分类:
流向: 输入流 和输出流
性能划分【处理数据的单位】: 字节流 和字符流
io流类的使用流程:
1、导包【IO流的类基本上都jdk提供的类】
2、创建IO流对象并去处理携带来的异常
3、使用IO流对象调用相关的功能对数据进行操作
4、关闭流对象
二、字节流
- 在使用IO流对数据进行传输的时候以字节为单位操作数据的流就叫做字节流
-
分类:字节输入流和字节输出流
1、字节输入流【InputStream】
介绍:他是字节输入流的顶层父类,是一个抽象类,定义所有字节输入流的共性功能和属性
常用功能:
1、int read():一次读取一个字节数据到内存
2、int read(byte[] bytes):使用字节数组去读取多个字节的内容到内存
3、int available():返回未读取的字节的个数
4、close():关闭流
注意:InputStream类是一个抽象类,不能创建对象,只能是它的子类去使用它的功能,根据设备的不同,对应的子类也不同
最常用的子类文本字节输入流【FileInputStream】
FileInputStream
介绍:是InputStream的子类,负责完成内存和磁盘文本文件之间数据的输入交互的操作。输入功能都是InputStream的功能。
构造方法:
FileInputStream(File file):创建一个可以读取指定File对象对应的文件的字节输入流对象 FileInputStream(String path):创建一个可以读取指定路径对应的文件的字节输入流对象
注意事项:
1、同一个字节输入流对象每读取一个字节,光标向后移动一位,每次以光标位置去读取 ;
2、所有的字节数读取完毕继续读取的时候得到的是 -1.
代码示例:
public static void main(String[] args) {
FileInputStream inputStream = null;
try {
inputStream = new FileInputStream("Item/mm/miao/tt.txt");
int read = inputStream.read();
System.out.println(read);//这样读取的是字节数
System.out.println((char)read);//须转为字符
//判断文件中未读取字节的个数
int available = inputStream.available();
System.out.println(available);
//用字节数组去读取文件内容,数组指定大小即可
byte[] bytes = new byte[1024];
int read1 = inputStream.read(bytes);
System.out.println(new String(bytes, 0, read1));
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally{
if(inputStream != null) {
//读取完毕,关流
try {
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
2.字节输出流【OutputStream】
介绍:是字节输出流的顶层父类,是一个抽象类,定义了所有的字节输出流的共性功能,
常见的子类:文本字节输出流【FileOutputStream】
常用功能:
void write(int b):输出字节内容到指定的目标文件中
void write(byte[] arr):输出字节数组中所有的字节内容到目标文件中
void write(byte[] arr, int offset, int len):输出字节数组中指定范围的字节内容到目标文件中 offset:输出的字节内容的开始索引值
len:输出的字节个数
void close():关闭流
FileOutputStream
概述:文本字节输出流,是OutputStream的子类,负责内存和磁盘文件之间的数据的输出交互的流,功能都是OutputStream的功能
构造方法:
FileOutputStream(File file):创建以指定File对象对应的文件为目标文件的字节输出流对象
FileOutputStream(String path):创建以指定path路径对应的文件为目标文件的字节输出流对象
注意事项:字节输出流对象创建的时候指定的目标文件不存在,则会自动的给创建文件【前提:文件所在的目录在磁盘真实存在的】 字节输出流对象创建的时候指定的目标文件存在,则会对已经存在的文件进行格式化
代码示例:
public class IoStreamText {
public static void main(String[] args) {
FileOutputStream fos = null;
try {
fos = new FileOutputStream("Item/mm/miao/tt.txt");
fos.write("afafjsafas".getBytes());
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally {
if(fos != null) {
try {
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
追加续写
输出数据到目标文件时,想要保留文件原有的数据,并在该数据的后面输出数据需要使用到另一个输出流的构造方法【续写功能】
FileOutputStream(String path,boolean b):
FileOutputStream(File file,boolean b): 参数b必须是true,才是追加续写的对象。
FileOutputStream fos = new FileOutputStream("Item/mm/miao/tt.txt", true);
文件拷贝
-
分析:使用字节输入流把源文件的数据读取到内存中,然后通过字节输出流把读取到的数据原封不动的写出到目标文件 文件中的字节数可能一次读取不完。需要读取多次一直到读取完毕。
-
注意:每次读取完必须及时的写出去。 一边读一边写需要在循环中完成: 读取的返回值为-1,则读写完毕!
-
代码示例
package com.tlc.io.file; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; public class IoStreamText { public static void main(String[] args) { //创建一个字节输入流对象---我们一图片拷贝为例 FileInputStream fis = null; //创建一个字节输出流对象 FileOutputStream fos = null; try { fis = new FileInputStream("Item/mm/miao/1.jpeg"); fos = new FileOutputStream("Item/mm/tt.jpeg"); //创建一个字节数组存储拷贝的数据 byte[] bytes = new byte[1024]; //读取文件数据 int len; //使用whlie循环完成拷贝 while((len = fis.read(bytes)) != -1) { //边读边写,每次写入数组读取的字节 fos.write(bytes, 0, len); } } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); }finally { if(fos != null) { try { //后开的输出流先关闭 fos.close(); } catch (IOException e) { e.printStackTrace(); } } if(fis != null) { try { //关闭输入流 fis.close(); } catch (IOException e) { e.printStackTrace(); } } } } }
3.字节缓冲流【字节高效率】
-
概述:用来对字节流进行提升效率的一个流,本身没有读写的功能,字节缓冲流要想使用前提是必须要有字节流
-
作用:对字节流进行修饰提效的。
-
分类:
-
字节输出缓冲流【BufferedOutputStream】
-
字节输入缓冲流【BufferedInputStream】
-
构造方法:
-
BufferedInputStream (InputStream is):创建一个以is为提升目标的字节输入缓冲流对象
-
BufferedOutputStream(OutputStream os):创建一个以os为提升目标的字节输出缓冲流
-
字节输出缓冲流的特有方法:flush():刷新缓冲区。
-
flush方法和close方法的区别:
-
1、flush方法只是用来刷新字节输出缓冲流的缓冲区内容的方法,调用之后流对象还可以继续使用;
-
2、close方法用来关闭流对象,默认先调用flush方法刷新缓冲区后,流对象关闭就不能再继续使用了。
-
代码示例:
字节缓冲流高效原理
-
字节输入缓冲流:
-
使用字节输入缓冲流读取目标文件中数据的时候,缓冲流对象一次性从目标文件中读取【8192】个字节内容回来之后再在内存中创建一个8192个长的字节缓冲区来存放这些字节,接下来缓冲流在读取内容的时候其实是使用内部字节输入流按照read方法从缓冲区中读取字节进入到内存的目标处。这样减少了读取时内存和磁盘文件的交互次数,从而提效。
-
字节输出缓冲流:
-
字节输出缓冲流第一次输出内容的时候,没有把内容直接输入到目标文件中去,先在内存中创建一个8192长的字节缓冲区,使用内部字节输出流按照write方法写出字节数到缓冲区,等缓冲区全部写满,自动的把8192个字节内容一次性的写入目标文件中。 缓冲区如果没有写满,可以调用flush方法将缓冲区内容强制写入目标文件中。
-