您的位置:首页 > 其它

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

2016-12-16 22:39 357 查看
要求:拷贝的数据和源数据一样大

思路: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");

//
4000
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了,因为所有的资源关闭都结束了
}
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐