1. 程式人生 > >20 (IO,檔案拷貝)

20 (IO,檔案拷貝)

1 IO流

2 FileInputStream

重要方法read(),每次讀取一個位元組,返回值為int。

當沒有位元組的時候,會返回-1,所以檔案的結束標記是-1,那麼會出現一個新的問題,read()為什麼返回int值呢?

而不是返回byte呢?是這樣的,如果是byte,萬一檔案中儲存了-1,程式會錯誤的以為檔案已經結束了,所以它返回的時候前面補上24個0。

3 FileOutputStream

FileOutputStream在建立物件的時候會清空檔案內的內容,再寫進去。

追加:可以在構造時設定追加為true

4 拷貝圖片

問題:當拷貝大檔案時,效率很低

開發推薦:標準格式

5 BufferedInputStream和BufferedOutputStream

他們是對InputStream和OutputStream的包裝,使得他們更加強大,運用緩衝區大小8192,提高效率,每次讀取8192到緩衝區。緩衝區積累8192,使得效率很高。

flush和close,一個是重新整理之後還可以用流,一個是重新整理之後關閉流。

6 位元組流讀取中文的問題

一箇中文等於兩個位元組。所以會出現讀取半個位元組的問題。

寫中文可以寫,但是需要將字串.getBytes()轉換為字元陣列來寫。

7 異常處理模板

jdk1.6版本

package com.haidai.IO;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class Demo1 {

	public static void main(String[] args) throws IOException {
		FileInputStream fis = null;
		FileOutputStream fos = null;
		try {
			fis = new FileInputStream("xxx.txt");
			fos = new FileOutputStream("yyy.txt");

			int len;
			while ((len = fis.read()) != -1) {
				fos.write(len);
			}
		} finally {
			if (fis != null || fos != null) {
				fis.close();
				fos.close();
			}
		}
	}

}

jdk1.7版本(自動關閉流)

package com.haidai.IO;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

public class Demo2 {

	public static void main(String[] args) throws IOException {
		try (
			FileInputStream fis = new FileInputStream("xxx.txt");
			FileOutputStream fos = new FileOutputStream("yyy.txt");
			) {
			int len;
			while ((len = fis.read()) != -1) {
				fos.write(len);
			}
		}
	}

}

8 圖片加密

異或的特點。