java中IO流详解

IO流作为java基础中的必备技能会常常被我们用到,本篇文章笔者就来具体讲述一下IO流,希望能对小伙伴们起到帮助作用,如有不当之处,欢迎补充。

 

一、什么是IO流

首先我们要明白什么是流?流是计算机用来传输文件、保存文件的一种方式。我们在开发中会经常用到IO流,如:文件的上传和下载,文件的复制等。根据流的方向,分为输入流和输出流。通常二者搭配使用完成文件上传和下载。输入流就是你要让计算机知道他要操作的是哪个文件,什么文件,要读取到这个文件,这个从外到内的过程就是输入流(InputStream),如文件下载;那么,输出流就刚好相反,它是计算机已经有了这个文件,但开发者希望把这个文件保存到另外一个地方,这种从内到外的过程就是输出流(OutputStream)如文件上传。根据流的分类,输入流又包括字符输入流(FileReader)和字节输入流(InputStream),输出流包括字符输出流(FileWriter)和字节输出流(OutputStream)。虽然也还有其他的输入输出流,但最常用的还是这几种。

 

二、输入流FileReader和InputStream

FileReader和InputStream都是输入流,二者的区别是FileReader是字符输入流,每次按字符读取,主要适用于String类型、文本类型;而InputStream则是字节输入流,每次按字节读取文件,一般用于图片或视频等文件的操作。下面是两者的简单用法。

FileReader

 

FileInputStream

上面就是输入流的最常用的用法。开发中也通常是通过这两种方式来操作的。

 

三、输出流FileWriter和OutPutStream

两者的区别与输入流类似,FileWriter属于字符流,按字符读取;OutputStream属于字节流,按字节读取。话不多说,直接看两者的用法。其实和输入流也类似。

FileWriter

 

FileOutputStream

 

上述就是输出流的常见用法。如果你觉得IO流只有这些东西那你就大错特错了除了常见的这四种流的表现形式,还用一种很常用的流——缓冲流。但在介绍缓冲流之前,我们要先明白字符流和字节流的关系才能够更好的理解缓冲流

 

四、字符流与字节流的关系

说起字符流与字节流的关系,可能有的小伙伴就说了,我前面已经说过了:字符流就是按字符读取文件的形式,一般作用于文本类型的文件;而字节流就是按字节读取文件的形式,一般用来操作视频或图片等文件。但如果仅仅知道这些那就太简单了,为什么字符流通常操作String类、文本文件呢?为什么不能操作字符流操作视频和图片呢?那字节流可以操作文本类型的文件吗?为什么呢?

       其实,这是因为字符流每次按char读取文件,读取文本类型当然没有问题,但视频和图片都属于字节码文件,如果用字符流来输入或输出文件,就会造成乱码。想看效果的同学可以试一下,这就相当于我们把这个图片或视频文件直接以记事本的方式打开了,乱码是必然的。那字节流可以操作文本文件吗?答案是肯定的,为什么呢?我们都知道,计算机存储文件都是以二进制、十进制、十六进制等字节的方式存储的,包括文本文件,所以用字节流操作文本文件是没有问题的。说到这里,很多小伙伴就已经明白两者的关系了,没错,字节流包含字符流,为什么,因为字符流的底层实现也是字节流,它只不过是对字节流的封装罢了。但我们都知道,字符流是以char为单位读取文件的,这会大大影响我们程序的效率,那么怎么解决呢?没错,就是缓冲流。

 

五、缓冲流BufferedReader/BufferedWriter , BufferedInputStream/BufferedOutputStream

我们都知道,StringBuffer的效率远比String的效率高很多,流也一样,缓冲流就是把char类型封装成为了StringBuffer类型。下面我们看一下它的用法,其实都一样。

这里就单举BufferedReader的用法,其他三种与它的方式一样,就不一一列举了。但值得注意的是:

没有经过Buffered处理的IO, 意味着每一次读和写的请求都会由OS底层直接处理,这会导致非常低效的问题。

经过Buffered处理过的输入流将会从一个buffer内存区域读取数据,本地API只会在buffer空了之后才会被调用(可能一次调用会填充很多数据进buffer)。

经过Buffered处理过的输出流将会把数据写入到buffer中,本地API只会在buffer满了之后才会被调用。

 

BufferedReader/BufferedWriter可以将字符流(Reader)包装成缓冲流,这是最常见用的做法。

另外,BufferedReader提供一个readLine()可以方便地读取一行,而FileInputStream和FileReader只能读取一个字节或者一个字符,

因此BufferedReader也被称为行读取器

以上笔者只是讲解了笔者认为IO流中最常用的几种表现形式。希望能给各位小伙伴提供有效的帮助。不足之处,欢迎补充。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值