File 類
文件和目錄路徑名的抽象表示形式。 通過java的File類與我們磁盤上面的文件進行連接。
用戶界面和操作系統使用與系統相關的路徑名字符串 來命名文件和目錄。此類呈現分層路徑名的一個抽象的、與系統無關的視圖。
下面是常用的方法,以及遞歸實現樹狀圖打印文件和文件夾
1、文件名
getName():返回由此抽象路徑名錶示的文件或目錄的名稱。
getPath() : 將此抽象路徑名轉換爲一個路徑名字符串。
getAbsoluteFile(): 返回此抽象路徑名的絕對路徑所對應的文件。
getAbsolutePath() : 返回此抽象路徑名的絕對路徑名字符串。
getParent() : 返回此抽象路徑名父目錄的路徑名字符串;如果此路徑名沒有指定父目錄(如刪除,相對路徑創建的文件等),則返回 null。
renameTo(File dest) : 重新命名此抽象路徑名錶示的文件。
2、判斷信息
exists() : 測試此抽象路徑名錶示的文件或目錄是否存在。
isFile() : 測試此抽象路徑名錶示的文件是否是一個標準文件。
isDirectory() : 測試此抽象路徑名錶示的文件是否是一個目錄。
isAbsolute() : 測試此抽象路徑名是否爲絕對路徑名。
canRead() : 測試應用程序是否可以讀取此抽象路徑名錶示的文件。
3、長度
length() 返回由此抽象路徑名錶示的文件的長度 long類型,字節大小。而且只能讀取文件的不能文件夾的。
4、創建、刪除
createNewFile() : 當且僅當不存在具有此抽象路徑名指定名稱的文件時,不可分地創建一個新的空文件。
createTempFile(String prefix, String suffix) : 在默認臨時文件目錄中創建一個空文件,使用給定前綴和後綴生成其名稱【前綴三個字節長,後綴默認.temp】。
createTempFile(String prefix, String suffix, File directory) : 在指定目錄中創建一個新的空文件,使用給定的前綴和後綴字符串生成其名稱。常用deleteOnExit()一同使用,否則臨時文件是不會自動刪除的。
delete() : 刪除此抽象路徑名錶示的文件或目錄。
deleteOnExit() : 在虛擬機終止時,請求刪除此抽象路徑名錶示的文件或目錄,常用刪除臨時文件。
5、目錄操作
mkdir() :創建此抽象路徑名指定的目錄。
mkdirs(): 創建此抽象路徑名指定的目錄,包括所有必需但不存在的父目錄。
list() : 返回一個字符串數組,這些字符串指定此抽象路徑名錶示的目錄中的文件和目錄。String數組
listFiles() : 返回一個抽象路徑名數組,這些路徑名錶示此抽象路徑名錶示的目錄中的文件。File數組
listRoots(): 列出可用的文件系統根路徑。
package com.wf.File;
import java.io.File;
import java.io.IOException;
public class FileDemo {
public static void main(String[] args) throws IOException {
// 表示文件或者目錄
//File f0 = new File("d:\\File"); 不推薦使用
// File f0 = new File("D:"+File.separator+"File"); 跨平臺使用
File f0 = new File("d:/File"); // 最常用使用
File f1 = new File("D:/File/demo01.txt");
File f2 = new File("D:/File/File/File");
File f3 = new File("D:/File/File", "demo02.txt"); // 相對路徑構建
File f4 = new File("demo03.text"); // 沒有盤符,是以當前項目相對路徑進行構建
File f5 = File.createTempFile("12", ".temp",f0); // 創建臨時文件 靜態類
f0.mkdir(); // 創建文件夾
f1.createNewFile(); // 創建文件
f2.mkdirs(); // 創建多層文件夾,利用mkdirs
f3.createNewFile();
f4.createNewFile();
System.out.println(File.separator+"是此係統的標準的文件分隔符");
System.out.println(File.pathSeparator+"是此係統的標準的路徑分隔符"); // 一般在構建File時進行
System.out.println(f0.exists() + "存在"); // 判斷是否存在
System.out.println(f0.isFile() + "不是文件"); // 判斷是否爲一個文件
System.out.println(f1.isDirectory() + "不是文件夾"); // 判斷是否爲文件夾
System.out.println(f2.isHidden() + "不是隱藏"); // 判斷文件是否隱藏
System.out.println(f3.getAbsolutePath() + "是絕對路徑"); // 得到絕對路徑
System.out.println(f3.getPath() + "是相對路徑"); // 得到絕對路徑
System.out.println(f3.getName() + "是他的名字"); //
System.out.println(f3.getParent() + "是他的父節點的路徑");
System.out.println(f3.getParentFile().getName() + "是他的父文件名字");
System.out.println(f4.getAbsolutePath() + "工作空間的絕對路徑"); // 得到絕對路徑
System.out.println(f4.getPath() + "是相對路徑"); // 得到絕對路徑
System.out.println("過濾指定文件");
File[] listFiles = f2.listFiles(new FilenameFilter() { // 過濾指定文件
@Override
public boolean accept(File dir, String name) {
return new File(dir,name).isFile() && name.endsWith(".java") ;
}
});
for(File file:listFiles){
System.out.println(file.getName());
}
System.out.println("得到此目錄中的的文件");
File[] files = f0.listFiles();
for (File f : files) {
System.out.print(f.getName() + "\t");
}
System.out.println("樹狀體打印利用遞歸");
printTree(f0, 0);
}
public static void printTree(File file, int level) {
for (int i = 0; i < level; i++) {
System.out.print("--");
}
System.out.println(file.getName());
if (file.isDirectory()) {
File[] files = file.listFiles();
for (File f : files) {
printTree(f, level + 1);
}
}
}
}
IO 流
流:有流向流動的意思,即從源頭經過程序流向目的地。記住是以程序爲中心展開的。
分類:
根據流向分爲:輸入流和輸出流。
根據數據分爲:字節流和字符流。【字節流可以處理一切文本,字符流只可以處理純文本】
字節流
輸入流:
InputStream類 此抽象類是表示字節輸入流的所有類的超類。
read() : 從輸入流中讀取數據的下一個字節。很少用
read(byte[] b) :從輸入流中讀取一定數量的字節,並將其存儲在緩衝區數組 b 中。
read(byte[] b, int off, int len) : 將輸入流中最多 len 個數據字節讀入 byte 數組。
close() : 關閉此輸入流並釋放與該流關聯的所有系統資源。
實現類FileInputStream:從文件系統中的某個文件中獲得輸入字節
輸出流:
OutputStream類:此抽象類是表示輸出字節流的所有類的超類。輸出流接受輸出字節並將這些字節發送到某個接收器。
write(byte[] b) : 將 b.length 個字節從指定的 byte 數組寫入此輸出流。
write(byte[] b, int off, int len) : 將指定 byte 數組中從偏移量 off 開始的 len 個字節寫入此輸出流。
flush() : 刷新此輸出流並強制寫出所有緩衝的輸出字節。
close():關閉此輸出流並釋放與此流有關的所有系統資源。
實現類FileOutputStream:用於寫入諸如圖像數據之類的原始字節的流
字符流
輸入流:
Reader類 用於讀取字符流的抽象類。子類必須實現的方法只有 read(char[], int, int) 和 close()。但是,多數子類將重寫此處定義的一些方法,以提供更高的效率和/或其他功能。
read(char[] cbuf) : 將字符讀入數組。
read(char[] cbuf, int off, int len) : 將字符讀入數組的某一部分。
close() : 關閉該流並釋放與之關聯的所有資源。
實現類:InputStreamReader是字節流通向字符流的橋樑:它使用指定的 charset 讀取字節並將其解碼爲字符。 FileReader類用來讀取字符文件的便捷類。此類的構造方法假定默認字符編碼和默認字節緩衝區大小都是適當的,常用。
輸出流:
Writer類 寫入字符流的抽象類。子類必須實現的方法僅有 write(char[], int, int)、flush() 和 close()。但是,多數子類將重寫此處定義的一些方法,以提供更高的效率和/或其他功能。
write(char[] cbuf) : 寫入字符數組。
write(char[] cbuf, int off, int len) : 寫入字符數組的某一部分。
write(String str, int off, int len) : 寫入字符串的某一部分。
flush(): 刷新該流的緩衝。
close(): 關閉此流,但要先刷新它。
實現類: OutputStreamWriter 是字符流通向字節流的橋樑:可使用指定的 charset 將要寫入流中的字符編碼成字節。 FileWriter類用來寫入字符文件的便捷類。此類的構造方法假定默認字符編碼和默認字節緩衝區大小都是可接受的,常用。
IO流使用步驟
1、讀取文件建立連接
2、選擇對應的流
3、進行相關操作 選取數組大小以及對應方法
4、釋放資源
讀取文件:
1、建立聯繫——》 File對象
2、選擇流——》文件輸入流 InputStream FileInputStream
3、 讀取大小及方法——》 byte[] car = new byte[1024] + read方法
4、釋放資源——》關閉
寫出文件:
1、建立聯繫——》 File對象
2、選擇流——》文件輸出流 OutputStream FileOutputStream
3、 操作——》write方法 flush方法
4、釋放資源——》關閉
拷貝文件:
1、建立聯繫——》 File對象 源頭文件 目的地文件
2、選擇流——》文件輸入流 OutputStream FileOutputStream 文件輸出流 OutputStream FileOutputStream
3、 操作——》byte[] car = new byte[1024] + read方法 + write方法+flush方法
4、釋放資源——》關閉
代碼如下三個方法:
public static void inputStream() {
File f = new File("D:/File/input.txt"); // 加載文件
FileInputStream input = null;
try {
input = new FileInputStream(f); // 建立連接
byte[] car = new byte[1024]; // 定義每次讀多少個
int length = 1; // 實際讀取大小 可以不讀定義那麼多
while (-1 != (length = input.read(car))) { // 賦值實際讀取大小 進行循環讀取
String info = new String(car, 0, length);
System.out.println(info);
}
} catch (FileNotFoundException e) {
System.out.println("file not found");
e.printStackTrace();
} catch (IOException e) {
System.out.println("read fail");
e.printStackTrace();
} finally {
if (null != input) {
try {
input.close();
} catch (IOException e) {
System.out.println("關閉失敗");
e.printStackTrace();
}
}
}
}
public static void outputStream(){
File f = new File("D:/File/input.txt"); // 加載文件
FileOutputStream output = null;
try {
// output = new FileOutputStream(f); // 文件進行覆蓋
output = new FileOutputStream(f,true); //追加形式
String str = "hello world";
byte[] data =str.getBytes();
output.write(data);
output.flush(); // 強制帥新
} catch (FileNotFoundException e) {
System.out.println("file not found");
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
System.out.println("write error");
e.printStackTrace();
}finally{
if(null!=output){
try {
output.close();
} catch (IOException e) {
System.out.println("close error");
e.printStackTrace();
}
}
}
}
public static void copyFile(){
File src = new File("D:/File/File/psb.jpg"); // 源文件 必須存在
File dest = new File("D:/File/File/psdcopy.jpg"); //目的地 可以不存在
FileOutputStream output =null; // 輸入流
FileInputStream input =null; // 輸出流
try {
input = new FileInputStream(src);
output = new FileOutputStream(dest);
byte [] car = new byte[1024]; // 定義大小
int length = 0; // 實際讀取大小
while(-1!=(length = input.read(car))){ // 循環文件讀取
output.write(car,0,length); // 文件寫出
}
output.flush(); // 刷新
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
System.out.println("read error");
e.printStackTrace();
}finally{
if(null!=output){
try {
output.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(null!=input){
try {
input.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}