JAVA檔案操作知識

軟工16009彭傑發表於2019-03-22

前言:做Web開發,使用者能上傳頭像,檔案等等,需要用到檔案操作。

一、File類

1.File類作用是什麼:JAVA除了8個基本資料型別都是物件。物件都有自己的類,類是對某一類東西的概述。比如persion類,它的屬性有name,age,sex等。同理,File類就是對檔案的描述(檔案包括目錄)。File類裡面有方法。注意:File類是對檔案的概敘,沒包括裡面的資料,所以我們只能對檔案增刪改查,對裡面的資料File類無法操作。

(1)建立檔案

注意:裡面用到了junit,junit相當於不用main方法,就能執行方法,如果使用junit,得匯入org.junit.test包

	@Test
	public void createFile() throws IOException {
		File f = new File("D:\\java.txt");
		f.createNewFile();
	}

(2)建立目錄

注意:建立目錄,目錄名一般不需要字尾,如果不刪除.txt,會建立出java.txt這個名字得目錄

	@Test
	public void createDirectory() throws IOException {
		File f = new File("D:\\java");
		f.mkdir();
	}

二、位元組流

位元組流的作用是什麼:位元組流能對檔案裡面的資料進行操作。

1.FileInputStream類(讀取檔案類容)

注意:檔案內容讀取是已記憶體為參照物,內容從硬碟到記憶體叫Input,而且最後一定要關閉位元組流。

	@Test
	public void read2Java() throws IOException {//該方法為一個一個的讀,效率很慢
		FileInputStream fs = new FileInputStream("D:\\java.txt");
		long len = 0;
		while((len = fs.read()) != -1) {
			char c = (char) len;
			System.out.print(c);
		}
		fs.close();
	}

2.FileOutputStream類(寫入檔案)

注意:檔案內容寫入是已記憶體為參照物,內容從記憶體到硬碟叫Output,而且最後一定要關閉位元組流。

	@Test
	public void java2File() throws IOException {
		FileOutputStream fos = new FileOutputStream("D:\\java.txt");
		fos.write("123".getBytes());
		fos.close();
	}

3.BufferedInputStream(讀取檔案)

注意:檔案內容讀取是已記憶體為參照物,內容從硬碟到記憶體叫Input,而且最後一定要關閉位元組流,關的順序是後建立的先關閉,類似穿衣服,先穿的衣服,脫得時候最後脫。

	@Test
	public void File2Java() throws IOException {
		FileInputStream fis = new FileInputStream("D:\\java.txt");
		BufferedInputStream bis = new BufferedInputStream(fis);
		byte[] b = new byte[1024];
		while(bis.read(b) != -1) {
			System.out.println(new String(b));
		}
		bis.close();
		fis.close();
	}

4.BufferedOutputStream(寫入檔案)

注意:檔案內容寫入是已記憶體為參照物,內容從硬碟到記憶體叫Output,而且最後一定要關閉位元組流,關的順序是後建立的先關閉,類似穿衣服,先穿的衣服,脫得時候最後脫。

	@Test
	public void java2File() throws IOException {
		FileOutputStream fos = new FileOutputStream("D:\\java.txt");
		BufferedOutputStream bop = new BufferedOutputStream(fos);
		bop.write("123".getBytes());
		bop.close();
		fos.close();
	}

5.帶Buffered和不帶Buffered有什麼區別

帶Buffered的是緩衝位元組輸入流或者是緩衝位元組輸出流,它的效率比不帶Buffered的效率快很多。

6.序列化和物件流

注意:想要物件寫入文字,,該物件必須實現Serializable介面,改介面為空介面,叫做標誌性介面。而且最後一定要關閉位元組流,關的順序是後建立的先關閉,類似穿衣服,先穿的衣服,脫得時候最後脫。
每個實現Serializable介面的類都有唯一編號,編號由屬性名+時間戳計算得來。

6.1物件寫入文字

	@Test
	public void obj2File() throws IOException {
		FileOutputStream fos = new FileOutputStream("D:\\java.txt");
		ObjectOutputStream oos = new ObjectOutputStream(fos);
		Map<String, String> m = new HashMap<String, String>();
		m.put("1", "a");
		m.put("2", "b");
		oos.writeObject(m);
		oos.close();
		fos.close();
	}

6.2讀入文字里存的物件

注意:檔案內容寫入是已記憶體為參照物,內容從硬碟到記憶體叫Output,而且最後一定要關閉位元組流,關的順序是後建立的先關閉,類似穿衣服,先穿的衣服,脫得時候最後脫。

	@Test
	public void obj2File() throws Exception {
		FileInputStream fos = new FileInputStream("D:\\java.txt");
		ObjectInputStream oos = new ObjectInputStream(fos);
		Map<String, String> m = new HashMap<String, String>();
		m = (Map<String, String>) oos.readObject();
		System.out.println(m);
		oos.close();
		fos.close();
	}

三、字元流

字元流有什麼作用:字元流是操所文字資料的。

1.FileReader(讀取檔案內容)

注意:檔案內容讀取是已記憶體為參照物,內容從硬碟到記憶體叫Read,而且最後一定要關閉位元組流。

	@Test
	public void file2Java() throws Exception {
		FileReader fr = new FileReader("D:\\java.txt");
		int len = 0;
		while((len = fr.read()) != -1) {//一個字元一個字元的讀
			System.out.print((char)len);
		}
		fr.close();
	}

2.FileWriter (寫入檔案)

注意:檔案內容寫入是已記憶體為參照物,內容從記憶體到硬碟叫Write,而且最後一定要關閉位元組流。

	@Test
	public void java2File() throws Exception {
		FileWriter fw = new FileWriter("D:\\java.txt");
		fw.write("abc");
		fw.close();
	}

3.BufferedReader(讀取內容檔案)

注意:檔案內容讀取是已記憶體為參照物,內容從硬碟到記憶體叫Read,而且最後一定要關閉位元組流,關的順序是後建立的先關閉,類似穿衣服,先穿的衣服,脫得時候最後脫。

	@Test
	public void java2File() throws Exception {
		FileReader fw = new FileReader("D:\\java.txt");
		BufferedReader br = new BufferedReader(fw);
		String str = null;
		while((str = br.readLine())!= null){
			System.out.println(str);
		}
		br.close();
		fw.close();
	}

4.BufferedWriter(寫入檔案)

注意:檔案內容寫入是已記憶體為參照物,內容從硬碟到記憶體叫Writer,而且最後一定要關閉位元組流,關的順序是後建立的先關閉,類似穿衣服,先穿的衣服,脫得時候最後脫。

	@Test
	public void java2File() throws Exception {
		FileWriter fw = new FileWriter("D:\\java.txt");
		BufferedWriter bw = new BufferedWriter(fw);
		bw.write("中國");
		bw.close();
		fw.close();
	}

四、位元組流和字元流的區別

1.位元組流對於所有格式檔案都能操錯,而字元流只能操作文字,不然會出現奇怪的東西。

五、檔案操作的面試題

1.什麼是序列化?怎麼才能序列化?

序列化是物件轉換成位元組。要序列化得實現Serializable介面

2.位元組流和字元流得區別

答案在第四板塊。

相關文章