1. 程式人生 > >java流(IO流)的分類,檔案續寫、讀入

java流(IO流)的分類,檔案續寫、讀入

流(IO流)的分類,寫出流FileWriter

package com.qianfeng.test;

import java.io.FileWriter;
import java.io.IOException;

/*
 * 流(IO流):input-output-stream。作用:實現兩個裝置之間的通訊。
 * 裝置:記憶體,硬碟(磁碟	),控制檯,鍵盤,檔案,網路。
 * 網路:在網路上,你的主機之外的環境。
 * 
 * 流的分類:
 * 根據流的操作的方式分類:輸入流和輸出流
 * 根據資料的型別分類:位元組流和字元流
 * 
 * 位元組流:傳輸的是位元組,可以傳輸任意型別的資料。----視訊,音訊,檔案,圖片等。
 * 字元流:傳輸的也是位元組,不同點在於傳輸過程中加入了編碼的操作,讓我們在傳輸字元的時候更加便捷。----檔案。
 * 
 * 以記憶體為參考
 * 位元組流:--對應的父類
 * 位元組輸入流:InputStream
 * 位元組輸出流:OutputStream
 * 
 * 字元流:--對應的父類
 * 字元讀入流(將資料輸入記憶體):Reader
 * 字元寫出流(將資料從記憶體取出):Writer
 * 
 * 先處理字元流:
 * 例項:以磁碟的儲存為例,將內容寫入檔案
 * 分析:
 * 因為傳輸的是字元----字元流
 * 因為是從記憶體傳出----寫出流--FileWriter
 * 
 */
public class Demo2 {

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

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

package com.qianfeng.test;

import java.io.FileWriter;
import java.io.IOException;

/*
 * 檔案的續寫:FileWriter(String file,boolean value)
 * 當value為true的時候,不會將原來的內容刪除。
 * 
 * \:是轉義字元	\t:製表符		\\:普通的斜槓
 * 實現換行:\r\n----window下的換行。	linux:\n
 * 
 */
public class Demo3 {

	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("zhangsan");

		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			// 關閉
			if (fileWriter != null) {
				try {
					fileWriter.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
	}
}

檔案讀入,read()一個字元一個字元的讀

package com.qianfeng.test;

import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;

/*
 * 例項:將資料從檔案中取出--檔案讀入流(FileReader)
 */
public class Demo4 {

	public static void main(String[] args) throws IOException {
		
		//建立物件並關聯檔案。關聯的檔案必須存在。
		FileReader fileReader = new FileReader("temp2.txt");
		
		//讀
		/*
		 * 兩種方式:
		 * 第一種:read()----一個字元一個字元的讀
		 * 第二種:read(字元陣列)--一次可以讀取多個字元,將讀到的字元臨時儲存到了這個陣列中
		 */
		
		//第一種:read()----一個字元一個字元的讀
		//a:會將當前的字元讀出	b:將當前的指標後移一個字元
		int data;
//		data = fileReader.read();//這裡得到的ASCII值
//		System.out.println((char)data);
//		data = fileReader.read();
//		System.out.println((char)data);
//		data = fileReader.read();
//		System.out.println((char)data);
//		data = fileReader.read();
//		System.out.println((char)data);
//		data = fileReader.read();
//		System.out.println((char)data);
//		data = fileReader.read();
//		System.out.println(data);//這裡返回的是-1,代表讀完了。
		while((data = fileReader.read()) != -1){
			System.out.println((char)data);
		}
		
		//關閉流
		fileReader.close();
		
	}
}

檔案讀入,read(字元陣列)一次可以讀取多個字元

package com.qianfeng.test;

import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;

public class Demo5 {

	public static void main(String[] args) throws IOException {
		
		//建立物件並關聯檔案。關聯的檔案必須存在。
		FileReader fileReader = new FileReader("temp2.txt");
				
		//第二種:read(字元陣列)--一次可以讀取多個字元,將讀到的字元臨時儲存到了這個陣列中.
		/*
		 * 陣列是臨時存放資料的地方,我們會將讀到的字元放到陣列中,陣列的大小決定了我們一次可以讀到的字元個數。
		 * 但是從記憶體的角度考慮,臨時陣列並不是越大越好,一般陣列的大小在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();
	}
}

相對路徑和絕對路徑,內容拷貝

package com.qianfeng.test;

import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
/*
 * 路徑的講解:
 * 相對路徑和絕對路徑
 * 例項:D:\\workspace\\32\\BigData1715N19\\src\\com\\qianfeng\\test\\Demo1.java  絕對路徑
 * 		com\\qianfeng\\test\\Demo1.java	   相對路徑
 * 相對路徑:從路徑中間的某個部位開始一直到當前的檔名字。
 * 絕對路徑:一個檔案的完整路徑,即從根目錄開始的路徑。
 * 
 * 路徑中的/	\是轉義字元	\\==/
 * 
 */

public class Demo6 {

	public static void main(String[] args) throws IOException, InterruptedException {
		
		//例項:實現檔案的賦值
		//要求:將Demo1的內容拷貝到temp3.txt
		//1.建立讀入流和寫出流並關聯對應的檔案。
		
		FileReader fileReader = new FileReader("src\\com\\qianfeng\\test\\Demo2.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);//write()自帶了編碼
		}
		
		//3.關閉資源
		fileReader.close();
		fileWriter.close();
		
	}
}