JAVA中的File類與IO流
1.File類
java檔案類以抽象的方式代表檔名和目錄路徑名.該類主要用於檔案和目錄的建立,檔案的查詢和檔案的刪除等.File物件代表磁碟中實際存在的檔案和目錄.
1.File的構造方法主要有:
File(File parent,String child)
複製程式碼
通過給定的父抽象路徑名和子路徑字串建立一個新的File例項
File(String pathname)
複製程式碼
通過將給定路徑字串轉換成抽象路徑來建立一個新的File例項
File(String parent,String child)
複製程式碼
通過parent路徑名字串和child路徑名字串來建立一個新的File例項 2.File類中一些方法:
public String getName() 返回此抽象路徑名錶示的檔案或目錄的名稱
public String getParent() 返回此抽象路徑名的父路徑名的路徑名字串,如果此路徑名沒有指定父目錄,則返回null
public File getParentFile() 返回此抽象路徑名的父路徑名的抽象路徑名,則返回null
public String getPath()將此抽象路徑名轉換為路徑名字字串
public boolean isAbsolute() 測試此抽象路徑名是否為絕對路徑名
public String getAbsolutePath() 返回抽象路徑名的絕對路徑名字串
複製程式碼
更多方法可見API檔案 注意:File提供的功能都是操作檔案外部的能力,沒有辦法操作檔案內部的內容,想要對檔案內容進行操作,還需要流,即Stream.
2.IO流-----Stream
一個流可以理解為一個資料的序列.輸入流表示從一個源讀取資料,輸出流表示向一個目標寫資料,Java 為 I/O 提供了強大的而靈活的支援,使其更廣泛地應用到檔案傳輸和網路程式設計中.
1.流的分類
按照流向:
輸入流 輸出流
按照操作單元:
位元組流:萬能流:任何內容都可以轉為位元組,可以傳輸文字,圖片,音訊... 字元流:只能操作 純文字資料
按照功能:
節點流: 包裹源頭,實現基本功能 功能流: 對節點流增強效能,提高效率
2.位元組流
先看位元組流,位元組流分為位元組輸入流和位元組輸出流.
- 位元組輸入流:InputStream------>抽象類 此抽象類是表示位元組輸入流的所有類的超類
- 位元組輸出流:OutputStream------>抽象類 此抽象類是表示位元組輸出流的所有類的超類
- 檔案位元組輸入流:FileInputStream----->從檔案系統中的某個檔案中獲得輸入位元組
- 檔案位元組輸出流:FileOutputStream----->輸出程式中的位元組 流使用完畢,應該關閉.關閉可使用close()方法 寫入時,最後應該呼叫flush()方法刷出流管道中剩餘的資料.
下面以一次複製操作為例.對於一個複製操作應該有這樣幾步:
準備流,即宣告且例項化檔案字元流物件
讀入寫出資料,利用read(),write()方法實現讀寫
刷出,最後把管道中的資料刷出
關閉流,注意應該後開啟的先關閉
示例1:
public class Test{
public static void main(String []args){
String src="E:/skr.txt";//原始檔
String dest="E:/skr1.txt";//複製後得到的檔案
byteCopy(src,dest);
}
//方法過載
public static void byteCopy(String src,String dest){
byteCopy(new File(src),new File(dest));
}
//方法過載
public static void byteCopy(File input,File output) {
InputStream in = null;//輸入位元組流宣告
OutputStream os = null;//輸出位元組流宣告
try {
in = new FileInputStream(input);//多型
os = new FileOutputStream(output);//多型
//定義一個1k的位元組陣列,一次讀取1k的資料
byte[] b = new byte[1024];
//當檔案中沒有資料時,返回-1
int len=-1;
while(-1!=(len=in.read(b))){//讀取
os.write(b,0,len);//寫入
}
os.flush();//刷出
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
//後開啟的流先關閉
try {
if (os != null) {
os.close();
}
if (in != null) {
in.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
複製程式碼
3.字元流
字元流同樣分為字元輸入流和字元輸出流
字元輸入流:Reader--->讀取字元流的抽象類
FileReader 用來讀取字元檔案的便捷類
字元輸出流:Writer--->寫入字元流的抽象類
FileReader 用來讀取字元檔案的便捷類
字元流只能操作純文字的檔案.
4.緩衝流
緩衝流是一個功能流,它可以增強功能,提高效能,加快讀寫效率.
1. 位元組緩衝流:
-
BufferedInputStream 位元組輸入流緩衝流
-
BufferedOutputStream 位元組輸出流緩衝流
沒有新增方法,可以發生多型使用
2. 字元緩衝流
BufferedReader 字元輸入流緩衝流 新增方法:String readLine()讀取一個文字行
BufferedWriter 字元輸出流緩衝流 新增方法:void newLine() 寫入一個行分隔符
複製程式碼
複製程式碼
3. 緩衝流的例項化與普通節點流的例項化有所不同:
以位元組輸入緩衝流為例看一下構造方法: BufferedInputStream(InputStream in) 複製程式碼 可以看到構造方法中傳入的是一個位元組輸入流的物件 即BufferedInputStream的構造方法中傳入的不再是檔案的抽象路徑名字串或抽象路徑名.
3.總結
我們可以利用File類中提供的方法對檔案的外部進行操作,但是當我們想操作檔案的內容時就需要使用Stream. 在java中有大量而靈活地操作可以進行處理檔案. 我們可以選擇位元組流或者字元流處理檔案.當檔案較大時,也可以使用緩衝流提高效能,增加讀寫效率.