常用IO類總結_2(FileWriter、FileReader;BufferedInputStream、BufferedOutPutStream)

說明:總結這種東西,要是自己肚子裏沒有電墨水還真的是不那麼容易做到,說錯了不僅害了別人也害了自己。反正不懂的直接百度,不管是理論還是代碼都是一堆一堆的。。。下面直接貼出測試代碼

===========================================

下面進行FileWriter和FileReader類的測試:(原先測試的時候沒有給其設置編碼,所以導致中文亂碼,以下已經設置了GBK編碼,所以讀寫不會出現亂碼。)

package com.lin.filewriterandreader;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;

import org.junit.Test;

public class TestWriterAndReader {

	@Test
	public void testFileReader(){
//		FileReader fr = null;
		InputStreamReader isr = null;
		try {
			File file = new File("C:/Users/Administrator/Desktop/hello1.txt");
//			fr = new FileReader(file);
			isr = new InputStreamReader(new FileInputStream(file), "GBK");
			
			//每次讀取的字符數
			char[] c = new char[24];
			//記錄每次讀取的長度
			int len;
			while((len = isr.read(c)) != -1){
				String str = new String(c, 0, len);
				System.out.println(str);
			}
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}finally{
			if(isr!=null){
				try {
					isr.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
		
	}
	
	/*==========================================================*/
	
	/**
	 * 使用FileReader  FileWriter 可以實現文本文件的複製。
	 * 對於非文本文件(視頻、音頻、圖片等),只能使用字節流!
	 **/
		
	@Test
	public void testFileInputStreamOutputStream(){
		//1.提供讀入、寫出的文件
		File file1 = new File("C:/Users/Administrator/Desktop/hello1.txt");
		File file2 = new File("C:/Users/Administrator/Desktop/hello2.txt");
		//2.提供相應的流
		//輸入流對應的文件一點要存在,否則拋出異常。輸出流對應的文件可以不存在,執行過程中會自動創建。
//		FileReader fr = null;
//		FileWriter fw = null;
		InputStreamReader isr = null;
		OutputStreamWriter osw = null;
		try {
//			fr = new FileReader(file1);
//			fw = new FileWriter(file2);
			
			isr = new InputStreamReader(new FileInputStream(file1), "GBK");
			osw = new OutputStreamWriter(new FileOutputStream(file2),"GBK");
			
			//3.實現文件的讀取並寫入(複製)
			char[] c = new char[24];//每次讀取到的數據要寫入的數組
			int len;//每次讀入到byte中的字節的長度
			while((len=isr.read(c)) != -1){
				osw.write(c, 0, len);
			}
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}finally{
			if(isr!=null){
				try {
					isr.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
					
			}
			if(osw!=null){
				try {
					osw.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
					
			}
		}
	}
}

=================================================

下面進行BufferedReader和BufferedWriter類的測試:(同樣解決了中文亂碼,都是一樣的處理方式)

package com.lin.bufferedwriterreader;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;

import org.junit.Test;

/**
IO的體系
*		抽象基類			節點流(文件流)			緩衝流(處理流的一種,可以提升文件操作的效率)
*		InputStream		FileInputStream		        BufferedInputStream
*		OutputStream	        FileOutputStream	        BufferedOutputStream(寫完數據後要調用flush())
*		Reader			FileReader			BufferedReader(readLine())
*		Writer			FileWriter			BufferedWriter(寫完數據後要調用flush())
**/
public class TestBuffered {
	
	@Test
	public void testBufferedReader(){
		BufferedReader br = null;
		BufferedWriter wr = null;
		try {
			File file = new File("C:\\Users\\Administrator\\Desktop\\1.txt");
			File file2 = new File("C:\\Users\\Administrator\\Desktop\\3.txt");
//			FileReader fr = new FileReader(file);
//			FileWriter fw = new FileWriter(file2);
			
			InputStreamReader inStream = new InputStreamReader(new FileInputStream(file), "GBK"); 
			OutputStreamWriter writerStream = new OutputStreamWriter(new FileOutputStream(file2),"GBK");
			
			br = new BufferedReader(inStream);
			wr = new BufferedWriter(writerStream);
			/*char[] c = new char[1024];
			int len;
			while((len=br.read(c))!=-1){
				String str = new String(c,0,len);
				System.out.println(str);
			}*/
			String str;
			while((str=br.readLine())!=null){
				System.out.println(str);//,每次讀取一行數據並每次顯示一行數據在控制檯上
				wr.write(str+"\n");//將讀取的數據存儲在文件中
				wr.flush();
			}
		} catch (IOException e) {
			e.printStackTrace();
		}finally{
			if(br!=null){
				try {
					br.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
	}
	
	//使用BufferedInputStream和BufferedOutputStream實現非文本文件的複製
	@Test
	public void BufferedInputOutputStream(){
		//3.將創建的結點流的對象作爲形參傳遞給緩衝流的構造器中
		BufferedInputStream bis = null;
		BufferedOutputStream bos = null;
		try {
			//1.提供讀入、寫出的文件
			File file1 = new File("C:\\Users\\Administrator\\Desktop\\7.jpg");
			File file2 = new File("C:\\Users\\Administrator\\Desktop\\72.jpg");
			//2.創建相應的節點流,FileInputStream、FileOutputStream
			FileInputStream fis = new FileInputStream(file1);
			FileOutputStream fos = new FileOutputStream(file2);
			bis = new BufferedInputStream(fis);
			bos = new BufferedOutputStream(fos);
			//4.具體的實現文件複製的操作
			byte[] b = new byte[1024];//每次讀取的字節數
			int len;//用來記錄每次讀取的字節數的長度
			while((len=bis.read(b))!=-1){
				bos.write(b,0,len);
				bos.flush();//如果最後一次讀取的時候數據沒有存滿,則強制發送,否則有可能在一直等待
			}
		} catch (IOException e) {
			e.printStackTrace();
		}finally{//關閉相應的流
			if(bos!=null){
				try {
					bos.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
					
			}
			if(bis!=null){
				try {
					bis.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
					
			}
		}
			
	}
}

======================================================

小結,在實際開發中緩衝流最經常被使用:BufferedInputStream、BufferedOutputStream(寫完數據後要調用flush())、BufferedReader(readLine())、BufferedWriter(寫完數據後要調用flush()) 。原因當然是相比之前的流來說可以提升文件操作的效率啦~~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章