剪下檔案_設定檔修改-我們到底能走多遠系列(4)

來源:互聯網
上載者:User
我們到底能走多遠系列(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幾歲後學得的技能,一個月不用就生疏了,看來是越大越沒用啊!不進步不是停止不前,是退步,因為所有你身邊的人都在進步。

----------------------------------------------------------------------

努力不一定成功,但不努力肯定不會成功。
共勉。

 

 

  

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.