javaSE (二十九)IO.read()输出是int的原因、fileoutputstream的追加功能、用byte[]优化拷贝文件、Buffered缓冲区内存示意图

IO流比collection简单很多,方法也很少所以写的有点杂,可直接看api


1、IO.read()输出是int的原因:
fileinputstream: 文件输入流 文件字节输入到jvm
fileoutputstream: 文件输出流 jvm输出到文件
答:因为字节输入流可以操纵任意类型的文件,比如图片音频等,底层都是以二进制形式存储的,如果每次都返回buye,有可能读到中间的时候会遇到11111111,这个是byte类型的-1,遇到-1就不读取了,所以要用int类型接受,在11111111前面补上24个0凑足4个字节,那么byte的-1就变成了int类型的255,00000000 00000000 00000000 11111111 可以保证整个数据都读完,结束标记就是int类型的-1,而输出流的write方法会把前面的24个0去掉

2、fileoutputstream的追加功能:
fileoutputstream在创建对象的时候,如果没有这个文件,就会创建一个,如果有,会将原来的清空,而构造方法:FileOutputStream(String name, boolean append) 可追加

3、用字节数组byte[]优化拷贝文件:
arr是一个缓冲区,就像大巴运人,一开始都是荷载,一辆一辆地带走,到最后没人了,返回-1,运了半车人,然后运走

package cn.njupt;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class file {
	public static void main(String[] args) throws IOException {
		
		FileInputStream in = new FileInputStream("111.jpg");
		FileOutputStream  out = new FileOutputStream("copy.jpg");
		
		byte[] arr = new byte[1024*8];
		int len;
		while((len = in.read(arr)) != -1) { //arr是一个缓冲区,就像大巴运人,一开始都是荷载,一辆一辆地带走,到最后没人了,返回-1,运了半车人,然后运走
			out.write(arr, 0, len);
		}	
			
		in.close();
		out.close();	
	}
}

4、Buffered缓冲区内存示意图:

1. 开发中用byte[]数组搭配out.write(arr, 0, len)方法和用bufferedInputStream缓冲区都可以,缓冲区简便一点
2. 加了缓冲区后,关流只需要关缓冲区就可以了

注意:
close() 方法可以刷新缓冲区,就是将最后一次缓冲区里面的数据输出,
flush() 也有刷新的功能(可以每次运输都刷新一下,但是close()刷新后就结束程序不能继续了,就像QQ聊天,每次刷新后还能继续聊天)

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_39782583/article/details/84923654