java学习笔记27-文件拷贝

本文详细介绍了文件拷贝的三种常见方法:逐字节拷贝、通过数组拷贝以及使用缓冲区拷贝。对比了不同方法的效率,并解释了如何避免死循环等问题。

文件拷贝需要使用I/O流。主要记住核心的6行代码就行

 

逐个字节拷贝,文件大时很慢,不推荐使用

	public static void  test() throws IOException {
		//创建输入流对象
		FileInputStream fis = new FileInputStream("C:/Users/DG02/Desktop/test.txt");
		//创建输出流对象
		FileOutputStream fos = new FileOutputStream("C:/Users/DG02/Desktop/test1.txt");
		int b;
		//读取文件并写入
		while((b=fis.read()) != -1){
			fos.write(b);
		}
		//关闭输入流对象
		fis.close();
		//关闭输出流对象
		fos.close();
	}

需要注意的是,不能int b = fis.read(),然后直接b!=-1 这样会死循环。

 

 

通过一个和文件字节大小一样的数组进行拷贝

	public static void test1() throws IOException {
		//创建输入流对象
		FileInputStream fis = new FileInputStream("C:/Users/DG02/Desktop/test.txt");
		//创建输出流对象
		FileOutputStream fos = new FileOutputStream("C:/Users/DG02/Desktop/test1.txt");
		//创建一个字节数值,数组大小与要拷贝的文件字节大小一致
		byte[] arr = new byte[fis.available()];
		//把读取的文件字节全部放入数组中
		fis.read(arr);
		//把数组的字节写入到文件
		fos.write(arr);
		fis.close();
		fos.close();
	}

available()会返回文件字节大小

先把文件字节全部读取到一个字节数组中,然后一次性写入

 

 

通过缓冲写入

	public static void test2() throws IOException {
		//创建输入流对象
		FileInputStream fis = new FileInputStream("C:/Users/DG02/Desktop/test.txt");
		//创建输出流对象
		FileOutputStream fos = new FileOutputStream("C:/Users/DG02/Desktop/test1.txt");
		//对输入流进行包装,创建读取缓冲区
		BufferedInputStream bis = new BufferedInputStream(fis);
		//对输出流进行包装,创建写入缓冲区
		BufferedOutputStream bos = new BufferedOutputStream(fos);
		//读取缓冲区的字节,当字节不为-1,写入
		int b;
		while ((b=bis.read())!=-1){
			bos.write(b);
		}
		//关闭输入流缓冲区
		bis.close();
		//关闭输出流缓冲区
		bos.close();
	}

源码中缓冲区是一个默认8192大小的字节数。每次都会从文件读取这样大小的内容到缓冲区。然后把缓冲区的内容读完后,才会再次去读取文件,直到文件内容结束。写入也是,先把内容写入到缓冲区。直到缓冲区满了,再写入文件。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值