文章目录
- FileReader读入数据的基本操作
- FileReader中使用reader()
- FileWrite写出数据的操作
- 使用FileInputStream、FileOutputStream操作图片
- 缓冲流(字节型)实现非文本文件的复制
复制文本文件也可以使用字节流,但是不要在内存中读出来,比如不要system.out()出来
FileReader读入数据的基本操作
IO流的操作可以归纳为4步:
- java是面向对象的,你要读入文件,首先要有个对象来代表这个文件,所以:
File file = new File("hello.text");
- 对文件的读写是针对流的操作,所以也需要一个流的实例化:
FileReader fr = new FileReader(file);
,此处因为操作的是文本文件,是通过字符的方式将文件内容读到内存中,所以用FileReader流,之后你以别的方式操作别的内容需要换一种流 - 对文件进行操作:读入/写出
- 关闭资源,即关闭IO流
main方法中的new File()的地址是相较于本项目的,相当于他是站在本项目,而在测试案例中的new File()的地址是相较于本module的
优化一下:
前面我们写的代码是通过抛异常的方式来处理异常的,但是如果执行了new FileReader(file)开启了IO流,然后fr.read()遇到了异常,异常就被抛了出去,导致这个fr.close()未执行,IO流没有被关闭,存在资源浪费、内存泄漏问题
所以要用try…catch…finally的方式来捕获异常,以保证不管在哪里出现了异常,IO流都会被关闭
FileReader中使用reader()
如果达到文件末尾,返回-1。reader(char[] cbuf):相当于reader使用cbuf去装文件中的内容,如果文件中的内容大于cbuf的长度,那么能读取cbuf个字符,否则读入的文件内容少于cbuf的长度,而cbuf数组中会有未被覆盖的数据,这就是错误写法的原因。举例:假如hello.txt文件的内容为:helloworld123,那么第一次读取到的是hello,第二次读取到的是world,第三次读取到的是123ld,所以判断每次读入了多少个字符,要用reader(char[] cbuf)的返回值而非cbuf数组的长度
FileWrite写出数据的操作
使用FileInputStream、FileOutputStream操作图片
缓冲流(字节型)实现非文本文件的复制
缓冲流:为了提高文件的读写效率,之所以能提高读写效率,是因为他内部提供了一个缓存区,在进行读的时候,他会先把文件读到buffer里面,buffer中存满后再一次性写出,buffer的默认大小是8个字节。bufferOutputStream中有个flush()方法用于刷新缓冲区,即将缓存区的数据进行读写,然后清空。
一般开发都用缓冲流。
内层流的关闭可以省略