文件輸入輸出流


一、對文件操作的流——基本知識



1.read()方法讀取流中的數據是按照字節一個個讀取,而且每次只讀取一個字節。實踐如下:

代碼如下:


import java.io.FileInputStream;

/**
 * 文件的輸入輸出流
 * @author Administrator
 *
 */
public class FileOperationTest {
	
	public static void main(String[] args) throws Exception {
		readFile("G:\\文件測試\\1.txt");
	}
	/**
	 * 讀取指定的文件
	 * @param fileName
	 */
	public static void readFile(String fileName) throws Exception{
		//根據fileName構建文件輸入流對象
		FileInputStream fis = new FileInputStream(fileName);
		//從此輸入流中讀取數據一個個讀
		int i= fis.read();
		System.out .print((char)i);
	}	
		
	}
*read()方法如何實現字符串的輸出

代碼如下:

import java.io.FileInputStream;

/**
 * 文件的輸入輸出流
 * @author Administrator
 *
 */
public class FileOperationTest {
	
	public static void main(String[] args) throws Exception {
		readFile("G:\\文件測試\\1.txt");
	}
	/**
	 * 讀取指定的文件
	 * @param fileName
	 */
	public static void readFile(String fileName) throws Exception{
		//根據fileName構建文件輸入流對象
		FileInputStream fis = new FileInputStream(fileName);
		//從此輸入流中讀取數據一個個讀
		int i= fis.read();
		//用read()實現文件的完整輸出
		while(i!=-1){
			System.out.print((char)i);
			i = fis.read();
		}
	}	
		
}
*read()讀取到文件末尾,返回-1。

2.read(byte[] b)按字節讀取流中的數據,將讀取到的數據存到byte[]數組中

代碼如下:

import java.io.FileInputStream;

/**
 * 文件的輸入輸出流
 * @author Administrator
 *
 */
public class FileOperationTest {
	
	public static void main(String[] args) throws Exception {
		readFile("G:\\文件測試\\1.txt");
	}
	/**
	 * 讀取指定的文件
	 * @param fileName
	 */
	public static void readFile(String fileName) throws Exception{
		//根據fileName構建文件輸入流對象
		FileInputStream fis = new FileInputStream(fileName);
	/*	//從此輸入流中讀取數據一個個讀
		int i= fis.read();
		//用read()實現文件的完整輸出
		while(i!=-1){
			System.out.print((char)i);
			i = fis.read();
		}*/
		//獲取此流中的有效字節數
		int length=fis.available();
		//按塊讀
		byte[] buf= new byte[length];//剛好存滿
		fis.read(buf);//此行代碼執行完畢後文件中所有的字節都存到buf數組中
		String fileCountent = new String(buf);//用一個字符串接收這個數組
		System.out .println(fileCountent);
		//關閉流
		fis.close();
	}	
}
*中文字符由兩個字節組成,在對流數據進行讀取時會將字符拆成字節一個個讀取,造成亂碼。

代碼如下:

import java.io.FileInputStream;

/**
 * 文件的輸入輸出流
 * @author Administrator
 *
 */
public class FileOperationTest {
	
	public static void main(String[] args) throws Exception {
		readFile("G:\\文件測試\\1.txt");
	}
	/**
	 * 讀取指定的文件
	 * @param fileName
	 */
	public static void readFile(String fileName) throws Exception{
		//根據fileName構建文件輸入流對象
		FileInputStream fis = new FileInputStream(fileName);
		//從此輸入流中讀取數據一個個讀
		int i= fis.read();
		//用read()實現文件的完整輸出
		while(i!=-1){
			System.out.print((char)i);
			i = fis.read();
		}
		/*//獲取此流中的有效字節數
		int length=fis.available();
		//按塊讀
		byte[] buf= new byte[length];//剛好存滿
		fis.read(buf);//此行代碼執行完畢後文件中所有的字節都存到buf數組中
		String fileCountent = new String(buf);//用一個字符串接收這個數組
		System.out .println(fileCountent);
		//關閉流
		fis.close();*/
	}	
}
通過read(byte[] b)方法將流中的數據整體保存在byte型數組中,用字符串接收這個數組,這串數據怎麼解碼的字符串在接收時又怎麼拼接起來。

代碼如下:

import java.io.FileInputStream;

/**
 * 文件的輸入輸出流
 * @author Administrator
 *
 */
public class FileOperationTest {
	
	public static void main(String[] args) throws Exception {
		readFile("G:\\文件測試\\1.txt");
	}
	/**
	 * 讀取指定的文件
	 * @param fileName
	 */
	public static void readFile(String fileName) throws Exception{
		//根據fileName構建文件輸入流對象
		FileInputStream fis = new FileInputStream(fileName);
		/*//從此輸入流中讀取數據一個個讀
		int i= fis.read();
		//用read()實現文件的完整輸出
		while(i!=-1){
			System.out.print((char)i);
			i = fis.read();
		}*/
		//獲取此流中的有效字節數
		int length=fis.available();
		//按塊讀
		byte[] buf= new byte[length];//剛好存滿
		fis.read(buf);//此行代碼執行完畢後文件中所有的字節都存到buf數組中
		String fileCountent = new String(buf);//用一個字符串接收這個數組
		System.out .println(fileCountent);
		//關閉流
		fis.close();
	}	
}

寫的操作與讀的操作一一對應



三、實例,實現文件的複製粘貼

我們通過兩種方式實現文件的複製粘貼,比較兩種方式的效率。

第一種:用read()方法和write()方法實現複製粘貼。

第二種:創建緩衝區及byte型數組(用read(byte[])方法和write(byte[],int off,int len))實現複製粘貼。

*文件複製從G:\文件測試1\4.txt,複製到的G:\文件測試2\4.txt。

從實驗可以看出第二種方法的效率高於第一種,代碼如下:

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;

/**
 * 文件的輸入輸出流
 * @author Administrator
 *
 */
public class FileOperationTest {
	
	public static void main(String[] args) throws Exception {
		String srcPath = "G:\\文件測試1\\4.txt";
		String destPath = "G:\\文件測試2\\4.txt";
		//計時器>計算複製粘貼文件所用的時間
		long start_time = System.currentTimeMillis();
		copyPaste(srcPath,destPath);
		long end_time = System.currentTimeMillis();
		System.out.println("拷貝用時:"+(end_time - start_time));
	}
		 /**
		 * 
		 * @param srcPath
		 * @param destPath
		 * @throws Exception 
		 */
		public static void copyPaste(String srcPath,String destPath) throws Exception {
			//構建文件輸入輸出流對象
			FileInputStream fis = new FileInputStream(srcPath);
			FileOutputStream fos = new FileOutputStream(destPath);
			//讀取以及寫入文件內容
			/*//用read()方法和write()方法實現複製粘貼
			int i =fis.read();
			while(i != -1){
				fos.write(i);//寫
				i = fis.read();
			}*/
			//創建緩衝區(用read(byte[])方法和write(byte[],int off,int len))實現複製粘貼
			byte[] buf = new byte[1024];//1024個字節大小的緩衝區
			//read(byte[])方法返回讀取的字節的數量
			int i = fis.read(buf);
			while(i!=-1){
				//按塊寫入,每次寫入1024個字節,最後一次寫入len個字節
				fos.write(buf, 0, i);
				i = fis.read(buf);
			}
			fis.close();
			fos.close();
		}
	
}


 三種讀寫文件的操作總結:

*  1.一個一個字節讀寫,用read(),write()方法對數據拆分成字節而進行讀寫,優點是靈活,邏輯也比較簡單,但並不適合大數據的讀寫。

 *  2.一塊一塊緩衝區讀寫,用read(byte[] b),write(byte[] b)方法實現按塊的讀取,b爲讀取或者寫入的字節數量,優點是適當大小的緩衝區(byte型數組)可以顯著提高讀寫的速度(較一個一個字節讀寫而言),但因爲緩衝區(數組長度)固定,最後一個緩衝區或許字節數會不夠,read(byte[] b)就會寫入很多空數據,造成文件變大。

 *  3.一次性讀寫,用read(byte[] b),write(byte[] b,int off,int len)方法,與第二種方法相似,不同在於,write(byte[] b,int off,int len)會判斷緩衝區裏字節的數量,與第二種方法遇到最後一緩衝區裏的字節數不夠卻寫入空數據充數相比,這種方法會根據緩衝區裏的字節數寫入相應數量的數據。


二、在文件輸入輸出流的基礎上,對字節進行包裝而衍生的其他字節流,常見的如下:

*1.BufferedInputStream    緩衝字節流         BufferedOutputStream

*2.DataInputStream         原始數據流          DataOutputStream

*3.ObjectInputStream         對象流               ObjectOutputStream

*4.ByteArrayInputStream    內存流               ByteArrayOutputStream

應用如下:

代碼如下:

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

/**
 * 根據文件輸入輸出流來了解其他流
 * @author Administrator
 *
 */

public class Test {

	public static void main(String[] args) throws Exception {
		//Student stu = new Student();
		//stu.study();
		
		
		//計時器>計算複製粘貼文件所用的時間
		long start_time = System.currentTimeMillis();
		writeToFileBufferedStream("G:\\文件測試1\\《超神學院》第十集.flv","G:\\文件測試2\\《超神學院》第十集.flv");
		long end_time = System.currentTimeMillis();
		System.out.println("拷貝用時:"+(end_time - start_time));
		
		
		}
	/**
	 * 
	 * @param srcPAth
	 * @param destPath
	 * @throws Exception 
	 */
	public static void writeToFileBufferedStream(String srcPath,String destPath) throws Exception {
		//構建輸出流對象
		FileInputStream fis = new FileInputStream(srcPath);
		FileOutputStream fos = new FileOutputStream(destPath);
		//構建緩衝字節輸入輸出流
		BufferedInputStream bis = new BufferedInputStream(fis);
		BufferedOutputStream bos = new BufferedOutputStream(fos);
		//讀寫操作(複製粘貼的功能)
		int i= bis.read();
		while(i!=-1){
			bos.write(i);
			i = bis.read();
		}
		bos.flush();//清空緩衝區
		bos.close();
		bis.close();
		fos.close();
		fis.close();
		}
}





發佈了25 篇原創文章 · 獲贊 5 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章