IO
File類:
描述程序當(dāng)中操作的文件和目錄
- 屬性:
1.pathSeparator 路徑分隔符 等價(jià)于在字符串書寫的;/:
2.separator 目錄分隔符 等價(jià)于在字符串當(dāng)中的\效果 - 備注:
1.分隔符:如果使用的是\需要使用\\來進(jìn)行目錄區(qū)分如果使用的是/需要使用/來進(jìn)行目錄區(qū)分
2.對于不同操作系統(tǒng)锅必,路徑分隔符一般不一樣伐脖,Windows系統(tǒng)當(dāng)中使用的是(;)作為分割介粘,Linux系統(tǒng)當(dāng)中使用(:)作為分割 - 構(gòu)造方法
1.File(String pathname) 通過將給定的路徑名的字符串轉(zhuǎn)換成一個(gè)抽象路徑名創(chuàng)建一個(gè)新的 File實(shí)例秉犹。
2.File(File parent, String child) 創(chuàng)建從一個(gè)家長的抽象路徑名和一個(gè)孩子的路徑字符串的新 File實(shí)例蛉谜。
3.File(String parent, String child) 創(chuàng)建從父路徑名的字符串和一個(gè)孩子的一個(gè)新的 File實(shí)例文件。 - 路徑:
相對路徑:相對于當(dāng)前所在的項(xiàng)目路徑
絕對路徑:以盤符(根目錄)為開頭的路徑
項(xiàng)目的根路徑:文件直接放到項(xiàng)目目錄下 - File類的常用API方法
- getAbsolutePath() 獲取file對象的絕對路徑
- getName() 獲取file對象的文件名稱或者是目錄名稱
- getParent() 獲取file文件的父路徑 不包含文件本身的一個(gè)路徑
- length() 獲取文件的大小
- getPath() 返回值是變化的
- boolean isFile() 測試此抽象路徑名表示的文件是否為普通文件崇堵。
- exists() 判斷該文件在硬盤當(dāng)中是否存在
- boolean isDirectory() 判斷該file實(shí)例是不是一個(gè)目錄
- boolean createNewFile() 當(dāng)且僅當(dāng)具有該名稱的文件尚不存在時(shí)型诚,原子地創(chuàng)建一個(gè)由該抽象路徑名命名的新的空文件。
- boolean mkdir() 創(chuàng)建由此抽象路徑名命名的目錄鸳劳。
- boolean mkdirs() 創(chuàng)建由此抽象路徑名命名的目錄狰贯,包括任何必需但不存在的父目錄。
- boolean delete() 刪除由此抽象路徑名表示的文件或目錄
- String[] list() 返回一個(gè)字符串?dāng)?shù)組赏廓,命名由此抽象路徑名表示的目錄中的文件和目錄涵紊。
- File[] listFiles() 返回一個(gè)抽象路徑名數(shù)組,表示由該抽象路徑名表示的目錄中的文件幔摸。
- File[] listFiles(FileFiler filer) 返回一個(gè)抽象路徑名數(shù)組摸柄,表示由此抽象路徑名表示的滿足指定過濾器的目錄中的文件和目錄。
// 絕對路徑
String absolutePath = "E:\\class_projects\\JavaSE18\\day19_IO\\src\\com\\zhiyou100\\io\\Demo01_IO.java";
// 相對路徑
String relativePath = "src\\com\\zhiyou100\\io\\Demo01_IO.java";
// aaa.txt文件的相對路徑
String relativePath2 = "aaa.txt";// 相對路徑
// 1.使用 File(String pathname) 創(chuàng)建File實(shí)例
File file = new File(pathname);// 在程序當(dāng)中創(chuàng)建了一個(gè)文件File實(shí)例
// 想要獲取當(dāng)前文件的名稱 getName()
System.out.println(file.getName());//helloWorld.txt
// 在D盤的java目錄中創(chuàng)建一個(gè)文件helloWorld.java
String pathname2 = "D:\\java\\HelloWorld.java";
File file2 = new File(pathname2);
System.out.println(file2.getName());
File parent = new File("D:\\java");
String pathParent = "D:\\java";
String pathChild = "HelloWorld.java";
// 2.使用 File(String parent, String child)
File childFile1 = new File(pathParent, pathChild);
System.out.println("+++++++"+childFile1.getName());
// 3.使用 File(File parent, String child)
File childFile2 = new File(parent, pathChild);
System.out.println("-----"+childFile2.getName());
// 在D盤的根目錄下創(chuàng)建一個(gè)文件helloWorld.txt
String pathname4 = "D:\\helloWorld.txt";
File file4=new File(pathname4);
boolean newFile = file4.createNewFile();
System.out.println(newFile);
// 在D盤的根目錄下創(chuàng)建一個(gè)mysql目錄(文件夾)
String pathname3 = "D:\\mysql";
File file3 = new File(pathname3);
boolean mkdir = file3.mkdir();
System.out.println(mkdir);
//訪問D:/桌面/第一次測試.txt
String pathname1="D:/桌面/第一次測試.txt";
File file1=new File(pathname1);
//獲取對象的絕對路徑
System.out.println(file1.getAbsolutePath());
//獲取對象的文件名
System.out.println(file1.getName());
//獲取對象的父路徑既忆,不包含文件本身
System.out.println(file1.getParent());
//獲取對象文件的相對路徑
System.out.println(file1.getPath());
//獲取文件大小
System.out.println(file1.length());
//判斷在D:/develop/bbb.txt文件是否存在
String pathname1="D:/develop/bbb.txt";
File file = new File(pathname1);
boolean exists = file.exists();
System.out.println(exists);
//判斷該文件是否存在
String pathname2="D:/develop/aaa.txt";
File file1 = new File(pathname2);
System.out.println(file1.length());
System.out.println(file1.exists());
//判斷該文件是否為一個(gè)普通文件
System.out.println(file1.isFile());
//判斷該文件是否為一個(gè)目錄
System.out.println(file1.isDirectory());
//在D:\develop創(chuàng)建一個(gè)叫做aaa.txt文件
String pathname1="D:\\develop\\aaa.txt";
File file1=new File(pathname1);
if (!file1.exists()){
boolean newFile1 = file1.createNewFile();
System.out.println(newFile1);
}else {
System.out.println("已經(jīng)存在");
}
//boolean mkdir() 創(chuàng)建由此抽象路徑名命名的目錄
String pathname3="D:/develop/School";
File file3 = new File(pathname3);
if (!file3.exists()) {
System.out.println(file3.mkdir());
}else {
System.out.println("已經(jīng)存在");
}
//boolean mkdirs() 創(chuàng)建由此抽象路徑名命名的目錄塘幅,包括任何必需但不存在的父目錄
String pathname4="D:/develop/zhiyou/School";
File file4 = new File(pathname4);
if (!file4.exists()) {
System.out.println(file4.mkdirs());
}else {
System.out.println("已經(jīng)存在");
}
//D:/develop/School/新建文本文檔.txt 刪除
File file=new File("D:\\develop\\School\\新建 文本文檔.txt");
if (file.exists()){
System.out.println(file.delete());
System.out.println("---");
}
//遍歷該文件夾內(nèi)所有的子文件夾
File file1 = new File("D:\\develop");
File[] files = file1.listFiles();
for (File s : files) {
System.out.println(s.getName());
}
//遍歷該文件夾內(nèi)所有的子文件夾和文件
public static void getAll(File file){
File[] files = file.listFiles();
for (File f:files){
if (f.isDirectory()){
System.out.println(f.getName()+"----");
getAll(f);
}else {
System.out.println(f.getName()+"++++");
}
}
}
//遍歷該文件夾中指定的文件類型
public static void m9(File f){
File[] files = f.listFiles();
for (File file : files) {
if (file.isFile()){
if (file.getName().endsWith(".java")){
System.out.println(file.getName());
}else {
m9(file);
}
}
}
}
//遞歸
public static int m8(int n){
if (n==1){
return 1;
}
return n*m8(n-1);
}
- 備注:
1.getPath()如果程序獲取該文件是通過絕對路徑獲取的,那么該方法的返回值是一個(gè)絕對路徑
如果程序獲取該文件是通過相對路徑獲取的尿贫,那么該方法的返回值是一個(gè)相對路徑
2.file類當(dāng)中的方法只能識別project工程類型,不能直接識別module工程
3.createNewFile()要求創(chuàng)建文件的路徑在硬盤上是真實(shí)存在的踏揣,否則會拋出異常
4.delete()它可以刪除文件或文件夾,當(dāng)刪除文件夾時(shí),必須保證該文件夾下沒有文件或子文件夾壳澳,否則不能刪除
- listFiles(FileFilter filter) 這個(gè)方法需要添加一個(gè)過濾器荞胡,里面重寫accept(File file)方法該方法只能對單層子文件夾中的文件或者目錄進(jìn)行過濾accept(File file)它的返回值是一個(gè)boolean值,如果返回值為false,代表該文件不允許存入到File數(shù)組當(dāng)中如果該方法的返回值為true娱局,代表該文件需要放入到File數(shù)組當(dāng)中
- 遞歸:方法遞歸
直接遞歸
間接遞歸:方法內(nèi)部不是直接調(diào)自己彰亥,而是通過其他方法那還可以再次調(diào)到該方法,形成一個(gè)閉環(huán)
出口---->邊界條件--->讓當(dāng)前正在執(zhí)行的遞歸方法停止 - 注意事項(xiàng):
1.必須有邊界值
2.使用使用遞歸次數(shù)不能太多衰齐,
3.構(gòu)造方法不能使用遞歸 - 文件過濾器 Filter--->過濾器
在FileFilter類當(dāng)中的accept()方法
是用來添加滿足條件的文件任斋,如果accept方法的返回值是true,代表該文件(File實(shí)例)是允許存入到File數(shù)組當(dāng)中的如果accept方法的返回值為false,就代表該文件是不允許放入到File數(shù)組當(dāng)中的
// 遞歸方法 遍歷滿足.java文件的文件
public static void getSpecifiedFile(File f){
// 匿名內(nèi)部類方式
File[] files = f.listFiles(new FileFilter() {
@Override
public boolean accept(File file) {
return file.getName().endsWith(".java") || file.isDirectory();
}
});
// 遍歷files
for (File file : files) {
if (file.isDirectory()){
getSpecifiedFile(file);
} else {
System.out.println(file.getName()+"-----");
}
}
}
- IO流
FileOutputStream類 --->文件字節(jié)輸出流 用于把程序當(dāng)中的數(shù)據(jù)寫入到磁盤的某個(gè)文件中
因?yàn)樽止?jié)流沒有緩沖區(qū)耻涛,直接調(diào)用操作系統(tǒng)的寫入函數(shù)废酷。在源碼中
1.FileOutputStream類的write方法直接就是native的瘟檩,也就是調(diào)用操作系統(tǒng)提供的底層函數(shù)。
源碼如下:
private native void write(int b, boolean append) throws IOException;
2.FileOutputStream類沒有重寫父類的flush方法澈蟆,而它父類OutputStream的flush方法是空的墨辛,什么也沒有做
源碼如下:
public void flush() throws IOException {
}
FileWriter 字符輸入流中,有緩存區(qū)趴俘,在源碼中
Temporary buffer used to hold writes of strings and single characters
private char[] writeBuffer;