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

简介: import java.io.FileInputStream;import java.io.FileOutputStream;/** * 该篇博客已经Deprecated,请参见I/O流的梳理和小结 * http://blog.
import java.io.FileInputStream;
import java.io.FileOutputStream;
/**
 * 该篇博客已经Deprecated,请参见I/O流的梳理和小结 
 * http://blog.csdn.net/lfdfhl/article/details/525761242
 * 注意事项:
 * 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) {
		}

	}

}

相关文章
|
1月前
|
Java 开发工具
【GDAL-java的四个常用代码示例】
【GDAL-java的四个常用代码示例】
35 0
|
1月前
|
存储 Java 数据处理
|
1月前
|
算法 Java
java面向对象和面向过程分析
java面向对象和面向过程分析
38 0
|
1月前
|
存储 Java 编译器
java和c++的主要区别、各自的优缺点分析、java跨平台的原理的深度解析
java和c++的主要区别、各自的优缺点分析、java跨平台的原理的深度解析
93 0
|
1月前
|
Java API
java中IO与NIO有什么不同
java中IO与NIO有什么不同
|
14天前
|
Java 调度
Java中常见锁的分类及概念分析
Java中常见锁的分类及概念分析
15 0
|
14天前
|
Java
Java中ReentrantLock中tryLock()方法加锁分析
Java中ReentrantLock中tryLock()方法加锁分析
12 0
|
1月前
|
人工智能 监控 算法
java智慧城管源码 AI视频智能分析 可直接上项目
Java智慧城管源码实现AI视频智能分析,适用于直接部署项目。系统运用互联网、大数据、云计算和AI提升城市管理水平,采用“一级监督、二级指挥、四级联动”模式。功能涵盖AI智能检测(如占道广告、垃圾处理等)、执法办案、视频分析、统计分析及队伍管理等多个模块,利用深度学习优化城市管理自动化和智能化,提供决策支持。
220 4
java智慧城管源码 AI视频智能分析 可直接上项目
|
1月前
|
设计模式 Java 数据库连接
【重温设计模式】代理模式及其Java示例
【重温设计模式】代理模式及其Java示例
23 2
|
14天前
|
Java
Java中关于ConditionObject的signal()方法的分析
Java中关于ConditionObject的signal()方法的分析
21 4