12.16《采用 缓冲输入 、 输出字节流 来实现图片的拷贝》
2016-12-16 22:39
357 查看
要求:拷贝的数据和源数据一样大
思路:1.找到目标文件
(1)要读取的目标文件
(2)要写入的 这个目标文件的位置
2.建立数据传输的通道
(1)读取数据的通道
(2)写入数据的通道
3.操作数据(读取 和 写入)
(1)在读取的过程中写入
(2)一边读取一边写入
4.关闭资源(输出管理和输入管道都关闭)
规则:先开的后关,后开的先关
写代码时遇到的问题:(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 {)抛出异常,居然也可以。。。我就郁闷了
经过组长们的指导,我发现我只是把异常抛出了,并没有对异常进行包装抛出,改过的代码如下:
思路: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了,因为所有的资源关闭都结束了 } } } }
相关文章推荐
- 黑马程序员——第19天——IO输入与输出(缓冲字符流,字节流,缓冲字节流,字符流、字节流总结)
- JAVA基础 day21 字节流的输入和输出 字节流的缓冲区 (自己实现BufferedInputStream) 键盘输入 转换流的用法 改变标准输入输出设备 IO流操作的基本规律
- 使用缓冲输入输出字节流拷贝图片
- 缓冲字节流(拷贝图片)
- 利用字节流将生成的图片输出到js页面,实现动态生成图片
- 黑马程序员-JAVA高级视频_IO输入与输出-19天-8(拷贝图片)
- 字节流方式:输入一个已经存在的文件名称,和一个目标文件名称,实现文件内容的拷贝
- Java利用文件输入输出流实现文件夹内所有文件拷贝到另一个文件夹
- 黑马程序员---2015.6.25java基础笔记---装饰模式--字节流拷贝图片--字节流缓冲--字节字符转化--File类
- 使用字节流实现图片的拷贝
- object-c 利用scanf 实现终端的输入输出缓冲
- Swing 实现文件选择器的显示,及图片(blob类型)在数据库的输入,输出问题
- 7.4.采用穷举法,用函数编程实现计算两个正整数的最小公倍数的函数,在主函数中调用该函数计算并输出从键盘任意输入的两个数的最小公倍数。
- 汇编实现输入字符串逆向输出
- QT中采用信号槽机制实现两个label切换图片的关联
- 用栈实现逆序输出键盘输入
- c语言实现,输入一个数,转为16进制输出
- 编写程序:从键盘上输入若干个整数(以输入-1作为结束标识),输出这些数中的最大值和最小值,要求编写一个函数实现最大值和最小值的求取。
- asp实现图片输出,轻松实现img src=xxx.asp
- 关于一道J笔试或者机试题的Java实现:从键盘输入一串字符,翻转后输出(要求不使用string相关类即对象)