最近学习了I/O,按照老规矩写上一篇。
I/O流
什么是I/O流?
流是一种抽象概念,它代表了数据的无结构化传递。按照流的方式进行输入输出,数据被当成无结构的字节序或字符序列。从流中取得数据的操作称为提取操作,而向流中添加数据的操作称为插入操作。用来进行输入输出操作的流就称为IO流。换句话说,IO流就是以流的方式进行输入输出。
----转自百度百科
了解了是那么是I/O流,那么Java的I/O流主要应用的业务场景有哪些?
负责文件上传和下载,包括,文档、音频、视频、图片等都可以使用I/O流进行读和写
缓冲的概念
缓冲其实在我们的日常生活中早已是个常见的名词
看视频卡顿?暂停一下,等视频加载缓冲。
那么缓冲主要发生在哪?
举个例子:
快递:
商家发出----> 送到物流中转站,物流中转站------->分批次发出,一次可以运输好多件快递。------>快递员送货上门
假设,我们没有物流中转站,那么,商家不得不每次有人购买产品都要单独发出,所有的快递也不存在集中运输那么,快递到达我们每个人的手中所需要的时间就不会是短短的3天了。
I/O流中的缓冲
I/O流就是对电脑文件的读和写。计算机通过CPU读取磁盘上的文件数据,一次读取一个字节。但可以加上缓冲的概念,每次读取4kb。提高效率。
- 字节输入缓冲流:BufferedInputStream()
- 字节输出缓冲流:BufferedOutputStream()
- 字符输入缓冲流: BufferedReader()
- 字符输出缓冲流: BufferedWriter()
I/O的分类
需要注意的是,在Java中I/O的定义是以内存为参照物的。
- 从磁盘读取数据到内存。:输入流
- 从内存写入数据到磁盘。:输出流
输入流
从磁盘中读取数据到内存中,将数据展示
输入流可以分为:
- 字节输入流:FileInputStream()
- 字符输入流:FileReader()(只适用于纯文本内容)
案例:磁盘上有一个1.txt文件,将1.txt内容读取到java内存中
1、使用字节输入流:FileInputStream和字节输入缓冲流:BufferedInputStream
import java.io.*;
public class FileInputStreamDemo {
public static void main(String[] args) throws IOException {
//1.创建一个file对象
File file = new File("d:/Test/1.txt");
//2.创建文件字节输入流对象,来操作1.txt文件
FileInputStream inputStream = new FileInputStream(file);
//3.这个流不具备缓冲的效果,使用缓冲流BufferInputStream为另外一个流提供缓冲功能
BufferedInputStream bis = new BufferedInputStream(inputStream);
//将inputStream传给BufferInputStream,附魔具有缓冲功能
//使用字节缓冲流操作1.txt。
//4.创建一个内部缓冲区数组 byte[] 类型的数组
//byte[] buf = new byte[4*1024];//4096个字节
byte[] buf = new byte[3];//3个字节
//缓冲数组是多长,一次就只能读取多少字节。
//5.读取数据read() 返回的是字节数。
//int readNumber = bis.read(buf);
//6.调用buf数组的输出,展示字符数组
//System.out.println(new String(buf,0,readNumber));
//String(字节数组,偏移量,取值长度)
//偏移量规定了从数组的什么位置开始取值
//当字节数过多的时候,字符数组不可能无限大,所以使用循环来多次读取,
//后边每一次读取都会覆盖前面的内容
int length = -1;//如果length=-1,证明读取到了流的末尾,就停止读取
while ((length = bis.read(buf))!= -1){
System.out.print(new String(buf,0,length));//打印到控制台
}
//7.关闭流释放资源
inputStream.close();
bis.close();
}
}
2、使用字符输入流:FileReader和字符输入缓冲流:BufferedReader
import java.io.*;
public class Demo1 {
public static void main(String[] args) throws IOException {
//将c盘下面的aaa文件夹下面的1.txt文件的内容 读取到Java内存中
//和字节流一模一样
//1.新建一个File对象
File file = new File("c:/aaa/1.txt");
//2.新建FileReader 对象 字符输入流
FileReader fr = new FileReader(file);
//3.FileRFeader没有缓冲的效果,可以加上缓冲的效果
BufferedReader br = new BufferedReader(fr);
//4.字节的缓冲数组 是字节
//字符的缓冲数组 是字符
char[] cbuf = new char[4];//缓冲区是4个字符
//这个方法是用的!!!
//5. read(char[] cbuf) 将文件内容读取到字符数组中(缓冲区)
int length = -1;
while ((length = br.read(cbuf)) != -1) {
//6.将数组展示到控制台
System.out.println(new String(cbuf, 0, length));
}
//7.关闭流
br.close();
fr.close();
}
}
输出流
从内存中输出的数据写到磁盘中,将数据存储
输出流可以分为:
- 字节输出流:FileOutputStream()
- 字符输出流:FileWriter()(只适用于纯文本内容)
案例:将字符串内容写到一个.txt文件中
1、使用字节输出流:FileOutputStream和字节输出缓冲流:BufferedOutputStream
import java.io.*;
public class FileOutputStreamDemo {
public static void main(String[] args) throws IOException {
//内存到磁盘,输出流
//1.创建一个file对象
File file = new File("d:/Test/2.txt");
if (!file.exists()){
file.createNewFile();
}
//2.创建流
FileOutputStream fos = new FileOutputStream(file);
//3.加上缓冲效果
BufferedOutputStream bos = new BufferedOutputStream(fos);
//4.将字符串转成byte
String str = "A接W接A接E接外圈刮接诺克萨斯断头台";
byte[] bytes = str.getBytes();
//5.将数据写到磁盘中
bos.write(bytes);
//6.刷新,释放资源
bos.flush();
bos.close();//BufferedOutputStream要先关闭,后开先关
fos.close();
}
}
2、使用字符输出流:FileWriter和字符输入缓冲流:BufferedWriter
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
public class Demo1 {
public static void main(String[] args) throws IOException {
//从内存写入数据到磁盘的文件中
File file = new File("c:/aaa/2.txt");
FileWriter fw = new FileWriter(file);
//加缓冲流
BufferedWriter bw = new BufferedWriter(fw);
//viod writer(char[] cbuf, int off, int length);
String str = "一杯茶,一包烟,一个功能码一天!";
//将字符串转为char数组
char[] chars = str.toCharArray();
//将chars数组中 从0 开始 取3个字符写入到缓冲流中
bw.write(chars, 3, 3);
bw.close();
fw.close();
}
}
至此结束