天天看點

檔案(二) IO流(FileReader FileWriter)

IO流:傳輸資料的一套機制

I:input (輸入)

O:output(輸出)

存儲資料:記憶體 持久化存儲

持久化存儲:長期儲存

IO流分為輸入流和輸出流

IO流從功能上來說分為字元流和位元組流

字元流是隻能操作字元(txt)

位元組流:可以操作所有檔案

字元流 Reader Writer

位元組流 InputStream OutpurStream

以上4種都是抽象類,不能直接使用

輸入還是輸出是相對于記憶體來說

如果向記憶體中讀取内容,就是輸入到記憶體。輸入流

如果從記憶體中向外面寫入内容,就是輸出。

字元輸出流:FileWriter 将字元寫入到檔案中

如果想要追加資料,在構造方法後面提供 true

舉例:

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

public class FileWriterDemo {
  public static void main(String[] args) throws IOException {
	//字元輸出流
	  //如果路徑有,就直接建立檔案
	  //如果檔案已經存在。會建立新的檔案覆寫掉以前的檔案
	  FileWriter fw=new FileWriter("F:\\a,txt,true");
	  //寫入資料到緩存區
	  fw.write("趁陽光正好,趁微風不燥");
	  //沖刷緩沖區
	  fw.flush();
	  //關閉,釋放資源
	  //注意:關閉會自動沖刷緩沖區,是以有時就沒必要再沖刷緩沖區
	  fw.close();
	  //清空對象
	  fw=null;
}
}
           

檔案的異常處理:

1、現在trycatch外面聲明對象,設定為null,保證對象的作用域在try…catch…finally裡面

2、建立對象,并且在finally裡面判斷是否為null。因為一旦對象為null,那麼就會出現空指針異常。

3、在finally的判斷方法中,關閉流。關閉流也需要捕獲異常,因為關閉流也不一定成功。

4、在捕獲關閉流異常的trycatch中添加finally,無論關閉流是否成功,都給對象設定為null。

5、如果寫入資料,需要去沖刷緩沖區,防止資料的丢失。

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

public class FileWriterExceptioonTest {
	public static void main(String[] args) {
		// 建立對象
		FileWriter fw = null;
		try {
			fw = new FileWriter("F:\\b.txt");
			fw.write("你好,周傑倫");
			// 沖刷
			fw.flush();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally{
			if (fw != null){
				try {
					fw.close();
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}finally{
					fw = null;
				}
			}
		}
	}
}
           

JDK1.7的特性

Try with resource

try(AutoCloseable的子類/子接口){

對象可以保證自動關閉

}

注意:try小括号中内容不能是傳遞過來

import java.io.FileWriter;

public class TryWithResourceDemo {
	public static void main(String[] args) {
		
		// JDK1.7特性
		// try ... with ... resouce  可以保證自動關閉
		// 使用格式 try(AutoCloseable的子類或者子接口)
		// 可以保證裡面的對象自動關閉
		try (FileWriter fw = new FileWriter("F:\\b.txt")){
			fw.write("再見,周傑倫");
		}catch(Exception e){
			e.printStackTrace();
		}
	}
}
           

字元輸入流:

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

public class FileReaderDemo {
   public static void main(String[] args) throws IOException {
      //字元輸入流:将檔案的内容讀取到記憶體中
	   //建立對象
	   FileReader fr=new FileReader("F:\\c.txt");
	   //讀取字元
	   //一次讀取一個字元
	   //如果讀到最後,沒有字元,傳回-1
	   //因為是從檔案中一個個讀取,是以這種寫法,效率比較低
	   int ch;
	   while((ch=fr.read())!=-1){
		   System.out.println((char)ch);
	   }
	   fr.close();
}
}
           

字元輸入流:FileReader

FileReader預設一次讀取一個字元,效率比較低下,可以通過字元數組形成一個緩沖區,進而來提升效率。

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

public class FileReaderDemo02 {
	public static void main(String[] args) throws IOException {
		// 通過字元數組作為緩沖區,讀取資料
		FileReader fr = new FileReader("F:\\c.txt");
		// 定義一個字元數組
		char[] chs = new char[3];
		
		// 讀一次就擷取對應字元數組長度的内容
		// 如果沒有讀取到資料,那麼傳回-1
		// 讀取到的字元長度
		int len;
		while((len = fr.read(chs)) != -1){
			System.out.println(new String(chs,0,len));
		}
		fr.close();
	}
}
           

練習 :copy檔案

import java.io.FileReader;
import java.io.FileWriter;

public class CopyTxt {
	public static void main(String[] args) {
		// 拷貝檔案  思路:先去對應的檔案中讀取内容
		// 讀取一行寫入一行
		// 讀取時候使用字元數組
		long startTime = System.currentTimeMillis();
		FileReader fr = null;
		FileWriter fw = null;
		try{
			fr = new FileReader("F:\\667.txt");
			fw = new FileWriter("F:\\a556.txt");
			
			// 先讀再寫
			// 讀取需要使用到字元數組,那麼先建立數組
			char[] chs = new char[1024 * 8];
			// 定義一個變量來接收實際讀取到的長度
			int len;
			while ((len = fr.read(chs)) != -1){
				// 表示讀取到了内容 長度就是len
				// 寫入到檔案中
//				fw.write(new String(chs,0,len));
				fw.write(chs, 0, len);
			}
			fw.flush();
		}catch(Exception e){
			e.printStackTrace();
		}finally{
			// fr和fw都有可能是null
			if (fr != null){
				try{
					fr.close();
				}catch(Exception e){
					e.printStackTrace();
				}finally{
					fr = null;
				}
			}
			
			if (fw != null){
				try{
					fw.close();
				}catch(Exception e){
					e.printStackTrace();
				}finally{
					fw = null;
				}
			}
		}
		// 複制文本花費的總時間
		System.out.println(System.currentTimeMillis() - startTime);
	}
}
           

繼續閱讀