12.16《采用 缓冲输入 、 输出字节流 来实现图片的拷贝》

要求:拷贝的数据和源数据一样大


思路:1.找到目标文件
         (1)要读取的目标文件
         (2)要写入的 这个目标文件的位置
     
          2.建立数据传输的通道
         (1)读取数据的通道
         (2)写入数据的通道
     
         3.操作数据(读取 和 写入)
         (1)在读取的过程中写入
         (2)一边读取一边写入
      
         4.关闭资源(输出管理和输入管道都关闭)

          规则:先开的后关,后开的先关


package com.homework.picture;

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

public class CopyPicture {
	
	public static void main(String[] args) throws IOException {
		// 1.找到目标文件
		//(1)要读取的目标文件的位置
		File inputFile = new File(".","picture\\Beauty.jpg");
		//(2)要写入的这个目标文件位置
		File outputFile = new File(".","Goddess.jpg");
		
		// 2.建立数据传输的通道
		//(1)读取数据的通道
		FileInputStream fileInput = new FileInputStream(inputFile);
		//(2)写入数据的通道
		FileOutputStream fileOutput = new FileOutputStream(outputFile);
		// 3.读取数据
		//(1)创建缓冲数组,来读取数据
		byte[] a = new byte[1];//为什么用1呢,这样读取的大小更精准,但速度可能会比较慢
		int length = 0;
		/*每一次当你new一个FileOutputStream 对象的时候,那么FileOutputStream 对象会指向文件中开始的位置。那么
		你开始写入这个数据的时候,就会把原来的数据覆盖掉。
		但是,我们现在这里写入数据的时候,用的是同一个FileOutputStream的对象,那么它每次写完这个数据,它的指向
		就会对应的有所移动,从你开始写入的地方,移动到了你结束写入的地方所以,在一边读取,一边写入的时候,这个数据并
		没有不断的覆盖,而是不断的追加。*/
		while((length = fileInput.read(a)) != -1){
			//获取当前读取的数据
			//写入到目标文件中
			fileOutput.write(a);
		}
		//关闭资源。  规则:先开的后关,后开的先关
		fileOutput.close();
		fileInput.close();
		
	}

}

写代码时遇到的问题:(1)读取目标文件位置时,它的位置是一个相对路径,我用了(".","picture\\Beauty.jpg");来解决。

                                    (2)也是和读取一样,写入的这个目标文件位置也是一个相对路径,我用了(".","Goddess.jpg");来解决。

                                    (3)最后一个是抛出异常问题,我之前用的是(public static void main(String[] args) throws FileNotFoundException, IOException {)抛出异常,但无意中试了一下(public static void main(String[] args) throws IOException {)抛出异常,居然也可以。。。我就郁闷了


经过组长们的指导,我发现我只是把异常抛出了,并没有对异常进行包装抛出,改过的代码如下:

package com.homework.picture;

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

public class CopyPicture {
	
	public static void main(String[] args) throws IOException {
	//两个流的对象
	FileInputStream inputStream = null;
	FileOutputStream outputStream = null;		
		// 1.找到目标文件
		//(1)要读取的目标文件
	try{
		File inputFile = new File(".","picture\\Beauty.jpg");
		//(2)要写入的这个目标文件位置
		File outputFile = new File(".","Goddess.jpg");		
		// 2.建立数据传输的通道
		//(1)读取数据的通道
		FileInputStream fileInput = new FileInputStream(inputFile);
		//(2)写入数据的通道
		FileOutputStream fileOutput = new FileOutputStream(outputFile);
		// 3.读取数据
		//(1)创建缓冲数组,来读取数据
		byte[] a = new byte[1];//为什么用1呢,这样读取的大小更精准,但速度可能会比较慢
		int length = 0;
		/*每一次当你new一个FileOutputStream 对象的时候,那么FileOutputStream 对象会指向文件中开始的位置。那么
		你开始写入这个数据的时候,就会把原来的数据覆盖掉。
		但是,我们现在这里写入数据的时候,用的是同一个FileOutputStream的对象,那么它每次写完这个数据,它的指向
		就会对应的有所移动,从你开始写入的地方,移动到了你结束写入的地方所以,在一边读取,一边写入的时候,这个数据并
		没有不断的覆盖,而是不断的追加。*/
		while((length = fileInput.read(a)) != -1){
			//获取当前读取的数据
			//写入到目标文件中
			fileOutput.write(a);
		}
	}catch(IOException e){
		System.out.println("图片拷贝出错!!");
		//一旦捕获到了异常,那么图片的拷贝就是出出错了
		throw new RuntimeException(e);
	}
	finally{
		try{
			//先关闭输出流
			//这是可能出现的代码
			if(outputStream != null){
				//关闭资源
				outputStream.close();
				//如果没有捕获到异常,那么代码执行下面的语句
				System.out.println("资源关闭成功!");
			}
		
	
		//关闭资源。  规则:先开的后关,后开的先关
		}catch(IOException e){
			
			//关闭失败了
			System.out.println("资源关闭失败");
			//关闭资源失败,如果我们自己无法处理,或者说我们需要告诉调用者,这个资源关闭失败了,那么我们就应该把异常抛出去
			throw new RuntimeException(e);
			
		}
		//因为不管输出流关闭是成功还是失败,都需要关闭输入流对象
		finally {
			try{
				//后关闭输入流
				//这是可能出现异常的代码
				if(inputStream != null){
					//关闭资源
					inputStream.close();
					//如果没有捕捉到异常,那么代码执行下面的语句
					System.out.println("资源关闭成功!");
				}
			}catch(IOException e){
				//关闭失败了
				System.out.println("资源关闭失败");
				//关闭资源失败,如果我们自己无法处理,或者说我们需要告诉调用者,这个资源关闭失败了,那么我们就应该在这里把异常抛出去
				throw new RuntimeException(e);
				
				
			}
				
			//不再需要finally了,因为所有的资源关闭都结束了
		}
	  }
	}
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值