我們到底能走多遠系列(4)
扯淡:
不知道有多少人喜歡聽著音樂寫點代碼的?我是其中一個。以前在公司的時候期望能買個好點的MP3什麼的心無旁騖的寫點代碼,領點工資。生活總是沒有想象得美好。程式員要處理的事有很多不是坐在舒服的椅子上,喝點咖啡或綠茶,敲幾行代碼能解決的。
是不是大家都是容易放棄的人呢?反正我是的,上個月,看本書看了2章,就擱置了。上個星期開始嘗試聽voa,臨近的3天就荒廢了。今天繼續吧。
園子裡讀到過一篇怎樣找出自己人生的終極目標:用一個小時,勿打擾的思考,不斷記下浮現腦海的答案,列出表格。作者認為用這種方式在最後能夠發現每個人自己一生的目標。從而開啟一個不一樣的人生旅程。不知道有沒有人試過呀。
人生就像拋硬幣,只要我們能接住,就會有結果。
剪下檔案:
複製檔案+刪除檔案=剪下檔案?
好吧,原始的方式:
public static boolean moveFile1(String fromPath, String toPath) throws IOException{ File fromFile = new File(fromPath); InputStream is = new BufferedInputStream(new FileInputStream(fromFile)); OutputStream os = new BufferedOutputStream(new FileOutputStream(new File(toPath))); byte b[] = new byte[(int)fromFile.length()] ; while(is.read(b, 0, b.length) != -1){ os.write(b, 0, b.length); } is.close(); os.close(); return fromFile.delete(); }
但是我們不會用上面的方法去實現,因為File有自己的方式去解決剪下這件事:
/** * * @param fromPath 被剪下檔案路徑 -->"d:/我的文件/www.txt" * @param toPath 剪下去的位置路徑 -->"d:/我的文件/test/www.txt" */ public static void moveFile2(String fromPath, String toPath){ File fromFile = new File(fromPath); File toFile = new File(toPath); //存在同名檔案 if(toFile.exists()){ // 截斷路徑 int last = toPath.lastIndexOf(File.separator) > toPath.lastIndexOf("\\")? toPath.lastIndexOf(File.pathSeparator):toPath.lastIndexOf("\\"); String path = toPath.substring(0, last); // 備份檔案名 File fileBak = new File(path + File.separator + toFile.getName() + ".bak"); // 備份檔案同名 if( ! toFile.renameTo(fileBak)){ fileBak.delete();//刪除同名備份檔案 } // 備份檔案 toFile.renameTo(fileBak); } // 剪下 fromFile.renameTo(toFile); }
上例需要注意renameTo的方法的使用,如果返回false,說明操作失敗,可能會影響後續的操作。(比如說已經有同名的檔案)
下班回到家,想修改設定檔這件事,原始的方式:
/** * * @param path config檔案路徑 * @param nodeName 修改節點名 * @param value 修改值 * @return 修改節點數,如果返回-1,修改失敗 * @throws IOException */ public int changeConfig(String path, String nodeName, String value) throws IOException{ File config = new File(path); if( ! config.exists() || nodeName == null){ return -1; } File configBak = new File(path + "_bak"); // 讀 BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(config))); // 寫 BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(configBak))); // 節點形式 String nodeStart = "<" + nodeName + ">"; String nodeEnd = "</" + nodeName + ">"; String str; int i = 0; // 讀取每一行 while((str = reader.readLine()) != null ){ str = str.trim(); if(str.equals("") || str == null){ continue; } // 匹配每一行 if(str.startsWith(nodeStart) && str.endsWith(nodeEnd)){ // .*?配任意數量的重複 (?<=exp)匹配exp後面的位置 (?=exp)匹配exp前面的位置 str = str.replaceAll("(?<=>)(.*?)(?=<)", value); i ++; } writer.write(str + "\t\n"); } writer.close(); reader.close(); // 流關閉後才能操作 // 刪除原設定檔 config.delete(); // 更新設定檔 configBak.renameTo(config); return i; }
這個世界上總有更好的方式解決問題,試著用java中DOM解析的方式來解決下:
/** * * @param path 設定檔路徑 * @param nodeName 節點名 * @param nodeValue 修改成什麼樣value * @return * @throws Exception */ public int changeConfig1(String path, String nodeName, String nodeValue) throws Exception{ File config = new File(path); // 解析器工廠類 DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); // 解析器 DocumentBuilder db = dbf.newDocumentBuilder(); // 文檔樹模型Document Document document = db.parse(config); // A.通過xml文檔解析 NodeList nodeList = document.getElementsByTagName(nodeName); // B.將需要解析的xml文檔轉化為輸入資料流,再進行解析 //InputStream is = new FileInputStream(config); //Document nodeList = db.parse(is); for (int i = 0; i < nodeList.getLength(); i++) { // Element extends Node Element node = (Element)nodeList.item(i); System.out.println( node.getElementsByTagName("b").item(0).getFirstChild().getNodeValue()); node.getElementsByTagName(nodeName).item(0).getFirstChild().setTextContent(nodeValue); System.out.println( node.getElementsByTagName("c").item(0).getFirstChild().getNodeValue()); } // 是改動生效,網上很多代碼都沒有提到這步操作,我不明白他們是怎麼完成修改xml的value值的。 // 可以理解成記憶體中的資料已經被改了,還沒有映射到檔案中 TransformerFactory tfFac = TransformerFactory.newInstance(); Transformer tf = tfFac.newTransformer(); DOMSource source = new DOMSource(document); tf.transform(source, new StreamResult(config));// 修改內容映射到檔案 return 0; }
今天讀書的時候,理解到教育要從越小的時候開始越好,那時候記下的文章能20年不忘,20幾歲後學得的技能,一個月不用就生疏了,看來是越大越沒用啊!不進步不是停止不前,是退步,因為所有你身邊的人都在進步。
----------------------------------------------------------------------
努力不一定成功,但不努力肯定不會成功。
共勉。