目录
- 什么是输入输出?流又是什么?
- 字节流与字符流
- Java中流类的继承层次
- 文件复制程序
什么是输入输出?流又是什么?
首先要明确的是输入和输出是站在程序的角度来说的,我们把数据从数据源中加载到程序中,这是输入的过程,我们把数据从程序中发送到目的地这是输出的过程。上面说到的数据源可以是文件,网络等。键盘是Java默认的标准输入设备,控制台是Java默认的标准输出设备。
那么什么是流呢?
Java将数据的输入输出(I/O)操作当作“流”来处理,“流”是一组有序的数据序列。上面是Java中流的概念。我们可以把程序想象成是一个湖泊,如果我们要从其他水源引水入湖,或者把这个湖泊的水导出到别处,我们可以修建水渠,那么这些水渠中的水流就是我们的数据流;引入的水流叫做输入流,导出的水流叫做输出流。与水流不同的是我们的数据在运输过程中必须是有序的,这样才能保证数据在传输前后不发生改变。
字节流与字符流
上面说道,Java中的流按照传输的方向可以分成输入流和输出流。此外,Java中的还可以分为字节流和字符流,对应到上面的例子,字节流可以理解为小水渠,字符流可以理解为大水渠
我们知道电脑中的视频,图片,音频等文件都是以字节的形式存取的,所以字节流的适用范围更广些。字符流一般只在涉及到中文(文本)处理的时候会用到。
Java中流类的继承层次
Java SE提供4个顶级抽象类,两个字节流抽象类:InputStream和OutputStream;两个字符流抽象类:Reader和Writer。
- 主要的字节输入流
- 主要的字节输出流
- 主要的字符输入流(以16位的Unicode字符为基本的处理单位)
- 主要的字符输出流 (以16位的Unicode字符为基本的处理单位)
文件复制程序
为了更好的理解Java中的输入输出流,我们现在来看一个文件复制程序
程序代码
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
public class FileCopy {
public static void main(String[] args) {
//新建文件对象
File srcFile = new File("srcFile.txt");
//判断文件是否存在
if(!srcFile.exists()) {
System.out.println("没有找到源文件:"+srcFile.getAbsolutePath());
return;
}
//创建目标文件对象
File newFile = new File("newFile.txt");
try {
//创建目标文件
newFile.createNewFile();
//创建输入流,源文件为srcFile
FileInputStream fis = new FileInputStream(srcFile);
//创建输出流,目标文件为newFile
FileOutputStream fos = new FileOutputStream(newFile);
//创建一个缓冲数组,一次读取一个字节数组然后处理比一次读取一个字节然后再处理效率更高
byte[] buffer = new byte[1024];
int len = 0;
//read返回-1表示已经读取完毕
while((len=fis.read(buffer,0,buffer.length))!=-1) {
fos.write(buffer,0,len);
}
//关闭流
fis.close();
fos.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
}catch (IOException e) {
e.printStackTrace();
}
}
}
我们在项目文件夹下先放入一个srcFile.txt
文件,文件里面存放的是荀子的《劝学》
然后运行程序,刷新一下文件夹,可以看到创建了一个新的文件newFile.txt
打开文件,发现复制成功
- THE END -