程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> JAVA綜合教程 >> 文件的輸入流,文件輸入流

文件的輸入流,文件輸入流

編輯:JAVA綜合教程

文件的輸入流,文件輸入流


  實現讀取文件有多種方式,針對不同的文件類型,有不同的讀取方法。讀取文件的關鍵技術點如下:

  1.用FileInputStream打開文件輸入流,通過read方法以字節為單位讀取文件,是最通用的讀取文件的方法,能讀取任何文件,特別適合讀取二進制文件,如圖片、聲音、視頻文件。

  2.用InputStreamReader打開文件輸入流,通過read方法以字符為單位讀取文件,常用於讀取文本文件。

  3.用BufferedReader打開文件輸入流,通過readLine方法以行為單位讀取文件,常用於讀取格式化文本。

  4.用RandomAccessFile打開文件輸入流,通過seek方法將讀指針移到文件內容中間,再通過read方法讀取指針後的文件內容,常用於隨機讀取文件。

  通過以上各種文件輸入流讀取文件後,都需要調用close方法關閉文件輸入流。

實例如下:

package book.io;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.RandomAccessFile;
import java.io.Reader;

/**
 *多種方式讀取文件
 *按字節讀取文件內容、按字符讀取文件內容、按行讀取文件內容、隨機讀取文件內容
 */
public class ReadFromFile {
	//以字節為單位讀取文件,常用於讀取二進制文件,如圖片、聲音、視頻等文件
	public static void readFileByBytes(String fileName){
		File file = new File(fileName);
		InputStream in = null;
		try {
			System.out.println("以字節為單位讀取文件內容,一次讀取一個字節:");
			//一次讀取一個字節
			in = new FileInputStream(file);
			int tempbyte;
			//不斷讀取,知道文件結束
			while((tempbyte=in.read()) != -1){
				System.out.write(tempbyte);
			}
			in.close();
		}catch (Exception e) {
			e.printStackTrace();
			return;
		}
		try {
			System.out.println("以字節為單位讀取文件內容,一次讀多個字節:");
			//一次讀多個字節
			byte[] tempbytes = new byte[100];
			int byteread = 0;
			in = new FileInputStream(fileName);
			ReadFromFile.showAvailableBytes(in);
			//將多個字節讀入到字節數組中,byteread為一次讀入的字節數
			while((byteread = in.read(tempbytes)) != -1){
				System.out.write(tempbytes,0,byteread);
			}
		} catch (Exception e) {
			e.printStackTrace();
		}finally{
			if(in != null){
				try {
					in.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
	}
	//以字符為單位讀取文件,常用於讀取文本、數字等類型的文件
	public static void readFileByChars(String fileName){
		File file = new File(fileName);
		Reader reader = null;
		try {
			System.out.println("以字符為單位讀取文件內容,一次讀一個字符:");
			//一次讀一個字符
			reader = new InputStreamReader(new FileInputStream(file));
			int tempchar;
			while((tempchar = reader.read()) != -1){
				if(((char)tempchar)!='\r'){
					System.out.println((char)tempchar);
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		try {
			System.out.println("以字符為單位讀取文件內容,一次讀多個字符:");
			char[] tempchars = new char[30];
			int charread = 0;
			reader = new InputStreamReader(new FileInputStream(fileName));
			//將多個字符讀取到字符數組中,charread為一次讀取的字符數
			while((charread = reader.read(tempchars)) != -1){
				if((charread == tempchars.length)&&(tempchars[tempchars.length-1] !='\r')){
					System.out.println(tempchars);
				}else{
					for(int i=0;i<charread;i++){
						if(tempchars[i] == '\r'){
							continue;
						}else{
							System.out.println(tempchars[i]);
						}
					}
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	//以行為單位讀取文件,常用於讀取面向行的格式化文件
	public static void readFileByLines(String fileName){
		File file = new File(fileName);
		BufferedReader reader = null;
		try {
			System.out.println("以行為單位讀取文件內容,一次讀一整行:");
			reader = new BufferedReader(new FileReader(file));
			String tempString = null;
			int line = 1;
			//一次讀一行,直到讀到null,讀取文件結束
			while((tempString = reader.readLine()) != null){
				System.out.println("line "+ line + ":" + tempString);
				line++;
			}
			reader.close();
		} catch (Exception e) {
			e.printStackTrace();
		}finally{
			if(reader != null){
				try {
					reader.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
	}
	//隨機讀取文件
	public static void readFileByRandomAccess(String fileName){
		RandomAccessFile randomFile = null;
		try {
			System.out.println("隨機讀取一段文件內容:");
			//打開一個隨機訪問文件流,按只讀方式
			randomFile = new RandomAccessFile(fileName,"r");
			long fileLength = randomFile.length();
			int beginIndex = (fileLength > 4) ? 4 : 0;
			//將讀文件的開始位置移到beginIndex位置
			randomFile.seek(beginIndex);
			byte[] bytes = new byte[10];
			int byteread = 0;
			//一次讀10個字節,如果文件內容不足10個字節,則讀剩下的字節
			while((byteread = randomFile.read(bytes)) != -1){
				System.out.write(bytes, 0, byteread);
			}
		} catch (Exception e) {
			e.printStackTrace();
		}finally{
			if(randomFile != null){
				try {
					randomFile.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
		
	}
	//顯示輸入流中還剩的字節數
	private static void showAvailableBytes(InputStream in){
		try {
			System.out.println("當前字節輸入流中的字節數為:"+in.available());
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	public static void main(String[] args) {
		String fileName = "C:/Users/Admin/Desktop/CAI/20160718/newTemp.txt";
		ReadFromFile.readFileByBytes(fileName);
		ReadFromFile.readFileByChars(fileName);
		ReadFromFile.readFileByLines(fileName);
		ReadFromFile.readFileByRandomAccess(fileName);
		
	}
}

 

  分析:readFileByBytes以字節為單位讀取文件內容。使用了文件輸入流類FileInputStream,調用read方法可以一次從文件輸入流中讀取一個字節,也可以將多個字節讀取到字節數組中,當讀取到字節數為-1時,到達文件尾,讀取文件結束。

  readFileByChars以字符為單位讀取文件內容。使用了InputStreamReader類,將FileInputStream字節輸入流包裝成字符流,然後調用InputStreamReader的read方法可以一次從文件輸入流中讀取一個字符,也可以將多個字符讀取到字符數組中,但讀取的字符數為-1時,到達文件尾,讀取文件結束。

  readFileByLines以行為單位讀取文件內容。通過File對象構造FileReader對象,再通過FileReader對象構造BufferedReader對象,它的readLine方法可以一次從文件中讀取一行內容並保存到字符串中,如果返回的字符串為null,則到達文件尾,讀取文件結束。

  上面3種方法都是從頭到尾讀取文件內容。readFileByRandomAccess方法則可以隨機讀取文件內容,使用RandomAccessFile類構造RandomAccessFile對象時,可以指定訪問模式,有“只讀”、“只寫”和“讀寫”模式。通過seek方法移動讀指針的起始位置,再通過read方法讀取指針後面的內容。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved