Java利用IO流复制照片完整示例和详细分析

import java.io.FileInputStream;
import java.io.FileOutputStream;
/**

* 注意事项:
* int java.io.FileInputStream.read(byte[] b) throws IOException
* 方法的官方文档描述:
* Reads up to b.length bytes of data from this input stream into an array of bytes.
* This method blocks until some input is available.
* 即可以这么理解:
* FileInputStream会不断地读取字节数据到字节数组b中.
* 只要读了一次,那么我们就相应地执行一次写的操作:
* fileOutputStream.write(temp,0,len);
* 什么情况下这个读的过程会终止呢?
* 当已经读取到数据末尾的时候,有个标识符-1;表示已经到了末尾.
*
* 有种不太恰当的理解:
* FileInputStream会一次次地读取字节数据到字节数组b中.
* 每读一次后,就会稍微暂停一下,然后执行
* fileOutputStream.write(temp,0,len);
* 进行数据写的操作.
*
* 其实如下理解更合适一些:
* FileInputStream是在不断地读数据(而不要想象成带有暂停性质的一次次地读取).
* 只是它每读一次的数据必然不超过b.length的大小,但有可能是不一样的长度,
* 比如:在极多数情况下,最后一次的时候读取的字节数会小于b.length大小.
* 每采用read()方法读一次呢,读到的数据就会存到字节数组b中,并且该方法
* 还返回了这次读取的字节的多少(len).
* 于是我们对字节数组b中从o到len的数据进行写操作:
* fileOutputStream.write(temp,0,len);
*
* 现在就明白了为什么使用:
* fileOutputStream.write(temp);
* 是不准确的,很可能导致复制后的照片比原始照片大.
* 因为fileOutputStream.write(temp);方法每次都是
* 写了b字节数组大小的数据,而不是已经b中实际有多少
* 数据.
* 这样的操作在前几次是没有什么问题的,因为每次装的
* 都是b字节数组大小的数据,但是最后一次往往是装不满
* b的.所以每次应该根据b中的实际数据到底有多少来进行
* 操作即采用fileOutputStream.write(temp,0,len);
* 可以兼顾到每一次.
*/
public class CopyPhoto {
public static void main(String[] args) {
CopyPhoto copyPhoto = new CopyPhoto();
copyPhoto.copy();
}

private void copy() {
try {
FileInputStream fileInputStream=new FileInputStream("D:\\c.jpg");
FileOutputStream fileOutputStream=new FileOutputStream("D:\\new.jpg");
int len=0;
byte temp []=new byte[1024*8];;
while((len=fileInputStream.read(temp))!=-1){
System.out.println("len="+len);
//It is right
fileOutputStream.write(temp,0,len);
//It is wrong
//fileOutputStream.write(temp);
}
fileOutputStream.close();
fileInputStream.close();
} catch (Exception e) {
}

}

}

时间: 2024-10-12 21:46:46

Java利用IO流复制照片完整示例和详细分析的相关文章

Java之IO流---字节流

1.1 IO流的引入 IO流在很多语言已有体现,诸如C语言的stdio.h,C++中的iostream.Java中的IO流大抵是用于在控制台.磁盘.内存上进行数据的读写操作,完成数据的传递. 我们可以对它进行如下分类: 按处理的数据类型可分为字节流与字符流 按流的流向可分为输入流(in)与输出流(out) 按流的功能可分为节点流(Node)和过滤流(Filter) 本篇侧重于梳理字节流相关的知识,毕竟作为字符流的前辈,它还是非常重要的.下篇继续梳理字符流. 1.2 IO流的继承体系图 大概描述了

【Java】IO流简单分辨

转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/5827509.html Java的IO流体系十分庞大,并且体系层次稍复杂,很容易记混或记错.在此,我把平时经常用到的几个流类的简易区分以及体系层次整理出来,方便记忆与辨析.本人对IO了解尚浅,文章如有错漏,恳请前辈指正,感激不尽! 字节流体系: 基类:InputStream/outputStream(抽象类,不能new) 子类: 文件IO字节流:FileInputStream/FileoutputStream

【JAVA的 IO流之FileInputStream和FileOutputStream】

java的 IO流即输入输出流,流是一组有顺序的,有起点和终点的字节结合,是对数据传输的总称.即数据在两设备间的传输称为流,流的本质是数据传输. IO流可以分为字节流和字符流.给出相应的IO结构图: 在接下来的一段时间里,将会慢慢介绍各种流的使用,本篇博客先介绍字节流的FileOutputStream和相对应的FileInputStream. 一.FileOutputStream(文件输出流) OutputStream是一个抽象类,抽象类必须通过子类实现.现在要向文件里输出就要用FileOutp

使用IO流复制文件夹(包括子目录)

IO流用于处理设备上的数据(包括硬盘,内存,键盘录入). IO流可根据流向不同分为输入流和输出流,根据处理数据类型不同分为字节流和字符流. 字符流的由来: 因为数据编码的不同,而有了对字符进行高效操作的流对象.本质其实就是基于字节流读取时,去查了指定的码表. 字节流和字符流的区别: a.读写单位不同:字节流以字节(8bit)为单位,字符流以字符为单位,根据码表映射字符,一次可能读多个字节. b.处理对象不同:字节流能处理所有类型的数据(如图片.avi等),而字符流只能处理字符类型的数据. 结论:

java常用IO流数据流小结

  类名 常用方法 说明 输入流 InputStream int read(); 只能读字节流,虽然返回值是int,但只有低8位起作用. DataInputStream Type readType(); 可以读二进制流,可以读byte,short,int,long,double等二进制流. BufferedReader String readLine(); 可以读文本行. 输出流 OutputStream void write(int); 只能写字节流,虽然形参是int,但只有低8为起作用. D

JAVA中IO流总结

本文是在学习中的总结,欢迎转载但请注明出处:http://write.blog.csdn.net/postedit/42119261 我想你对JAVA的IO流有所了解,平时使用的也比较的多,但是对于其具体分类和继承体系可能知道的并不多,可能也很少去看相关的API文档,找出其中的关系和各自的应用情形.本文简单对常用的IO流进行分类整理,并简单举例说明其应用.希望本文对你有所帮助. (A)IO流大致分为两种: (1)字节流:对应抽象类为InputStream(输入流)和 OutputStream(输

java的IO流,字节流和字符流

java操作文件都是通过流来处理的,(其实其他很多语言也是这样) 第一:java的IO流,分为:输入流 和 输出流(这真是废话,这是从流向的角度来说的) 第二:java的所有IO流,只分为:字节流 和 字符流(其实就是传输的颗粒,传输的基本单位) 总结:凡是处理纯文本的优先考虑字符流:其他的才考虑使用字节流

Java笔记-IO流的运用

1.InputStream和System.in(Scanner) InputStream 输出流以字节为单位来获取数据,且需要复杂的判断并创建字节数组作为缓冲 另外字节转换为字符时容易出现中文乱码的情况:Scanner Java扫描器类,可以从输入流中读取指定类型的数据或字符串. 对于字符数据的读取,应该使用Scanner扫描器进行封装,然后获取字符串类型的数据 2. out和err out和err是System类的两个static类成员变量: out:主要是输出调试信息的输出流,以黑色显示 e

java的Io流学习

Java中io流的学习(一)File:https://blog.csdn.net/qq_41061437/article/details/81672859 Java中io流的学习(二)FileInputStream和FileOutputStream:https://blog.csdn.net/qq_41061437/article/details/81742175 Java中io流的学习(三)BuffereInputStream和BuffereOutputStream:https://blog.