怎么用 c文件做網(wǎng)站頁(yè)面關(guān)鍵詞優(yōu)化
Java大數(shù)據(jù)開發(fā)和安全開發(fā)
- (一)Java的文件操作
- 1.1 Java的File和IO流概念
- 1.2 File類的使用
- 1.2.1 創(chuàng)建File類的對(duì)象
- 1.2.2 常用方法1:判斷文件類型、獲取文件信息
- 1.2.3 常用方法2:創(chuàng)建文件、刪除文件
- 1.2.4 常用方法3:遍歷文件夾
- 1.3 java File的方法遞歸
- 1.3.1 什么是方法遞歸
- 1.3.1 方法遞歸的案列
- 1.3.1.1 案例導(dǎo)學(xué)-計(jì)算n的階乘
- 1.3.1.2 遞歸算法三要素
- 1.3.1.3 猴子吃桃問題
- 1.3.1.4 遞歸查詢目錄下的指定文件
- 1.3.1.5 遞歸刪除目錄下的非空文件
- 1.3.1.6 啤酒問題
- 1.4 簡(jiǎn)單文件操作的案例
(一)Java的文件操作
1.1 Java的File和IO流概念
目前我們所講的存儲(chǔ)數(shù)據(jù)的方案都是沒有保存的數(shù)據(jù)
想要長(zhǎng)久保存數(shù)據(jù)
java提供了File類來操作文件
- File是java.io.包下的類, File類的對(duì)象,用于代表當(dāng)前操作系統(tǒng)的文件(可以是文件、或文件夾)
- 提供了多種操作文件的方法 創(chuàng)建 刪除 修改等等…
注意:File類只能對(duì)文件本身進(jìn)行操作,不能讀寫文件里面存儲(chǔ)的數(shù)據(jù)
IO流
由于File類只能對(duì)文件本身進(jìn)行操作,不能讀寫文件里面存儲(chǔ)的數(shù)據(jù),所以java提供了IO流用于讀寫數(shù)據(jù)的(可以讀寫文件,或網(wǎng)絡(luò)中的數(shù)據(jù)…)
1.2 File類的使用
1.2.1 創(chuàng)建File類的對(duì)象
三種不同的系統(tǒng)路徑分隔符寫法
- 1.正斜杠/寫法(推薦)
- 2.反斜杠寫法 需要添加轉(zhuǎn)義字符\,防止類似\n被轉(zhuǎn)換成換行符
- 3.函數(shù)File.separator 獲取系統(tǒng)指定的分隔符
File f1 = new File("D:/resource/ab.txt");File f2 = new File("D:\\resourcellab.txt");File f3 = new File( "D:"+ File.separator +"resource" + File.separator + "ab.txt");
絕對(duì)路徑:是一個(gè)完整的、明確指定文件或目錄位置的路徑,從根目錄開始,包含了所有所需的目錄層次結(jié)構(gòu)
示例:/C:/path/to/file.txt 中,/C:/表示根目錄,path/to/是后續(xù)的目錄層次,最后指定了具體的文件file.txt。
相對(duì)路徑:相對(duì)于當(dāng)前工作目錄或其他特定基準(zhǔn)目錄的路徑,不包含從根目錄開始的完整路徑信息
示例:在/project目錄下,subdirectory/file.txt就是相對(duì)路徑
// 絕對(duì)路徑:帶盤符的File f6 = new File("D:\\codelljavasepromax|lfile-io-appl\\src itheima.txt");// 相對(duì)路徑(重點(diǎn)):不帶盤符,默認(rèn)是直接去工程下尋找文件的。File f7 = new File( "file-io-applsrcllitheima.txt");System.out.println(f4.length());
最后創(chuàng)建File類的示例代碼如下:
import java.io.File;public class FileTest {public static void main(String[] args) {// 1、創(chuàng)建一個(gè)File對(duì)象,指代某個(gè)具體的文件。// 路徑分隔符File f1 = new File("D:/resource/ab.txt");File f2 = new File("D:\\resourcellab.txt");File f3 = new File( "D:"+ File.separator +"resource" + File.separator + "ab.txt");System.out.println(f1.length());//文件大小//File對(duì)象可以指代一個(gè)目錄File f4 = new File("D:/resource"); //只是目錄文件夾本身,不包含目錄里的其他文件System.out.println(f2.length());// 注意:File對(duì)象可以指代一個(gè)不存在的文件路徑File f5 =new File("D:/resource/aaaa.txt");System.out.println(f3.length());System.out.println(f3.exists());//false// 我現(xiàn)在要定位的文件是在模塊中,應(yīng)該怎么定位呢?// 絕對(duì)路徑:帶盤符的File f6 = new File("D:\\codelljavasepromax|lfile-io-appl\\src itheima.txt");// 相對(duì)路徑(重點(diǎn)):不帶盤符,默認(rèn)是直接去工程下尋找文件的。File f7 = new File( "file-io-applsrcllitheima.txt");System.out.println(f4.length());}
}
1.2.2 常用方法1:判斷文件類型、獲取文件信息
- File提供的判斷文件類型、獲取文件信息功能
import java.io.File;
import java.text.SimpleDateFormat;public class FileTest {public static void main(String[] args) {// 1.創(chuàng)建文件對(duì)象,指代某個(gè)文件File f1 = new File( "D:/resource/ab.txt");// 2、public boolean exists():判斷當(dāng)前文件對(duì)象,對(duì)應(yīng)的文件路徑是否存在,存在返回true.System.out.println(f1.exists());// 3、public boolean isFile(): 判斷當(dāng)前文件對(duì)象指代的是否是文件,是文件返回true,反之。System.out.println(f1.isFile());// 4、public boolean isDirectory() : 判斷當(dāng)前文件對(duì)象指代的是否是文件夾,是文件夾返回true,反之。System.out.println(f1.isDirectory());// 5.public string getName():獲取文件的名稱(包含后綴)System.out.println(f1.getName());// 6.public long length():獲取文件的大小,返回字節(jié)個(gè)數(shù)System.out.println(f1.length());// 7.public long lastModified():獲取文件的最后修改時(shí)間。System.out.println(f1.lastModified());long time = f1.lastModified();SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");System.out.println(sdf.format(time));// 8.public String getPath():獲取創(chuàng)建文件對(duì)象時(shí),使用的路徑File f2 = new File( "D:\\resource\\ab.txt");File f3 = new File( "file-io-app\\src\\itheima.txt");System.out.println(f2.getPath());System.out.println(f3.getPath());// 9.public String getAbsolutePath():獲取絕對(duì)路徑System.out.println(f1.getAbsolutePath());System.out.println(f2.getAbsolutePath());System.out.println(f3.getAbsolutePath());}
}
1.2.3 常用方法2:創(chuàng)建文件、刪除文件
- File類創(chuàng)建文件的功能
- File類刪除文件的功能
**注意:delete方法默認(rèn)只能刪除文件和空文件夾,刪除后的文件不會(huì)進(jìn)入回收站**
- 創(chuàng)建和刪除文件方法代碼示例
import java.io.File;
import java.io.IOException;public class FileTest {public static void main(String[] args) throws Exception { //alt+回車鍵拋出異常// 1、public boolean createNewFile():創(chuàng)建一個(gè)新文件(文件內(nèi)容為空),創(chuàng)建成功返回true,反之。File f1 = new File( "D:/resource/itheima2.txt");System.out.println(f1.createNewFile()); //目錄存在就會(huì)創(chuàng)建失敗,不存在則創(chuàng)建成功 // 2、public boolean mkdir():用于創(chuàng)建文件夾,注意:只能創(chuàng)建一級(jí)文件夾File f2 = new File( "D:/resource/aaa");System.out.println(f2.mkdir());// 3、public boolean mkdirs():用于創(chuàng)建文件夾,注意:可以創(chuàng)建多級(jí)文件夾File f3 = new File( "D:/resource/bbb/ccc/ddd/eee/fff/ggg");System.out.println(f3.mkdirs());// 4、public boolean delete():刪除文件,或者空文件,注意:不能刪除非空文件夾。System.out.println(f1.delete());System.out.println(f2.delete());File f4= new File( "D:/resource");System.out.println(f4.delete()); //false 不能刪除非空文件夾}
}
1.2.4 常用方法3:遍歷文件夾
- File類提供的遍歷文件夾的功能
- 遍歷文件夾方法代碼示例
import java.io.File;public class FileTest {public static void main(String[] args) {// 1、public string[] list():獲取當(dāng)前目錄下所有的"一級(jí)文件名稱"到一個(gè)字符串?dāng)?shù)組中去返回。File f1 = new File( "D:/python27");String[] names = f1.list();for(String name :names) {System.out.println(name);}// 2、public File[] listFiles():(重點(diǎn))獲取當(dāng)前目錄下所有的"一級(jí)文件對(duì)象"到一個(gè)文件對(duì)象數(shù)組中去返回(重點(diǎn))File[] files = f1.listFiles();for (File file :files) {System.out.println(file.getAbsolutePath());}}
}
使用listFiles方法時(shí)的注意事項(xiàng)
- 當(dāng)主調(diào)是文件,或者路徑不存在時(shí),返回null
- 當(dāng)主調(diào)是空文件夾時(shí),這回一個(gè)長(zhǎng)度為0的數(shù)組
當(dāng)主調(diào)是一個(gè)有內(nèi)容的文件夾時(shí),將里面所有一級(jí)文件和文件夾的路徑放在File數(shù)組中返回
- 當(dāng)主調(diào)是一個(gè)文件夾,且里面有隱藏文件時(shí),將里面所有文件和文件夾的路徑放在File數(shù)組中返回,包含隱藏文件
- 當(dāng)主調(diào)是一個(gè)文件夾,但是沒有權(quán)限訪問該文件夾時(shí),返回null
import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Arrays;public class FileTest {public static void main(String[] args) {// 當(dāng)主調(diào)是文件返回nullFile f= new File( "D:/resource/ab.txt");File[] files = f.listFiles();System.out.println(files);//當(dāng)主調(diào)是路徑不存在時(shí),返回nullFile f1 = new File( "D:/resource1");File[] files1 = f.listFiles();System.out.println(files1);// 當(dāng)主調(diào)是空文件夾時(shí),返回一個(gè)長(zhǎng)度為0的數(shù)組File f2 = new File( "D:/resource/aaa");File[] files2 = f.listFiles();System.out.println(Arrays.toString(files2)); }
}
null
null
[]
1.3 java File的方法遞歸
1.3.1 什么是方法遞歸
- 算法遞歸是一種在程序設(shè)計(jì)語(yǔ)言中廣泛應(yīng)用
- 從形式上說:方法調(diào)用自身的形式稱為方法遞歸(recursion)
遞歸的形式
- 直接遞歸:方法自己調(diào)用自己。
- 間接遞歸:方法調(diào)用其他方法,其他方法又回調(diào)方法自己
使用方法遞歸時(shí)需要注意的問題:
- 遞歸如果沒有控制好終止,會(huì)出現(xiàn)遞歸死循環(huán),導(dǎo)致棧內(nèi)存溢出錯(cuò)誤
public class FileTest {public static void main(String[] args) {// 目標(biāo):改變某個(gè)文件夾下視頻的序號(hào),要求從19開始。test1(); //出現(xiàn)棧溢出的StackOverflowError錯(cuò)誤}// 直接方法遞歸public static void test1(){System.out.println("----test1---");test1();// 直接方法遞歸 }// 間接方法遞歸public static void test2(){System.out.println("---test2---");test3();}public static void test3(){test2();// 間接遞歸}
}
1.3.1 方法遞歸的案列
1.3.1.1 案例導(dǎo)學(xué)-計(jì)算n的階乘
需求
- 計(jì)算n的階乘,5的階乘=1*2*3*4*5;6的階乘=1*2*3*4*5*6
分析
- 假如我們認(rèn)為存在一個(gè)公式是f(n)=1*2*3*4*5*6*7*…(n-1)*n;
- 那么公式等價(jià)形式就是:f(n)=f(n-1)*n
- 如果求的是 1-5的階乘 的結(jié)果,我們手工應(yīng)該應(yīng)該如何應(yīng)用上述公式計(jì)算。
f(5)= f(4) *5
f(4)= f(3) *4
f(3)= f(2) *3
f(2)= f(1) *2
f(1)= 1
public class FileTest {public static void main(String[] args) {// 目標(biāo):改變某個(gè)文件夾下視頻的序號(hào),要求從19開始。System.out.println(f(5));}public static int f(int n) {// 終結(jié)點(diǎn)if (n == 1) {return 1;} else {return f(n - 1) * n;}}
}
120
遞歸求階乘的執(zhí)行流程
1.3.1.2 遞歸算法三要素
- 遞歸的公式:f(n)= f(n-1)*n;
- 遞歸的終結(jié)點(diǎn):f(1)
- 遞歸的方向必須走向終結(jié)點(diǎn):
f(5)= f(4)*5
f(4)= f(3)4
f(3)= f(2) 3
f(2)= f(1)*2
f(1)= 1
1.3.1.3 猴子吃桃問題
- 猴子第一天摘下若干桃子,當(dāng)即吃了一半,覺得好不過癮,于是又多吃了一個(gè)
- 第二天又吃了前天剩余桃子數(shù)量的一半,覺得好不過癮,于是又多吃了一個(gè)
- 以后每天都是吃前天剩余桃子數(shù)量的一半,覺得好不過癮,又多吃了一個(gè)
- 等到第10天的時(shí)候發(fā)現(xiàn)桃子只有1個(gè)了
需求:
- 請(qǐng)問猴子第一天摘了多少個(gè)桃子?
public class FileTest {public static void main(String[] args) {// 目標(biāo):猴子吃桃問題// f(10) = 1 終結(jié)點(diǎn)// 公式: f(x) - f(x)/2-1 = f(x + 1)// 變形:2f(x) - f(x) - 2 = 2f(x+1)// 變形2:f(x)= 2 * f(x +1) + 2// 求f(1)=?System.out.println(f(1));System.out.println(f(2));System.out.println(f(3));}public static int f(int x) {if (x == 10) {return 1;} else {return 2 * f(x + 1) + 2;}}
}
1534
766
382
1.3.1.4 遞歸查詢目錄下的指定文件
import java.io.File;public class FileTest {public static void main(String[] args) throws Exception {System.out.println("開始搜索文件...");searchFile(new File("D:/"),"python2.exe");System.out.println("搜索結(jié)束...");}/*** 去目錄下搜索某個(gè)文件* @param dir 目錄* @param fileName 要搜索的文件名稱*/public static void searchFile(File dir, String fileName) throws Exception {System.out.println("正在搜索目錄:" + dir.getAbsolutePath());// 1、把非法的情況都攔截住if(dir == null || !dir.exists() || dir.isFile()){System.out.println("無法搜索,目錄無效");return;// 代表無法搜索}// 2、dir 不是 null, 存在,一定是目錄對(duì)象。// 獲取當(dāng)前目錄下的全部一級(jí)文件對(duì)象。File[] files = dir.listFiles();System.out.println("找到 " + files.length + " 個(gè)一級(jí)文件");// 3、判斷當(dāng)前目錄下是否存在一級(jí)文件對(duì)象,以及是否可以拿到一級(jí)文件對(duì)象。if(files != null && files.length >0) {// 4、遍歷全部一級(jí)文件對(duì)象。for (File f : files) {//5、判斷文件是否是文件,還是文件夾if (f.isFile()) {// 是文件,判斷這個(gè)文件名是否是我們要找的if (f.getName().contains(fileName)) {System.out.println("找到了:" + f.getAbsolutePath());Runtime runtime =Runtime.getRuntime();runtime.exec(f.getAbsolutePath());} else {// 是文件夾,繼續(xù)重復(fù)這個(gè)過程(遞歸)System.out.println("正在搜索子目錄:" + f.getAbsolutePath());searchFile(f, fileName);}}}}}
}
1.3.1.5 遞歸刪除目錄下的非空文件
import java.io.File;public class FileTest1 {public static void main(String[] args) {// 目標(biāo):刪除非空文件夾。獨(dú)立功能獨(dú)立成方法。File dir = new File("D:\\resource");deleteDir(dir);}public static void deleteDir(File dir){if (dir == null || !dir.exists()){return;}if (dir.isFile()){dir.delete();}// 1、dir存在且是文件夾。拿里面的一級(jí)文件對(duì)象File[] files = dir.listFiles();if (files ==null){return;}if(files.length ==0){dir.delete();return;}// 2、這是一個(gè)有內(nèi)容的文件夾 ,干掉里面的內(nèi)容,再干掉自己。for (File file : files) {if(file.isFile()){dir.delete();}else {deleteDir(file);}}dir.delete();}
}
1.3.1.6 啤酒問題
- 啤酒2元一瓶,4個(gè)蓋子可以換一瓶,2個(gè)空瓶可以換一瓶,請(qǐng)問10元可以喝多少瓶?
public class FileTest2 {private static int totalNumber;private static int lastCoverNumber;private static int lastBottleNumber;public static void main(String[] args) {// 啤酒問題:啤酒2元一瓶,4個(gè)蓋子可以換一瓶,2個(gè)空瓶可以換一瓶,請(qǐng)問10元可以喝多少瓶?buy(10);}private static void buy(int money){// 1、先買了再說int buyNumber =money/2;totalNumber += buyNumber;// 2、把蓋子和瓶子換算成錢繼續(xù)買// 計(jì)算本輪總的蓋子和瓶子數(shù)int allBottleNumber =buyNumber +lastBottleNumber;int allCoverNumber =buyNumber+lastCoverNumber;int allMoney =0;if(allBottleNumber >= 2) {allMoney += (allBottleNumber / 2) * 2;}lastBottleNumber = allBottleNumber % 2;if(allCoverNumber>=4) {allMoney += (allCoverNumber / 4) * 2;}lastCoverNumber = allCoverNumber%4;if(allMoney >=2){buy(allMoney);}}
}
總數(shù):15
剩余蓋子數(shù):3
剩余瓶子數(shù):1
1.4 簡(jiǎn)單文件操作的案例
目標(biāo):
改變某個(gè)文件夾下視頻的序號(hào),要求從19開始。
import java.io.File;public class FileTest {public static void main(String[] args) {// 目標(biāo):改變某個(gè)文件夾下視頻的序號(hào),要求從19開始。File dir = new File( "E:\\磊哥面授-黃埔一期\\Java從入門至大牛課程\\day02-面向?qū)ο蟾呒?jí)部分\\視頻");//1、拿到下面全部的視頻,一級(jí)文件對(duì)象File[] videos = dir.listFiles();// 2、一個(gè)一個(gè)的找for(File video: videos) {//3、拿到它的名字,改成新名字String name = video.getName();// name =“10、多態(tài)、繼承....10String index = name.substring(0, name.indexOf("、"));String lastName = name.substring(name.indexOf("、"));String newName = (Integer.valueOf(index) + 18) + lastName;// 4、正式改名video.renameTo(new File(dir, newName));}}
}