JAVA核心包 java.io包介绍
介绍什么是IO,在开发中的使用场景
- Input / Output 即输入 / 输出
- 输入流:程序(内存)-> 外界设备
- 输出流:外界设备–>程序(内存)
- 处理数据类型分类
- 字符流:处理字符相关,如处理⽂本数据(如txt⽂件), Reader/Writer
- 字节流:处理字节相关,如声⾳或者图⽚等⼆进制,InputStream/OutputStream
字节流和字符流的区别
字节流以字节(8bit)为单位,字符流以字符为单位,根据码表映射字符,⼀次可能读多个字节,字节流可以处理⼏乎所有⽂件,字符流只能处理字符类型的数据
功能不同,但是具有共性内容,通过不断抽象形成4个抽象类,抽象类下⾯有很多⼦类是具体的实现
- 字符流 Reader/Writer
- 字节流 InputStream/OutputStream
Java IO包之缓冲Buffer输⼊输出流
解缓存输⼊流BufferInputStream,和缓冲输出流BufferOutputStream
- 是缓冲 Buffer 它是内存空间的⼀部分,在内存空间中预留了⼀定的存储空间,这些存储空间 ⽤来缓冲输⼊或输出的数据,这部分空间就叫做缓冲区,缓冲区是具有⼀定⼤⼩的,
- 为啥要⽤缓冲
- 缓冲,缓和冲击,例如操作磁盘⽐内存慢的很多,所以不⽤缓冲区效率很低
- 数据传输速度和数据处理的速度存在不平衡,⽐如你每秒要写100次硬盘,对系统冲击很⼤,浪费了⼤量时间在忙着处理开始写和结束写这两个事件,⽤buffer暂存起来,变成每10秒写 ⼀次硬盘,数据可以直接送往缓冲区,⾼速设备不⽤再等待低速设备,对系统的冲击就很 ⼩,写⼊效率⾼了
- Java IO包⾥⾯的两个缓冲类(⾼级流)
- BufferInputStream 和 BufferOutputStream
- 采⽤包装设计模式(锦上添花的意思)
面试点
BufferInputStream 缓冲字节输⼊流
BufferedInputStream 通过预先读⼊⼀整段原始输⼊流数据⾄缓冲区中,⽽外界对BufferedInputStream的读取操作实际上是在缓冲区上进⾏,如果读取的数据超过了缓冲区的范围,那么BufferedInputStream负责重新从原始输⼊流中载⼊下⼀截数据填充缓冲区,然后外界继续通过缓冲区进⾏数据读取
优点:避免了⼤量的磁盘IO,原始的InputStream类实现的read是即时读取的,每⼀次读取都会是⼀次磁盘IO操作(哪怕只读取了1个字节的数据),如果数据量巨⼤,这样的磁盘消耗⾮常可怕。
缓冲区的实现: 读取可以读取缓冲区中的内容,当读取超过缓冲区的内容后再进⾏⼀次磁盘IO,载⼊⼀段数据填充缓冲,下⼀次读取⼀般情况就直接可以从缓冲区读取,减少了磁盘IO。
实战(文件复制)
public class IOStudy {
public static void main(String[] args) throws IOException {
File file = new File("C:\\Users\\28518\\Desktop\\test\\");
File[] files = file.listFiles();
for (File file1 : files) {
System.out.println(file1.getName());
}
copyFile();
}
public static void copyFile() throws IOException {
File file=new File("C:\\Users\\28518\\Desktop\\test\\origin.txt");
File file2=new File("C:\\Users\\28518\\Desktop\\test\\copy.txt");
FileInputStream fis = new FileInputStream(file);
BufferedInputStream bis = new BufferedInputStream(fis);
FileOutputStream fos = new FileOutputStream(file2);
BufferedOutputStream bos = new BufferedOutputStream(fos);
int size;
byte[] bytes = new byte[1024];
while ((size = bis.read(bytes)) != -1){
bos.write(bytes,0,size);
}
bis.close();
bos.close();
}
}