Java IO流(1):字节流——Java学习笔记20(补)

Java IO

一 概念

字节流:操作任何数字,计算机中的任何数据都是以字节形式存储的
字符流:操作纯字符数据,比较方便

二 常用父类

字节流:InputStream和OutputStream
字符流:Reader和Writer

三 Stream(字节流)

1 FileInputStream

基本Method
	 int read();	//读取一个数据字节,(文件是以-1结尾的)。
	 close();
  • read()为什么返回int而不是byte?
    • 因为字节输入流可以操作任意类型的文件,比如图片音频等,这些文件底层都是以二进制形式的存储的,如果每次读取都返回byte,有可能在读到中间的时候遇到111111111。那么这11111111是byte类型的-1,我们的程序是遇到-1就会停止不读了,后面的数据就读不到了,所以在读取的时候用int类型接收,如果11111111会在其前面补上24个0凑足4个字节,那么byte类型的-1就变成int类型的255了这样可以保证整个数据读完,而结束标记的-1就是int类型。

2 FileOutputStream

Constructor
	FileOutputStream(String name);
	FileOutputStream(File file);
	FileOutputStream(String name,boolean append);	//append=true不清空文件,false清空文件
	FileOutputStream(File file,boolean append);		//append=true不清空文件,false清空文件

创建字节输出流对象。如果没有就会自动创建一个目标文件,如果有这个文件,会将文件清空。不清空的需要调用构造。

基本Method
	void Write(int );		//虽然写出的是个int数,但是到文件上的是一个字节,会自动去除前三个8位
	void close();

字节数组拷贝一 文件代码

	FileInputStream fis = new FileInputStream("34.jpg");
		FileOutputStream fos = new FileOutputStream("copy.jpg");
		
		int b;
		while ((b = fis.read()) != -1) {
			fos.write(b);
		}
		
		fis.close();
		fos.close();

(每次只传输一个字节,效率低)

字节数组拷贝二 available()方法

使用到的方法
	//FileInputStream 
	int available();		//获取文件的剩余字节数
	int read(byte[] b);		//输入流文件数据输入到字节数组b中,返回的是读到的有效字节个数
	
	//FileOutputStream
	void write(byte[] b);	//输出数组b到文件

(一次传输过多字节,拷贝大型文件会导致内存溢出)

字节数组拷贝三 定义小数组

	FileInputStream fis = new FileInputStream("xxx.txt");
	FileOutputStream fos = new FileOutputStream("yyy.txt");
	
	byte b[] = new byte[2];				//定义byte数组长度为2
	int len;							//录入的字节数
	while ((len = fis.read(b)) != -1) {	//如果len==-1,表示读到了结尾
		fos.write(b,0,len); 			//write(byte[] b,int off,int len)方法
	}
	
	fis.close();
	fos.close();

定义小数组的标准格式

	byte b[] = new byte[1024 * 8];			//定义byte数组长度为1024的整数倍
	int len;							
	while ((len = fis.read(b)) != -1) {		//注意:如果read()方法中忘记加b数组,返回的不是读取字节个数,二十字节的码表值
		fos.write(b,0,len); 			
	}

BufferedInputStream&BufferedOutputStream 字节缓冲区流

constructor
	BufferedInputStream(InputStream is);
	BufferedOutputStream(OutputStream os);
e.g
	BufferedInputStream bis = new BufferedInputStream(new FileInputStream("xxx.mp3"));
	BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("yyy.mp3"));
	int b;
	while ((b = bis.read()) != -1) {
		bos.write(b);
	}
	bis.close();
	bos.close();
原理

内存的读写速度比硬盘快的多。
该方法减少在硬盘的读写次数,增加内存中的读写次数。
BufferedXxxputStream对象中创建了一个长度为8192的字节数组,输入流一次性从文件中读取8192个字节存在缓冲区中,然后在内存中依次传输给输出流,输出流再将这8192个字节输出到文件中去。
在开发中字节缓冲区流和定义小数组的方法都可用。

方法flush()&close()的区别

  • flush()方法
    • 用来刷新缓冲区的,刷新后可以再次写出
  • close()方法
    • 用来关闭流释放资源的的,如果是带缓冲区的流对象的close()方法,不但会关闭流,还会再关闭流之前刷新缓冲区,关闭后不能再写出

IO流异常处理的标准代码(JDK1.7)

JDK1.7之后IO流对象实现了一个Closeable接口,实现了此接口的对象可以自动关闭

	try(
		FileInputStream fis = new FileInputStream("aaa.txt");
		FileOutputStream fos = new FileOutputStream("bbb.txt");
		MyClose mc = new MyClose();
	){
		int b;
		while((b = fis.read()) != -1) {
			fos.write(b);
		}
	}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值