剪切文件_配置文件修改-我们到底能走多远系列(4)
我们到底能走多远系列(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几岁后学得的技能,一个月不用就生疏了,看来是越大越没用啊!不进步不是停止不前,是退步,因为所有你身边的人都在进步。
----------------------------------------------------------------------
努力不一定成功,但不努力肯定不会成功。
共勉。