IO流读取文件
前言:首先简单介绍一下,IO流根据读取流向分类可以分为输入流和输出流。
根据数据特点分类可以分为字节流和字符流,字节流是万能的,可以读取任何形式的文件。下文围绕字节流展开介绍,字符流其实也是一样的,就不做赘述了。
1.文件流
public static void main(String[] args) throws IOException {
//创建输入流对象并关联a.txt文件,从a.txt文件读取内容
FileInputStream fis = new FileInputStream(new File("a.txt"));
//创建输出流对象并关联b.txt文件,将读取到的内容不断的写入到b.txt文件中,如果b.txt文件不存在 则会创建该文件
FileOutputStream fos = new FileOutputStream("b.txt");
int len;
while ((len = fis.read()) != -1) { //一个字节一个字节的读取a.txt文件的内容
fos.write(len); //一个字节一个字节的将读到的内容写入到b.txt文件
}
//关闭流,释放资源
fis.close();
fos.close();
}
FileInputStream 是InputStream抽象类的子类
FileOutputStream 是OutputStream抽象类的子类
2.缓冲流
public static void main(String[] args) throws IOException {
//创建输入流对象并关联a.txt文件,从a.txt文件读取内容
FileInputStream fis = new FileInputStream(new File("a.txt"));
//创建输出流对象并关联b.txt文件,将读取到的内容不断的写入到b.txt文件中,如果b.txt文件不存在 则会创建该文件
FileOutputStream fos = new FileOutputStream("b.txt");
byte[] bf = new byte[1024 * 8]; //创建一个bf数组缓冲区
int len;
while ((len = fis.read(bf)) != -1) { //将a.txt的文件内容读取到bf数组中
fos.write(bf, 0, len); //从bf数组中将内容写到b.txt文件中
}
//关闭流,释放资源
fis.close();
fos.close();
}
第二种方式和第一种方式相比,为什么要快呢?
因为第一种方式是每次从硬盘上一个字节一个字节的读取文件数据到内存中,然后再将读取的内容写入到硬盘上,如此一来,程序和硬盘打交道的次数就非常多!
而第二种方式,每次从硬盘上读取bf数组大小个字节到内存,这样就极大减少了程序和硬盘打交道的次数!
要知道,基于内存的操作速度是远远大于基于硬盘的操作速度的,不然为什么内存比硬盘贵那么多呢?!
当然,我们完全可以不用自己定义缓冲数组来进行文件的读写操作,java已经为我们写好了相应的包装类:
public static void main(String[] args) throws IOException {
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(new File("a.txt")));
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(new File("b.txt")));
int len;
while ((len = bis.read()) != -1) {
bos.write(len);
}
bis.close();
bos.close();
}
这种方式其实和第二种方式是一样的,BufferedInputStream 对FileInputStream进行了包装,其源码实现里定义了一个大小为8192的字节数组。BufferedOutputStream 亦是同理~
好了,简单的文件读写操作就先介绍到这里啦~