IO流中的IO是Input,Output,输入和输出的意思,是用来处理设备与设备之间的数据传输的,不仅能处理内部设备(比如CPU、GPU、内存),还能处理外部设备(比如手机和PC,客户端与服务器)。
在Java中定义数据按照流向,分为输入流和输出流。
首先我们来了解输入流,从字面上就很容易理解,凡是从外部流入的数据都可以通过输入流来处理。比如读取文件。
输出流,就表示从内部流出的数据,比如:我们编辑了一个文本文件,当我们按下ctrl+s的时候,就将该文件从内存保存到了硬盘,这就是一个将数据从内存中输出到硬盘的过程。
除了输出和输入流,流按照操作的数据还分为:字节流和字符流。
复制一个文本文件,现在我们就来将D
盘下hello.txt
文件复制到E
盘下,并重命名为abc.txt
:
FileReader fr = new FileReader("D://hello.txt"); //定义FileReader读取文件
int len = 0; //每次读取的字符数量
char[] cbuf = new char[1024]; //每次读取数据的缓冲区
FileWriter fw = new FileWriter("E://abc.txt"); //定义FileWriter写文件
while((len = fr.read(cbuf)) != -1){
fw.write(cbuf,0,len);
}
fw.close(); //释放资源 刷新缓冲区
fr.close();
如果要对非文本类型的文件进行操作,应该怎么做呢?这个时候字符流还能不能派上用场呢?
答案是否定的,字符流只适用于操作字符类型的文件,不能操作非字符类型的。
所以这个时候应该用什么来操作呢?字节流
字节流来操作非字符类文件。
使用字节流来复制一个图片文件
FileInputStream fs = new FileInputStream("D://user.jpg"); //定义文件输入流读取文件信息
FileOutputStream fos = new FileOutputStream("E://new.jpg");//定义文件输出流写文件
int len = 0; //每次读取数据的长度
byte[] bys = new byte[1024]; //数据缓冲区
while( (len = fs.read(bys)) != -1){
fos.write(bys, 0, len);
}
//释放资源 刷新缓冲区
fs.close();
fos.close();
-
字节流既然可以用来读取非字符构成的文件,那可以读取字符类型的文件吗? 答案是可以的,字节流可以操作所有类型的文件,因为计算机中的数据都是以字节的方式存储的;
-
既然字节流可以用来操作所有的文件,那还要字符流干啥咧? 因为字符流操作字符类型的数据和文件要比字节流快很多。
使用BufferedReader
读取字符文件的速度要比我们之前使用的字节流和FileReader快很多,示例代码:
BufferedReader bf = new BufferedReader(new FileReader("D://hello.txt"));
BufferedWriter writer = new BufferedWriter(new FileWriter("D://abc.txt"));
String str = "";
while( (str = bf.readLine()) != null){
writer.write(str);
}
bf.close();
writer.close();