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