天天看點

IO流實作檔案的拷貝

流(IO流):input-output-stream.

IO流實作檔案的拷貝
  • 作用:實作兩個裝置之間的通信.
  • 裝置:記憶體,硬碟(磁盤),控制台,鍵盤,檔案,網絡
  • 網絡:在網絡上,你的主機之外的環境.
  • 流的分類:
    • 根據操作的方式分類:輸入流和輸出流
    • 根據資料的類型分類:位元組流和字元流
      • 位元組流:傳輸的位元組,可以傳輸任意類型的資料.----視訊,音頻,檔案,圖檔等
      • 字元流:傳輸的也是位元組,不同點在與傳輸的過程中加入了編碼的操作,讓我們在傳輸字元的時候更加的便捷-------檔案
  • 以記憶體為參考
    • 位元組流:–對應的父類
    • 位元組輸入流:InputStream
    • 位元組輸出流:OutputStream
  • 字元流:–對應的父類
  • 字元讀入流(将資料輸入記憶體):Reader
  • 字元寫出流(将資料從記憶體取出):Writer
  • 先處理字元流:
  • 執行個體:以磁盤的存儲為例,将内容寫入檔案
    • 分析:
    • 因為傳輸的是字元—字元流
    • 因為是從記憶體傳出—寫出流—FileWriter

注意點:

  • 注意點一:關聯檔案的特點:如果之前不存在,程式會自動建立一個,如果已經存在了,直接使用.但是會将原檔案的内容覆寫.
  • 注意點二:如果隻寫名字,不寫具體的路徑,預設的路徑是目前的工程.
  • 注意點三:我們可以指定自己的路徑,但是一定要保證路徑存在.否則報異常:FileNotFoundException: W:\temp1.txt (系統找不到指定的路徑。)
  • 注意點四:在執行write方法時,資料被臨時寫入了流對象的内部數組中,這是一個位元組數組,或預設取查編碼表
  • 注意點五:流使用完後必須關閉
  • 注意點六:當流對象關閉後不能再進行任何操作,否則報異常:Stream closed
public static void main(String[] args) throws IOException {
	//建立寫出流對象并關聯内容寫出的檔案
	/*
	 * 注意點一:關聯檔案的特點:如果之前不存在,程式會自動建立一個,如果已經存在了,直接使用.但是會将原檔案的内容覆寫.
	 * 注意點二:如果隻寫名字,不寫具體的路徑,預設的路徑是目前的工程.
	 * 注意點三:我們可以指定自己的路徑,但是一定要保證路徑存在.否則報異常:FileNotFoundException: W:\temp1.txt (系統找不到指定的路徑。)
	 */
	FileWriter fileWriter = new FileWriter("temp1.txt");
	
	//調用寫出方法
	/*
	 * 注意點四:在執行write方法時,資料被臨時寫入了流對象的内部數組中,這是一個位元組數組,或預設取查編碼表
	 */
	fileWriter.write("bingbingAndChenchen");
	
	//調用重新整理方法--會将内容真正的寫入檔案
	//fileWriter.flush();
	
	//關閉流---a:将流關閉     b:重新整理
	//注意點五:流使用完後必須關閉
	fileWriter.close();
	//注意點六:當流對象關閉後不能再進行任何操作,否則報異常:Stream closed
	//fileWriter.write("zhangsan");
}
           

檔案的續寫: FileWriter(String file,boolean value)

  • 當value為true的時候,不會将原來的内容删除
  • :是轉義字元 \t:制表符 \:普通的斜杠
  • 實作換行:\r\n–windows下的換行 linux:\n
public static void main(String[] args) {
	//建立對象并關聯檔案
	FileWriter fileWriter = null;
	try {
		fileWriter = new FileWriter("temp2.txt",true);
		
		//寫
		fileWriter.write("bingbing");
		fileWriter.write("\r\n");
		fileWriter.write("zhansan");
		
		
	} catch (IOException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}finally {
		//關閉
		if (fileWriter != null) {
			try {
				fileWriter.close();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}
}
           

讀檔案的兩種方式:

  • 第一種 :read()–一個字元一個字元的讀
  • 第二種:read(字元數組)–一次可以讀取多個字元,将讀到的字元臨時存儲到了這個數組中.
    IO流實作檔案的拷貝
    執行個體:将資料從檔案中取出–檔案讀入流(FileReader)

第一種 :read()–一個字元一個字元的讀

public static void main(String[] args) throws IOException {
		//建立對象并關聯檔案,關聯的檔案必須存在
		FileReader fileReader = new FileReader("temp2.txt");
	
		
		//* 第一種 :read()--一個字元一個字元的讀
		//a:會将目前的字元讀出    b:将目前的指針後移一個字元
		int data;
//		data = fileReader.read();//這裡得到是ASCII值
//		System.out.println((char)data);
//		data = fileReader.read();//這裡得到是ASCII值
//		System.out.println((char)data);
//		data = fileReader.read();//這裡得到是ASCII值
//		System.out.println((char)data);
//		data = fileReader.read();//這裡得到是ASCII值
//		System.out.println((char)data);
//		data = fileReader.read();//這裡得到是ASCII值
//		System.out.println((char)data);
//		data = fileReader.read();//這裡得到是ASCII值
//		System.out.println(data);//這裡傳回的是-1,代表讀完了.
		
		while ((data = fileReader.read()) != -1) {
			System.out.println((char)data);
		}
		
		//關閉流
		fileReader.close();
	}
           

第二種:read(字元數組)–一次可以讀取多個字元,将讀到的字元臨時存儲到了這個數組中.

public static void main(String[] args) throws IOException {
		//建立對象并關聯檔案,關聯的檔案必須存在
		FileReader fileReader = new FileReader("temp2.txt");
		
		
		/*
		 *數組是臨時存放資料的地方,我們會将讀到的字元放到數組中,數組的大小決定了我們一次可以讀到的字元個數,
		 *但是從記憶體的角度考慮,臨時數組并不是越大 越好,一般數組的大小在1Kb左右.
		 * 傳回值:代表的是本次讀到的真實字元的個數,如果傳回值是-1代表讀完了
		 */
		char[] arr = new char[2];
		int num;
//		num = fileReader.read(arr);
//		System.out.println(new String(arr,0,num)+"    "+num);
//		num = fileReader.read(arr);
//		System.out.println(new String(arr,0,num)+"    "+num);
//		num = fileReader.read(arr);
//		System.out.println(new String(arr,0,num)+"    "+num);//代表将字元數組從下标0開始的num個字元轉成字元串
//		num = fileReader.read(arr);
//		System.out.println(new String(arr)+"    "+num);//-1,說明讀完了
		
		while ((num = fileReader.read(arr)) != -1) {
			System.out.println(new String(arr,0,num)+"    "+num);
		}
		
		//關閉流
		fileReader.close();
	}

           

路徑的講解:

  • 相對路徑和絕對路徑
  • 執行個體: D:\workspace\BigData1715N19\src\com\qianfeng\test\Demo1.java 絕對路徑
  • com\qianfeng\test\Demo1.java 相對路徑
  • 相對路徑:從路徑中間的某個部位開始一直到目前的檔案名字
  • 絕對路徑:一個檔案的完整路徑,即從根目錄開始的路徑.
  • 路徑中的/ \是轉義字元 \==/

執行個體:實作檔案的複制

  • 要求:将Demo1的内容拷貝到temp3.txt
public static void main(String[] args) throws IOException {

		//1.建立讀入流與寫出流并關聯對應的檔案
		FileReader fileReader = new FileReader("src/com\\qianfeng\\test\\Demo1.java");
		FileWriter fileWriter = new FileWriter("temp3.txt");
		
		//2.讀寫
		//一次多多個字元
//		char[] arr = new char[10];
//		int num;
//		while ((num = fileReader.read(arr)) != -1) {
//			//将字元數組的部分内容寫入檔案
//			fileWriter.write(arr, 0, num);
//		}
		
		//一次讀一個字元
		int num;
		while ((num = fileReader.read()) != -1) {
			fileWriter.write(num);//自帶了編碼
		}
		
		//3.關閉資源
		fileReader.close();
		fileWriter.close();
	
	}