I / O之文件輸入輸出流

        程序在運行期間,大部分都在內存中進行操作,當程序結束或關閉時,這些數據將要消失 。如果需要永久保存這些數據,可以使用文件輸入輸出流 與指定的文件建立連接,數據將永久保存到文件中。這種操作也成爲數據持久化。

一、FileInputStream類與FileOutputStream類

1. FileInputStream 類常用的構造方法

(1)  FileInputStream(String name):使用給定的文件名 name 創建一個 FileInputStream 對象。

(2)  FileInputStream(File  file):使用 File 對象創建 FileInputStream對象,該方法允許再把文件連接輸入流之前對文件做進一步分析。

2. FileOutputStream 類常用的構造方法

(1)   FileOutputStream(File  file):創建一個向指定File對象表示的文件中寫入數據的文件輸出流,數據會覆蓋文件原來內容。

(2)   FileOutputStream(File  file,boolean append):如果第二個參數爲 true,將字節寫入文件末尾,不覆蓋文件原來內容。

(3)   FileOutputStream(String name):創建一個向具有指定文件名稱的文件中寫入數據的 輸出文件流。

(4)   FileOutputStream(String name,boolean append):創建一個向具有指定文件名稱的 文件中寫入數據的輸出文件流。如果第二個參數爲 true,將字節寫入文件末尾,不覆蓋文件原來內容。

3.代碼演示如下:
 

package com.aiit.book.file;

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

public class FileStreamTest {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		File file = new File("E:\\word.txt");//創建文件對象
		try {
			//創建FileOutputStream對象,用來向文件夾中寫入數據
			FileOutputStream out = new FileOutputStream(file,true);
			String content = "我家大門常打開,開懷送抱等你來";
			//創建字節數組,把將要寫入的內容轉換爲字節數組
			byte[] buy = content.getBytes();
			try {
				out.write(buy);//將數組中的信息寫到文件中
				out.close();//將流關閉
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		try {
			FileInputStream in = new FileInputStream(file);
			//創建數組,來存儲讀取到的內容
			byte[] byt = new byte[1024];
			try {
				/*
				 * 如果讀到最後沒有數據。則返回-1
				 * int read() 讀取一個字節,並返回讀取的字節
				 * int read(byte[] b) 讀取多個字節,並存儲到數組b中,從數組b的索引爲0的地方開始存儲,返回讀取了幾個字節
				 * int read(byte[] b,int off,int len)讀取len個字節,從數組b的索引爲off的地方開始存儲
				 */
				//從文件中讀出信息並存在字節數組中
				int len = in.read(byt);
				//將文件中的信息輸出
				System.out.println("文中的信息是:"+new String(byt, 0 ,len));
				in.close();//關閉流
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

}

控制檯輸出結果及word.txt內容:

4.總結

FileInputStream FileOutputStream可以操作磁盤上文件的輸入流字節流,在構造的時候給出文件的完整路徑名。

缺點:在讀取文本的時候非常不方便,需要按照字節進行操作,這也是字符流出現的原因。

優點:字節流不僅可以操作文本,還可以操作讀取其他媒體:如mp3,圖片,還有視頻,這些都可以使用字節流進行操作。

     FileInputStream字節流常用的API

fis.skip(len);//跳過一定字節
fis.read();//按照字節逐個讀取
fis.read(byte[]);//從輸入流中讀取一定數量的字節,並將其存儲在緩衝區數組 b 中
fis.read(byte[],off,len);//將輸入流中最多len個數據字節讀入byte數組的偏移位置off處
fis.close();//關閉輸入流

    FileOutputStream字節流常用的API

write(byte[] b);//將 b.length 個字節寫入此輸出流
write(byte[] b, int off, int len);//將指定byte數組中從偏移量off開始的len個字節寫入此輸出流
write(int b);//將指定byte寫入此輸出流
void flush();//刷新此輸出流,並強制將所有已緩衝的輸出字節寫入該流中
close()關閉流

二、FileReader類與FileWriter類

        使用 FileOutputStream 類 向文件中寫入數據與使用  FileInputStream 類從文件中將內容讀出來,都存在一點不足,這兩個類都只存在了對字節和字節數組的讀取方法。但是漢字在文件中佔用兩個字節,因此採用字節流可能會出現亂碼現象,因此採用 Reader或 Writer 類 。FileReader流讀取文件,只要流不關閉,每次調用read()方法按順序讀取文件中的內容。FileWriter用於寫入字符流 。

代碼演示如下:

package com.aiit.book.file;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Scanner;

public class ReaderAndWriter {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		while(true) {//設置無限循環,實現控制檯多次輸入
			File file = new File("E:\\word.txt");
			if(!file.exists()) {//如果文件不存在
				try {
					file.createNewFile();//創建文件
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
			System.out.println("請輸入要執行的操作步驟:(1.寫入文件;2.讀取文件)");
			Scanner sc = new Scanner(System.in);
			int choice = sc.nextInt();
			switch(choice) {
			case 1:
				System.out.println("請輸入要寫入的內容");
				String tempStr = sc.next();
				try {
					//FileWriter(file)寫入文件中會替代文件中所有的信息
					//FileWriter(file,true);創建可擴展的文件輸出流,向文件中寫入新數據時不覆蓋已經存在的信息
					FileWriter fw = new FileWriter(file,true);
					fw.write(tempStr+"\r\n");//寫入內容 並換行
					fw.close();
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				System.out.println("上述內容已經寫入文本中");
				break;
			case 2:
				FileReader fr = null;
				if(file.length()==0) {//如果文件沒有內容
					System.out.println("文本中的字符數爲0!");			
				}else {
					try {
						fr = new FileReader(file);
						char [] cbuf = new char[1024];//創建一個數組,用來存儲讀取的字符數的緩衝區
						int hasread = -1;
						try {
							while((hasread = fr.read(cbuf))!=-1) {
								System.out.println("文件內容:"+new String(cbuf,0,hasread));

							}
						} catch (IOException e) {
							// TODO Auto-generated catch block
							e.printStackTrace();
						}
						try {
							fr.close();
						} catch (IOException e) {
							// TODO Auto-generated catch block
							e.printStackTrace();
						}
					} catch (FileNotFoundException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}


				}
				break;
				default:
					System.out.println("請輸入符合要求的數字");
			}

		}
	}

}

運行結果及word.txt文件內容:

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