Java中的I/O输入输出流,缓冲流
一.I/O流
I/O(Input/Output)流,即输入输出流,可以分为字节流与字符流、输入流与输出流、节点流与处理流。Java中的I/O流主要定义在java.io包中,在此包下定义了很多类,其中有4个类是*类,分别为InputStream和OutputStream,Reader和Writer.
- InputStream和OutputStream是字节流,而Reader和Writer是字符流
- InputStream和Reader是输入流,而OutputStream和Writer是输出流
二.字节流
1.字节流的概述
在计算机中,文本、图片、音频、视频等所有文件都是以二进制(字节)形式存在的,I/O流中针字节的输入/输出提供了以系列的流,统称为字节流,在JDK中,所有的字节输入流都继承自InputStream,所有的字节流都继承自OutputStream
InputStream被看成一个输入管道,OutputStream被看成一个输出管道,数据通过InputStream从源设备输入到程序,通过OutputStream从程序输出到目标设备,从而实现数据的传输。
2.案例演示
行读取键盘输入的数据
package net.yh.lesson24;
/**
* 功能:行读取键盘输入的数据
* 作者:王育红
* 日期:2020年08月14日
*/
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Examples403 {
public static void main(String[] args) {
int a;
/**
* system.in - 标准字节输入流
* inputstreamreader 转换流
* Bufferereader 缓冲流 提供了高效的读取方法
*/
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
System.out.print("a = ");
try {
a = Integer.parseInt(br.readLine());
a = a + 150;
System.out.println("a + 150 = " + a);
}catch (IOException e){
e.printStackTrace();
}
}
}
-运行结果
3.利用字节流读取文件
FileInputStream是InputStream的子类,它是文件字节输入流,用于读取文件中的数据。从文件读取数据是重复的操作,需要重复的语句来实现数据的持续读取。可以按照字节读取文件也可以按照字节数组来读取文件。
- 创建in的txt文件,并输入两行字符内容
- 说明:文件输入字节流read()方法返回是读取的字符对应的ASCII码值,要输出字符内容,很简单,只需要转成字符类型输出即可。
package net.yh.lesson24;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
/**
* 功能:利用FileInputStream读取文件
* 作者:王育红
* 日期:2020年08月14日
*/
public class Example2404 {
public static void main(String[] args) {
try {
//创建文件字节输入流对象
FileInputStream fis = new FileInputStream("src/net/yh/lesson24/in");
//通过while循环按字节读取文件
int c = 0;
while ((c = fis.read()) !=-1){
System.out.print((char)c);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
- 运行结果
三、字节流的缓冲区
1.概述
利用文件字节流可以实现文件拷贝,但是一个字节一个字节地读写,效率十分低下,在文件拷贝过程中,通过一字节形式逐个拷贝,效率也非常低。可以定义一个字节数组缓冲区,在拷贝文件时,就可以一次性读取多个字节的数据。
2.案例演示:采用文件字节与字节流缓冲区实文件拷贝
- 把文件student.jpg拷贝到net.dsj.test1
- 创建文件Example01
package net.dsj.test1;
import java.io.FileInputStream;
import java.io.FileOutputStream;
/**
* 功能:拷贝文件
* 采用文件字节流和字节流缓冲区
* 作者:王育红
* 日期:2020年08月05日
*/
public class Example01 {
public static void main(String[] args) throws Exception {
//创建文件字节输入流
FileInputStream fis = new FileInputStream("src/net/dsj/test1/student.jpg");
//创建文件字节输出流
FileOutputStream fos = new FileOutputStream("src/net/dsj/test/target.jpg");
//获取开始拷贝文件的系统时间
long startTime = System.currentTimeMillis();
System.out.println(startTime);
//定义字节数组作为缓冲区
byte[] buffer = new byte[1024];
//读取源文件,写入目标文件
int len = 0;
//得到实际读取到的字节数 读到最后返回-1
//循环读取
while ((len = fis.read(buffer)) != -1){
fos.write(buffer,0,len);
}
//获取结束拷贝的系统时间
long endTime = System.currentTimeMillis();
System.out.println(endTime);
//输出拷贝文件耗费时间
System.out.println("拷贝文件耗费时间:" + (endTime - startTime) + "毫秒");
}
}
-查看运行结果
四、字节缓冲流
1.概述
除了定义字节缓冲区来提高文件拷贝的效率外,IO中还提供了两个字节缓冲流提高文件拷贝效率:BufferedInputStream和BuffereOutputStream。
2.案例演示:采用字节缓冲流但不采用字节缓冲区拷贝文件
package net.dsj.test1;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
/**
* 功能:拷贝文件
* 采用字节缓冲流,不用字节缓冲区
* 作者:王育红
* 日期:2020年08月06日
*/
public class Example02 {
public static void main(String[] args) throws Exception {
//创建缓冲字节输入流
BufferedInputStream bis = new BufferedInputStream(
new FileInputStream("src/net/dsj/test1/student.jpg"));
//创建缓冲字节输出流
BufferedOutputStream bos = new BufferedOutputStream(
new FileOutputStream("src/net/dsj/test/t.jpg"));
//获取开始拷贝文件的时间
long startTime = System.currentTimeMillis();
//读取源文件,写入目标文件
int len = 0;
while ((len = bis.read() ) !=-1){
bos.write(len);
}
long endTime = System.currentTimeMillis();
//获取结束拷贝文件系统时间
System.out.println("拷贝文件耗费时间:" + (endTime-startTime) + "毫秒");
}
}
- 说明:缓冲流对象bis和bos内部都定义了一个大小为8192的字节数组,当调用read()和write()时,首先将读写的数据存入到定义好的字节数组,然后将字节数组,然后将字节数组的数据一次性读到文件中,从而有效的提高了数据的读写效率。
上一篇: 给大家分享几个常用的PHP函数