工作之餘也完成了兩個小專案,第一個是因應自己英文太差的關係,所以開發一個「單字輪播器」,讓自己在上班時還可以偷喵單字,增加對單字的印象。第二個小專案就是今天的主角,雖然乍看之下沒什麼用,但對開發者而言,快速清除大量殘留在專案裡的無用註解也助於美化程式碼。
而本次開發所選用的程式語言是我完全沒碰過的「JAVA」,老實說我昨天才上W3School看JAVA的語法,今天就直接實戰,有人會問:「語法不熟你寫得出什麼東西?」,我的想法是:「邊做邊學才是最快的學習」,當然每個人的學習方法都不同,選擇最適合自己的即可。但對於職校出生的我來說...〝實戰〞一直都是我認為最快最有效的學習方法。
首先來看看流程圖:
註解消除器流程圖 |
不過流程圖很難說明實作上遇到的問題,但基本上本程式的功能就是將「雙斜線後面的字串全部刪除」,當然你可能會說:「註解還有/* */啊!HTML還有!--呢!!」這個我知道,但很抱歉,這些功能尚未導入,謝謝XD
再來我們看一下程式碼的部分,程式碼比較有趣,來詳細講一下:
--------------------------------------------------------
Scanner input_filename = new Scanner(System.in);
System.out.print("請輸入檔名(含副檔名):");
String filename = input_filename.nextLine();
File myObj = new File(filename);
if(Files.notExists(Paths.get(filename))) {
System.out.println("File not exist!!");
} else {
//main function code area
}
這個部份是「輸入檔名」,JAVA在輸入資料上比較麻煩,不像C語言有scanf,也不像Python有input可以用,JAVA的輸入資料要先下一個Scanner,在這之前也要先import java.util.Scanner,這部分跟C還有Python一樣,該import的library還是必須的。
而Scanner後的new Scanner所帶的參數是〝System.in〞,在JAVA裡就是輸入訊息。
再來要把輸入資料餵給變數filename,filename吃到之後要創建一個file object,用於之後讀取資料。
判斷式就很簡單了,當檔案不存在就顯示〝File not exist!!〞,存在就繼續做下面的事情。
--------------------------------------------------------
String testwrite = "testwrite.php" ; // 改名暫存,會刪掉
File test = new File(filename); // 改名用
在真正進入function前,來看一下這兩條。
為什麼抓這兩條出來?因為我在實驗時發現,如果寫入的檔名跟讀取的檔名相同,那寫入會有問題〈寫入結果變成空白〉,所以必須將寫入檔名和讀取檔名錯開,寫入檔名另外寫死一個名稱,寫入完成後,再將讀取的原檔案刪除,將寫入的〝testwrite.php〞改成讀取的原檔案之檔名,也就是第二行的程式碼,如此就天衣無縫的完成了覆蓋檔案的動作。〈但我覺得這不是好辦法,很像繞過問題而已,治標不治本〉
--------------------------------------------------------
try {
String comment = "";
String comment_delete = "";
//-----Write area-----
File fout = new File(testwrite);
FileOutputStream fos = new FileOutputStream(fout);
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(fos));
//-----Write area-----
Scanner myReader = new Scanner(myObj);
while(myReader.hasNextLine()) {
String data = myReader.nextLine();
if(data.indexOf("//") != -1){
int number = data.indexOf("//");
comment = data.substring(number);
}
comment_delete = data.replace(comment, "");
System.out.println(comment_delete);
//-----Write area-----
bw.write(comment_delete);
bw.newLine();
//-----Write area-----
}
bw.close();
myReader.close();
if(myObj.delete()) {
boolean success = fout.renameTo(test);
}
} catch (FileNotFoundException e) {
System.out.println("An error occurred.");
e.printStackTrace();
}
最有趣的來了,這就是我們的主要程式碼所在地。
其實我們可以先把Write area的部分先拿掉,這樣比較好理解:
String comment = "";
String comment_delete = "";
Scanner myReader = new Scanner(myObj);
while(myReader.hasNextLine()) {
String data = myReader.nextLine();
if(data.indexOf("//") != -1){
int number = data.indexOf("//");
comment = data.substring(number);
}
comment_delete = data.replace(comment, "");
System.out.println(comment_delete);
}
myReader.close();
這樣是不是簡單多了呢?
首先必須先理解一件事:「檔案內容需逐行讀取」
理解之後,我們還需要知道一件事:「要怎麼抓雙斜線?」
在JAVA中,有一個語法是〝indexOf〞,此語法專門用來抓取特定字串的位置,但光有indexOf還不夠,因為這樣僅僅只能知道雙斜線的位置在哪裡,所以還必須搭配〝substring〞將抓出來的位置之值當作索引,抓出雙斜線後面的子字串,這樣才是正道!
但當indexOf抓不到特定字串時〈如//雙斜線〉,會顯示-1這個value,所以必須加入判斷式,倘若不是-1的狀況,就抓取雙斜線後面的子字串。
最後用〝replace〞語法,將雙斜線後面的子字串用空字串來取代,這就是本程式主要的概念。
//-----Write area-----
File fout = new File(testwrite);
FileOutputStream fos = new FileOutputStream(fout);
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(fos));
//-----Write area-----
//-----Write area-----
bw.write(comment_delete);
bw.newLine();
//-----Write area-----
最後是寫入的部分,這部分搞特別久,因為可以使用的方法太多。
這個方法是從網路上找到的,BufferedWriter看的不是很理解,所以我沒辦法做詳細解釋,但大概的概念就是,創建一個file object後,透過FileOutputStream的方式對文件檔進行操作。若未來我有什麼新想法的會再進行補充。
最後兩行的部分就是將檔案寫入,記得補個〝newLine〞哦!不然寫入的檔案會全部變成一行...
--------------------------------------------------------
if(myObj.delete()) {
boolean success = fout.renameTo(test);
}
最後就是刪除原檔案,再將寫入後生出來的testwrite改成原檔案的檔名。
--------------------------------------------------------
實際運作影片:
沒有留言:
張貼留言