? 在進(jìn)行寫文件的時(shí)候有時(shí)候返現(xiàn),通過write(byte b[])方式寫文件比原來的文件大一些博杖。流程代碼:
? public static void main(String[] args) throws Exception {
? ? ? ? long t1 = System.currentTimeMillis();
? ? ? ? File file = new File("d:/11.jpg");
? ? ? ? FileInputStream in = new FileInputStream(file);
? ? ? ? BufferedInputStream brin = new BufferedInputStream(in, 1024);
? ? ? ? File outFile = new File("d:/112.jpg");
? ? ? ? FileOutputStream out = new FileOutputStream(outFile);
? ? ? ? BufferedOutputStream bout = new BufferedOutputStream(out);
? ? ? ? byte input[] = new byte[1024];
? ? ? ? while ((brin.read(input))!= -1) {
? ? ? ? ? ? bout.write(input);
? ? ? ? }
? ? ? ? bout.close();
? ? ? ? out.flush();
? ? ? ? out.close();
? ? ? ? System.out.println((System.currentTimeMillis() - t1));
? ? }
看了下write(byte b[])的實(shí)現(xiàn)是
public void write(byte b[]) throws IOException {
? ? ? ? write(b, 0, b.length);
? ? }
當(dāng)在while循環(huán)里面寫文件時(shí),在最后一次如果剩余是562個(gè)byte;由于讀取暫存到的byte是1024大小觅捆,write(byte b[])底層實(shí)現(xiàn)是偏移量是0叮雳,大小是byte的長(zhǎng)度想暗,所以最后一次寫及時(shí)562任然寫入1024。所以在最終寫入的結(jié)果里面是比原始圖片要大一些帘不。那么需要改為说莫,讀到多少寫多少。
public static void main(String[] args) throws Exception {
? ? ? ? long t1 = System.currentTimeMillis();
? ? ? ? File file = new File("d:/餐巾紙.jpg");
? ? ? ? FileInputStream in = new FileInputStream(file);
? ? ? ? BufferedInputStream brin = new BufferedInputStream(in, 1024*5);
? ? ? ? File outFile = new File("d:/餐巾紙2.jpg");
? ? ? ? FileOutputStream out = new FileOutputStream(outFile);
? ? ? ? BufferedOutputStream bout = new BufferedOutputStream(out);
? ? ? ? byte input[] = new byte[1024*5];
? ? ? ? int count;
? ? ? ? while ((count=brin.read(input))!= -1) {
? ? ? ? ? ? bout.write(input,0,count);
? ? ? ? }
? ? ? ? bout.close();
? ? ? ? out.flush();
? ? ? ? out.close();
? ? ? ? System.out.println((System.currentTimeMillis() - t1));
? ? }
總結(jié):
write(byte b[], int off, int len)表示:
b 這一次寫的數(shù)據(jù)
off 這次從b的第off開始寫
len 這次寫的長(zhǎng)度寞焙。
public int read(byte[] b, int off, int len)
b?-- 目標(biāo)字節(jié)數(shù)組储狭。
off?-- 將讀取的數(shù)據(jù)寫入到數(shù)組b中互婿,off表示從數(shù)據(jù)b的哪個(gè)位置開始寫。
len?-- 要讀取的字節(jié)數(shù)辽狈。
IOException?-- 如果發(fā)生I/ O錯(cuò)誤慈参。
NullPointerException?-- 如果b為?null.
IndexOutOfBoundsException?-- 如果off為負(fù),len為負(fù)刮萌,或len大于b.length - off懂牧。
該方法返回讀入緩沖區(qū)的總字節(jié)數(shù),或如果沒有更多的數(shù)據(jù)尊勿,因?yàn)閿?shù)據(jù)流的末尾已到達(dá)返回-1僧凤。