Java输入输出流三(2):字节流之FileOutputStream(文件输出流);文件拷贝(字节流的重点)

文件输入流将文件内容读取(程序读取文件内容,暂存在内存中);

文件输出流,将程序读取到的内容写入到一个文件中;


一:FileOutputStream类常用方法介绍

构造方法:

常用方法:

●public void write(byte[] b,int off,int len):

          off偏移量:从数组的第几位算起;

          一般,再读写文件时:令 len = fis.read(b);

          len:如果没有读到文件末尾:len的值就是实际读取的字节数;假如byte数组的长度为1024,那么开始的时候,len应该是1024;最后一次读的时候,文件快被读完了,可能byte数组离只有800个字节了,所以这时len为800;如果再继续读,因为文件已经被读完,此时len就会是-1了;


二:FileOutputStream类方法示例:

(1)write()方法演示

public class FileOutputDemo1 {

	public static void main(String[] args) {

		FileOutputStream fos;  // 编程习惯:将字节流对象的定义放在外面。
		try {
			fos = new FileOutputStream("imooc.txt",true);
			fos.write(50);
			fos.write('c');
			fos.close();
			
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e){
			e.printStackTrace();
		}
	}
}

结果:经过多次测试,可以发现,字节流对于处理文档类内容显得有点拖沓和笨重,这中间涉及到各种编码方式的切换;所以,字节流更善于处理视频、图像等字节型文件,而不善于处理文档等字符型文件


三:文件拷贝

(1)文件的拷贝流程示例:

public class FileOutputDemo2 {

	public static void main(String[] args) {
		// 文件拷贝:图片文件的复制粘贴,读取和写入
		// (1)创建输入流对象,输出对象
		FileInputStream fis;
		FileOutputStream fos;
		try {
			// (2)实例化输入流对象指向待复制文件;实例化输出对象,参数为复制后文件的全路径;
			fis = new FileInputStream("happy.jpg");
			fos = new FileOutputStream("happyCopy.jpg");
			// (3)n存放读方法的返回值,返回值为实际读到的数据的长度;如果为-1代表已经读到文件末尾了;
			int n = 0;
			// (4)定义一个字节数组,存放读取到的数据;这个数组得大一点;
			byte[] b = new byte[1024];
			// (5)读取内容,并同时将读取到的内容写出来;这儿是每读1024个字节就写一下,即读一点写一点,直到全部复制完;
			while((n = fis.read(b))!= -1){
				fos.write(b); // 将读取到的内容写到fos这个文件流对象对应的文件中去;
			}
			// (6)关闭输入流、输出流;
			fis.close();
			fos.close();				
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e){  // 注:这几文件的读写,IOException是必须抛出的,当成常识记住就行…
			e.printStackTrace();
		}
	}

}

结果:

注:

(1)发现,复制后的happyCopy.jpg比happy.jpg要大:因为快读完的时候(即最后一次读的时候),文件剩余的东西,装不满1024个字节了;

解决办法:更改write方法。以保证俩文件大小是一致的;

n = fis.read(b):n的值为实际读的字节数,如果读到文件末尾,n为-1;

fos.write(b,0,n):n从偏移位置(这个是从数组的第0位开始算),写n位数据,如果n=-1,不写;

(如果没有读到文件末尾:len的值就是实际读取的字节数;假如byte数组的长度为1024,那么开始的时候,len应该是1024;最后一次读的时候,文件快被读完了,可能byte数组离只有800个字节了,所以这时len为800;如果再继续读,因为文件已经被读完,此时len就会是-1了;)

(2)上面文件复制时,如果已经有一个happyCopy.jpg文件了,其会把已有的文件干掉,然后新增本次复制的文件;

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值