命令行參數(shù)項(xiàng)目實(shí)戰(zhàn)
1.功能描述
①在終端輸入ls采幌,會(huì)列出所有文件。并在后面跟上它的大小震桶。比如
Applications 2M
②終端輸入mkdir temp就會(huì)創(chuàng)建一個(gè)temp目錄
③終端輸入createNewFile temp就會(huì)創(chuàng)建一個(gè)temp文件
④cope 1.txt 2.txt就是在當(dāng)前文件夾下復(fù)制1.txt到當(dāng)前文件夾下休傍,并命名為2.txt。這是文件蹲姐,當(dāng)然也有可能是拷貝文件夾磨取,在拷貝文件夾的時(shí)候,要把里面所有文件都拷貝過去
⑤delete 1.txt就是刪除文件1.txt
2.初試
1.遇到的問題
在第一次寫的時(shí)候柴墩,遇到了很多問題
1.1如何接收整行數(shù)據(jù)
當(dāng)時(shí)我只知道直接用scanner.next()的話忙厌,空格或者換行符之后的數(shù)據(jù)就接收不到了,而功能描述里面江咳,比如mkdir temp逢净,mkdir和temp之間是有空格的,那temp這個(gè)數(shù)據(jù)怎么接收呢歼指?當(dāng)時(shí)也是查了好久爹土,問了好久,才找到了解決辦法
①使用.nextLine();踩身,這樣會(huì)接收一整行數(shù)據(jù)胀茵,當(dāng)然包括空格之后的。
②接收一整行數(shù)據(jù)之后惰赋,調(diào)用String的split(" ")方法宰掉,把這一整行數(shù)據(jù)通過空格分成若干部分,并用字符串?dāng)?shù)組接收赁濒。具體使用示例如下
//接收命令
Scanner scanner = new Scanner(System.in);
String command = scanner.nextLine();
//把輸入字符串通過空格隔開
String[] everyName = command.split(" ");
1.2如何列出文件名及大小
當(dāng)時(shí)嘗試了很多方法轨奄,先想出了第一種解決辦法,就是用file.list()方法拒炎,并用字符串?dāng)?shù)組接收挪拟,然后一個(gè)一個(gè)輸出名字和用.length()方法得出文件大小。但是今早我才意識(shí)到這是不對(duì)的击你。file.list()返回值是String數(shù)組玉组,得到的文件或目錄名確實(shí)是對(duì)的谎柄,但是用length()方法得出來的不是文件的大小,而是字符串長(zhǎng)度惯雳。 今早我改過來了朝巫,應(yīng)該
①使用.listFile()方法,返回文件數(shù)組石景,劈猿。
②再用每一個(gè)文件相應(yīng)的方法輸出姓名和文件大小。具體使用示例如下
//2.保存所有文件名
File[] allFiles = file.listFiles();//注意這里返回的是數(shù)組String[]而不是String潮孽。
//3.輸出文件名(記住要用for循環(huán)揪荣,不能直接System.out.println(allFiles),這樣會(huì)直接輸出內(nèi)存地址(沒有重寫toString)
for(File oneFile:allFiles) {
System.out.print(oneFile.getName());
//double sizeofFile = oneFile.length()/1024;//由于桌面上的文件都很小往史,所以這里就不需要進(jìn)行轉(zhuǎn)換了
System.out.println("的大小為"+oneFile.length()+"B");
}
這樣輸出的結(jié)果就類似于
1.3如何復(fù)制目錄
文件復(fù)制較為容易仗颈,但是目錄就不一樣了。
我想到的解決辦法就是
①先把文件復(fù)制方法寫出來
②利用增強(qiáng)for循環(huán)椎例,把待復(fù)制目錄的文件一個(gè)一個(gè)地取出
③分別把每一個(gè)取出的文件進(jìn)行復(fù)制挨决。
大概如下
String[] fileNames = srcFile.list();
for(String oneFile:fileNames) {
}
1.4文件對(duì)象的輸出
比如oneFile是一個(gè)File類型的對(duì)象,然后直接輸出它订歪,和輸出oneFile.getAbsolutePath()得到的結(jié)果是一樣的凰棉。都是文件地址。輸出結(jié)果類似C:\Users\劉金豪\Desktop.vs陌粹。究其原因,應(yīng)該是沒有重寫toString方法福压。
2.初試成果
①M(fèi)ain類
package filetest;
import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args) {
//接收命令
Scanner scanner = new Scanner(System.in);
String command = scanner.nextLine();
//把輸入字符串通過空格隔開
String[] everyName = command.split(" ");
//創(chuàng)建路徑
String src = "C:\\Users\\劉金豪\\Desktop";
String des = "C:\\Users\\劉金豪\\Desktop\\copy";
//匹配功能
//輸出所有文件
if(everyName[0].equals("ls")) {
listAll.show(src);
}
//創(chuàng)建目錄
if(everyName[0].equals("mkdir")) {
//1.保存目錄名
String dirName = everyName[1];
//2.創(chuàng)建目錄
File file = new File(src+"\\"+dirName);//注意這里是src而不是“src”
if(!file.exists()) {
try{
file.mkdir();
}catch(Exception e) {
e.printStackTrace();
}
System.out.println("創(chuàng)建成功");
}
}
//創(chuàng)建文件
if(everyName[0].equals("createNewFile")) {
//1.保存文件名
String fileName = everyName[1];
//2.創(chuàng)建文件
File file = new File(src+"\\"+fileName);
if(!file.exists()) {
try {
file.createNewFile();
}catch(Exception e) {
e.printStackTrace();
}
System.out.println("創(chuàng)建成功");
}
}
//copy文件
if(everyName[0].equals("copy")) {
//1.保存文件名稱
String src_file = everyName[1];
String des_file = everyName[2];
//2.保存文件路徑名
String srcF = src+"\\"+src_file;
String desF = des;//+"\\"+des_file;
//2.創(chuàng)建文件
File srcFile = new File(srcF);
if(srcFile.exists()) {
//如果是文件掏秩,則執(zhí)行這個(gè)
if(srcFile.isFile()) {
while(true) {
//判斷是字節(jié)流還是字符流
System.out.println("請(qǐng)選擇字節(jié)流或字符流(分別輸入1/2)");
Scanner scanner1 = new Scanner(System.in);
int byte_or_char = scanner.nextInt();
if(1 == byte_or_char) {
copyFile.copyByte(srcF, desF);
break;
}if(2 == byte_or_char) {
copyFile.copyChar(srcF, desF);
break;
}else {
System.out.println("輸入有誤,請(qǐng)重新輸入");
continue;
}
}
}else {
String[] fileNames = srcFile.list();
for(String oneFile:fileNames) {
System.out.println("當(dāng)前文件名為"+oneFile);
while(true) {
//判斷是字節(jié)流還是字符流
System.out.println("請(qǐng)選擇字節(jié)流或字符流(分別輸入1/2)");
Scanner scanner1 = new Scanner(System.in);
int byte_or_char = scanner.nextInt();
if(1 == byte_or_char) {
copyFile.copyByte(srcF+"\\"+oneFile, desF+"\\"+oneFile);
break;
}if(2 == byte_or_char) {
copyFile.copyChar(srcF+"\\"+oneFile, desF+"\\"+oneFile);
break;
}else {
System.out.println("輸入有誤荆姆,請(qǐng)重新輸入");
continue;
}
}
}
}
}
}
//刪除文件
if(everyName[0].equals("delete")) {
//保存待刪除的文件名
String deFileName = everyName[1];
//創(chuàng)建file
File file = new File(src+"http://"+deFileName);
if(file.exists()) {
try {
file.delete();
}catch(Exception e) {
e.printStackTrace();
}
System.out.println("刪除成功");
}
}
}
}
②listAll類
package filetest;
import java.io.File;
//列出所有文件夾
public class listAll {
public static void show(String src) {
//1.創(chuàng)建文件
File file = new File(src);
//2.保存所有文件名
File[] allFiles = file.listFiles();//注意這里返回的是數(shù)組String[]而不是String蒙幻。
//3.輸出文件名(記住要用for循環(huán),不能直接System.out.println(allFiles)胆筒,這樣會(huì)直接輸出內(nèi)存地址(沒有重寫toString)
for(File oneFile:allFiles) {
System.out.print(oneFile.getName());
//double sizeofFile = oneFile.length()/1024;//由于桌面上的文件都很小邮破,所以這里就不需要進(jìn)行轉(zhuǎn)換了
System.out.println("的大小為"+oneFile.length()+"B");
}
//下面這種會(huì)輸出類似C:\Users\劉金豪\Desktop\.vs的大小為4096B,是直接輸出路徑了仆救,我們不需要這種形式抒和,就選擇上面那種
/* //2.保存該目錄下的所有文件
File[] files = file.listFiles();
//3.逐一輸出文件名及大小
for(File oneFile:files) {
System.out.println(oneFile+"的大小為"+oneFile.length()+"B");
//System.out.println(oneFile.getAbsolutePath());//與上面一行代碼是一樣的,除了后面加的文字?jǐn)⑹觥暗拇笮椤焙竺娴摹? //也就是說直接輸出oneFile和輸出oneFile.getAbsolutePath()的結(jié)果是一樣的彤蔽。
}*/
}
}
copyFile類
package filetest;
import java.io.*;
//拷貝文件
public class copyFile {
public static void copyByte(String srcF,String desF) {
try( FileInputStream fis = new FileInputStream(srcF);
FileOutputStream fos = new FileOutputStream(desF);) {
int len = 0;
byte[] bytes = new byte[1024];//這一行代碼當(dāng)時(shí)不會(huì)寫了
if((len = fis.read()) != -1) {
fis.read(bytes);
//寫入數(shù)據(jù)
fos.write(bytes);
}
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("復(fù)制成功摧莽!");
}
public static void copyChar(String srcF,String desF) {
try( FileReader fis = new FileReader(srcF);
FileWriter fos = new FileWriter(desF);) {
int len = 0;
char[] chars = new char[1024];//這一行代碼當(dāng)時(shí)不會(huì)寫了
if((len = fis.read()) != -1) {
fis.read(chars);
//寫入數(shù)據(jù)
fos.write(chars);
}
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("復(fù)制成功!");
}
}
三.卷土重來
上面的代碼是第一次寫完之后的顿痪,但是仔細(xì)觀察镊辕,上面的代碼結(jié)構(gòu)不行油够,過程也不是很清晰,總之還是太受c語(yǔ)言的束縛征懈,所以在今早我又改了一下石咬,以更加熟悉“面向?qū)ο蟆?/strong>的思想
1.項(xiàng)目層級(jí)
名稱對(duì)應(yīng)的功能都顯而易見了
2.具體代碼
①M(fèi)ain類
package filetest;
import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args) {
//接收命令
Scanner scanner = new Scanner(System.in);
String command = scanner.nextLine();
//把輸入字符串通過空格隔開(這個(gè)是當(dāng)時(shí)沒想到的,后來通過反復(fù)查詢才找到這個(gè)知識(shí)點(diǎn)卖哎。
String[] everyName = command.split(" ");
//創(chuàng)建路徑
String src = "C:\\Users\\劉金豪\\Desktop";
String des = "C:\\Users\\劉金豪\\Desktop\\copy";
//匹配功能
matchFunction.mFunction(src,des,everyName);
}
}
②matchFunction類
package filetest;
public class matchFunction {
public static void mFunction(String src,String des,String[] everyName) {
//匹配功能
//輸出所有文件
if(everyName[0].equals("ls")) {
listAll.show(src);
}
//創(chuàng)建目錄
if(everyName[0].equals("mkdir")) {
mkdir.mkDirectory(src,everyName[1]);
}
//創(chuàng)建文件
if(everyName[0].equals("createNewFile")) {
createFile.cFile(src, everyName[1]);
}
//copy文件
if(everyName[0].equals("copy")) {
copyFile.copy(src, des, everyName[1], everyName[2]);
}
//刪除文件
if(everyName[0].equals("delete")) {
deleteFile.deFile(src, everyName[1]);
}
}
}
③listAll類
package filetest;
import java.io.File;
//列出所有文件夾
public class listAll {
public static void show(String src) {
//1.創(chuàng)建文件
File file = new File(src);
//2.保存所有文件名
File[] allFiles = file.listFiles();//注意這里返回的是數(shù)組String[]而不是String鬼悠。
//3.輸出文件名(記住要用for循環(huán),不能直接System.out.println(allFiles)棉饶,這樣會(huì)直接輸出內(nèi)存地址(沒有重寫toString)
for(File oneFile:allFiles) {
System.out.print(oneFile.getName());
//double sizeofFile = oneFile.length()/1024;//由于桌面上的文件都很小厦章,所以這里就不需要進(jìn)行轉(zhuǎn)換了
System.out.println("的大小為"+oneFile.length()+"B");
}
//下面這種會(huì)輸出類似C:\Users\劉金豪\Desktop\.vs的大小為4096B,是直接輸出路徑了照藻,我們不需要這種形式袜啃,就選擇上面那種
/* //2.保存該目錄下的所有文件
File[] files = file.listFiles();
//3.逐一輸出文件名及大小
for(File oneFile:files) {
System.out.println(oneFile+"的大小為"+oneFile.length()+"B");
//System.out.println(oneFile.getAbsolutePath());//與上面一行代碼是一樣的,除了后面加的文字?jǐn)⑹觥暗拇笮椤焙竺娴摹? //也就是說直接輸出oneFile和輸出oneFile.getAbsolutePath()的結(jié)果是一樣的幸缕。
}*/
}
}
④mkdir類
package filetest;
import java.io.File;
//創(chuàng)建目錄
public class mkdir {
public static void mkDirectory(String src,String dirName) {
//創(chuàng)建目錄
File file = new File(src+"\\"+dirName);//注意這里是src而不是“src”
if(!file.exists()) {
try{
file.mkdir();
}catch(Exception e) {
e.printStackTrace();
}
System.out.println("創(chuàng)建成功");
}
}
}
⑤createFile類
package filetest;
import java.io.File;
public class createFile {
public static void cFile(String src,String fileName) {
//創(chuàng)建文件
File file = new File(src+"\\"+fileName);
if(!file.exists()) {
try {
file.createNewFile();
}catch(Exception e) {
e.printStackTrace();
}
System.out.println("創(chuàng)建成功");
}
}
}
⑥copyFile類
package filetest;
import java.io.*;
import java.util.Scanner;
//拷貝文件
public class copyFile {
public static void copy(String src,String des,String src_file,String des_file) {
//保存文件路徑名
String srcF = src+"\\"+src_file;
String desF = des;//+"\\"+des_file;
//創(chuàng)建文件
File srcFile = new File(srcF);
if(srcFile.exists()) {
//如果是文件群发,則執(zhí)行這個(gè)
if(srcFile.isFile()) {
while(true) {
//判斷是字節(jié)流還是字符流
System.out.println("請(qǐng)選擇字節(jié)流或字符流(分別輸入1/2)");
Scanner scanner1 = new Scanner(System.in);
int byte_or_char = scanner1.nextInt();
if(1 == byte_or_char) {
copyFile.copyByte(srcF, desF);
break;
}if(2 == byte_or_char) {
copyFile.copyChar(srcF, desF);
break;
}else {
System.out.println("輸入有誤,請(qǐng)重新輸入");
continue;
}
}
}else {
String[] fileNames = srcFile.list();
for(String oneFile:fileNames) {
System.out.println("當(dāng)前文件名為"+oneFile);
while(true) {
//判斷是字節(jié)流還是字符流
System.out.println("請(qǐng)選擇字節(jié)流或字符流(分別輸入1/2)");
Scanner scanner1 = new Scanner(System.in);
int byte_or_char = scanner1.nextInt();
if(1 == byte_or_char) {
copyFile.copyByte(srcF+"\\"+oneFile, desF+"\\"+oneFile);
break;
}if(2 == byte_or_char) {
copyFile.copyChar(srcF+"\\"+oneFile, desF+"\\"+oneFile);
break;
}else {
System.out.println("輸入有誤发乔,請(qǐng)重新輸入");
continue;
}
}
}
}
}
}
//copy字節(jié)文件
public static void copyByte(String srcF,String desF) {
try( FileInputStream fis = new FileInputStream(srcF);
FileOutputStream fos = new FileOutputStream(desF);) {
int len = 0;
byte[] bytes = new byte[1024];//這一行代碼當(dāng)時(shí)不會(huì)寫了
if((len = fis.read()) != -1) {
fis.read(bytes);
//寫入數(shù)據(jù)
fos.write(bytes);
}
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("復(fù)制成功熟妓!");
}
//copy字符文件
public static void copyChar(String srcF,String desF) {
try( FileReader fis = new FileReader(srcF);
FileWriter fos = new FileWriter(desF);) {
int len = 0;
char[] chars = new char[1024];//這一行代碼當(dāng)時(shí)不會(huì)寫了
if((len = fis.read()) != -1) {
fis.read(chars);
//寫入數(shù)據(jù)
fos.write(chars);
}
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("復(fù)制成功!");
}
}
⑦deleteFile 類
package filetest;
import java.io.File;
public class deleteFile {
public static void deFile(String src,String deFileName) {
//創(chuàng)建file
File file = new File(src+"http://"+deFileName);
if(file.exists()) {
try {
file.delete();
}catch(Exception e) {
e.printStackTrace();
}
System.out.println("刪除成功");
}
}
}
3.運(yùn)行結(jié)果
運(yùn)行結(jié)果基本能夠達(dá)到功能要求栏尚,目前局限性在于只能輸出到特定文件夾中起愈,也就是我自己提前設(shè)定好的文件夾,不夠靈活译仗。不過現(xiàn)在初學(xué)階段沒必要考慮這么多抬虽,等今天再看一下老師寫的過程,就可以更加熟悉文件的操作了纵菌。
總結(jié)
這個(gè)程序雖然總體來說較為容易阐污,但對(duì)于我來說,寫起來還是比較費(fèi)腦筋的咱圆。不過現(xiàn)在寫完之后笛辟,確實(shí)收獲了很多知識(shí)。繼續(xù)加油吧序苏!