1. 程式人生 > >(Java)IO流物件(二)位元組流

(Java)IO流物件(二)位元組流

【開發常用的編碼表】 GBK  、UTF-8  、ISO-8859-1

【編碼和解碼】

           文字 -> 數字: 編碼 。"abc".getBytes()       byte[]

           數字 -> 文字 : 解碼。 byte[] ={97,98,99}    new  String(b)

【位元組輸出流OutputStream】抽象類

/*  
 *  OutputStream(抽象類)
 *  位元組輸出流: java.io.OutputStream 所有位元組輸出流的超類
 *    作用:從java程式,寫出檔案
 *    位元組:每次只操作檔案中一個位元組,可以寫任意檔案
 *    
 *    write(int b)   將指定的位元組寫入輸出流
 *    write(byte[] b)  寫將b.length個位元組從指定的byte陣列中寫入輸出流
 *    write(byte[],int off , int len) 將指定byte陣列中從偏移量off開始的len個位元組寫入次輸出流
 *    close()  關閉此輸出流,並釋放與之有關的所有系統資源
 *    
 *    注意:流物件操作檔案時,自己不做,所有操作依賴於系統資源
 */

【FileOutputStream類】檔案寫入、續寫、換行

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;

/*
 * A. FileoutputStream   寫入資料檔案
 *    構造方法:  引數(File 封裝檔案) (String 字串的檔名)
 *    
 *    流物件使用步驟:
 *      1. 建立流子類的物件,繫結資料目的
 *      2. 呼叫流物件的方法write寫
 *      3. 釋放資源close
 *    
 *    注意:流物件的構造方法,可以建立檔案,如果檔案存在直接覆蓋
 *   
 * B. 檔案的續寫和換行  
 */
public class FileOutputStreamDemo1 {
	public static void main(String[] args)  throws IOException {
		function_2();
	}
	
	//A. 寫入資料
	public static void function_1() throws IOException{
        FileOutputStream fos = new FileOutputStream("E:\\workspace\\Demo\\ab.txt");
		
		// 流物件的方法write寫資料   寫入一個位元組
		// 1. 寫入檔案是字母 d
		fos.write(100);     
		
		// 寫入100
		fos.write(49);
		fos.write(48);
		fos.write(48);
		
		// 2. 寫位元組陣列   a b c d
		byte[] bytes = {97,98,99,100};
		fos.write(bytes);
		
		// 寫位元組陣列額一部分  a b 
		fos.write(bytes,0,2);
		
		// 寫入位元組陣列的簡便方式   寫入"Hello World" ,getBytes()將字串轉為位元組
		fos.write(" Hello World".getBytes());
		
		// 關閉資源
		fos.close();
	}
	
	//B. 檔案的續寫和換行
	// 1. 續寫:在FileOutputStream構造方法的第二個引數加入 true
	// 2. 換行:寫入換行,符號換行  \r\n   可以寫在上一行的末尾  或  下一行的開頭
	public static void function_2() throws IOException{
		File file = new File("E:\\workspace\\Demo\\ab1.txt");
		FileOutputStream fos = new FileOutputStream(file,true);
		
		fos.write("Hello\r\n".getBytes());
		fos.write("World".getBytes());
		
		fos.close();
	}
	/*  列印輸出:
	      Hello
          World
	 */
}

【IO中的異常處理】

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

/*
 * IO流的異常處理  try  catch   finally
 */
public class FileOutputStreamIOEDemo1 {
	public static void main(String[] args) {
		
		// 1.保證流物件 fos 變數  作用域足夠
		FileOutputStream fos = null;
		// try 外邊宣告變數,try內建立物件
		try{
			fos = new FileOutputStream("E:\\workspace\\Demo\\ab2.txt");
			fos.write(100);
		}catch(IOException ex){
			System.out.println(ex.getMessage());
			throw new RuntimeException("檔案寫入失敗,重試");
		}finally{
			try{
				//2. 若建立流物件失敗,即fos==null,不需要close
				if(fos != null)
				   fos.close();
			}catch(IOException ex){
				throw new RuntimeException("關閉資源失敗");
			}
			
		}
	}

}

【位元組輸入流InputStream】超類

/*
 *  InputStream  所有位元組輸入流的超類
 *    作用:讀取任意檔案,每次只讀取一個位元組
 *    讀取方法:
 *      int read()  讀取一個位元組
 *      int read(byte[] b)  讀取一定量的位元組,儲存到陣列中
 * 
 */

【位元組輸入流FileInputStream】

import java.io.FileInputStream;
import java.io.IOException;
/*
 *  FileInputStream 讀取檔案
 *  構造方法:為這個流物件繫結資料來源
 *        引數(File 型別物件) (String 物件)
 * 
 *  輸入流讀取檔案的步驟:
 *       1. 建立位元組輸入流的子類物件
 *       2. 呼叫讀取方法read 讀取
 *       3. 關閉資源
 *       
 *       read()方法,read()執行一次,就會自動讀取下一位元組
 *                 返回的是讀取到的位元組,讀取到結尾後返回 -1     
 */
public class FileInputDemo1 {
	public static void main(String[] args) throws IOException {
		FileInputStream fos = new FileInputStream("E:\\workspace\\Demo\\ab.txt");    // 檔案中元素為ABC
		
		// 使用迴圈方法讀取檔案一個位元組,迴圈結束條件read()方法返回 -1
		int len = 0;
		while((len=fos.read()) != -1){
			//System.out.println(len);              // 65 66 67
			System.out.print((char)len);            // A   B  C
		}
		
		/* 注意
		while(fos.read() != -1){
			System.out.println(fos.read());         // 66 -1
		}
		*/
		
		/*
		// 獲取一個位元組,呼叫方法read,返回int
		int i = fos.read();
		System.out.println(i);       // 獲取的是65     但真實檔案中是 A
		
		i = fos.read();
		System.out.println(i);       // 獲取的是66     但真實檔案中是 B
		
		i = fos.read();
		System.out.println(i);       // 獲取的是67     但真實檔案中是 C
		
		i = fos.read();
		System.out.println(i);       // 檔案中沒有元素,返回 -1
		*/
		
		// 關閉資源
		fos.close();
	}

}
import java.io.FileInputStream;
import java.io.IOException;

/*
 *  FileInputStream 讀取檔案
 *       讀取方法 int read(byte[] b)
 *            引數:陣列b起緩衝作用,提高效率
 *            返回值int: 表示讀取到多少個有效的位元組數
 */
public class FileInputDemo2 {
	public static void main(String[] args) throws IOException {
		FileInputStream fos = new FileInputStream("E:\\workspace\\Demo\\ab.txt");    // 檔案中元素為ABCDE
		// 建立位元組陣列
		byte[] b = new byte[2];
		int len = 0;
		
		// 使用迴圈讀取一個檔案
		while((len = fos.read(b)) != -1){
			System.out.print(new String(b,0,len));     // ABCDE
		}
		
		// 關閉資源
		fos.close();
	}
   
}
/*
int len = fos.read(b);
		System.out.println( new String(b)); // AB
		System.out.println(len);            // 2
		
		len = fos.read(b);
		System.out.println(new String(b));  // CD
		System.out.println(len);            // 2
		
		len = fos.read(b);
		System.out.println(new String(b));  // E
		System.out.println(len);            //
		
		len = fos.read(b);
		System.out.println(new String(b));  // E
		System.out.println(len);            //
*/

【位元組流複製檔案】效率最快的方法

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

/*
 *   將資料來源:E:\\workspace\\Demo\\a\\jdk+api+1.8_China.zip
 *     複製到:E:\\workspace\\Demo\\b\\jdk+api+1.8_China.zip
 */
public class Copy {
	public static void main(String[] args) {
		// 定義兩個流物件變數
		FileInputStream fis = null;
		FileOutputStream fos = null;
		try{
			// 建立2個流物件,繫結資料來源 和 資料目的
			fis = new FileInputStream("E:\\workspace\\Demo\\a\\jdk+api+1.8_China.zip");
			fos = new FileOutputStream("E:\\workspace\\Demo\\b\\jdk+api+1.8_China.zip");
			
			// 採用陣列快取提高效率
			byte[] b = new byte[1024];  
			int len = 0;
			while((len = fis.read(b)) != -1){
				fos.write(b,0,len);
			}
		}catch(IOException ex){
			System.out.println(ex);
			throw new RuntimeException("檔案複製失敗");
			
		}finally{
			try{
				if(fos != null)
					fos.close();
			}catch(IOException ex){
				throw new RuntimeException("資源釋放失敗");
			}finally{
				try{
					if(fis != null)
						fis.close();
				}catch(IOException ex){
					throw new RuntimeException("資源釋放失敗");
				}
				
			}
			
		}	
		
	}

}