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) {
}

}

}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM