一、使用RandomAccessFile为普通文件追加内容
有的时候,需要在文件的特定位置实现内容的追加,但往往又不是xml文件,所以无法利用Jdom API来操作,为了达到在文件特定位置追加,就必须使用游标RandomAccessFile了,例如下面这个方法:
public static void appendApplication(String filePath, String packName) { StringBuffer sb = new StringBuffer(); packName = packName.replace("\\", "/"); System.out.println(packName); //要在return-void前面追加的内容 sb.append("invoke-virtual {p0}, L"+ packName +";->getApplicationContext()Landroid/content/Context;\r\n"); sb.append("move-result-object v0\r\n"); sb.append(".local v0, context:Landroid/content/Context;\r\n"); sb.append("invoke-static {v0}, Lcom/xx/xx/xx/xx;->install(Landroid/content/Context;)V\r\n"); try { RandomAccessFile raf = new RandomAccessFile(filePath, "rw"); long fileLength = raf.length(); // System.out.println(fileLength); raf.seek(fileLength - ".end method".length()-" return-void".length()); raf.writeBytes(sb.toString()); long newLength = raf.length(); raf.seek(newLength); //这2行必须要加上,否则追加后它们将会被替换掉,\r\n是换行符 raf.writeBytes("\r\nreturn-void"); raf.writeBytes("\r\n.end method"); raf.close(); } catch (Exception e) { e.printStackTrace(); } }
注:或许往“普通”文件(相对xml结构的文件而言)的特定位置追加内容有更好的方法,使用游标并不是十分理想的选择,这方面待探索。。
二、往xml结构文件的特定位置追加内容(需导入w3c-dom.jar包)
由于JDOM API的存在,读写xml文件会比非xml文件容易多了,一般向xml文件追加内容会大致分为2种情况:——向特定节点内追加子节点,向根节点追加子节点。
2.1 往根节点追加子节点
public static void appendToRoot(String filePath, String permission) { DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); try{ DocumentBuilder db = dbf.newDocumentBuilder(); File file=new File(filePath); //Document doc = db.parse(filePath);按理说也可以,但是会因为中文路径而出现异常: // java.net.MalformedURLException: unknown protocol: f Document doc = db.parse(file); Element elName = doc.createElement("uses-permission"); Attr attr = doc.createAttribute("android:name"); attr.setValue(permission); elName.setAttributeNode(attr); Element root = doc.getDocumentElement(); root.appendChild(elName); doc2XmlFile(doc, filePath); }catch(Exception e) { e.printStackTrace(); } }
其中,doc2XmlFile方法如下:
public static void doc2XmlFile(Document document, String filename) { try { // 将document中的内容写入文件中 TransformerFactory tFactory = TransformerFactory.newInstance(); Transformer transformer = tFactory.newTransformer(); transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8"); DOMSource source = new DOMSource(document); StreamResult result = new StreamResult(new File(filename)); transformer.transform(source, result); } catch (Exception ex) { System.out.println("更新" + filename + "出错:" + ex); // ex.printStackTrace(); } }
这样,就能达到向根节点<manifest />追加一个权限<uses-permission android:name="android.permission.xxxx"/>的效果;
注:为了避免访问中文路径而发生java.net.MalformedURLException: unknown protocol: f 异常,建议Document doc = db.parse(file);方法的参数是一个File file = new File(String path)的类。
2.2 往特定子节点追加节点
public static void appendToNode(String filePath, String serviceName) { DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); try{ DocumentBuilder db = dbf.newDocumentBuilder(); File f = new File(filePath); Document doc = db.parse(f); Node appNode = doc.getElementsByTagName("application").item(0); //注册service Element serviceEle = doc.createElement("service"); Attr attr = doc.createAttribute("android:name"); attr.setValue("xx.xx.xxx.xx.xxxx"); serviceEle.setAttributeNode(attr); appNode.appendChild(serviceEle); doc2XmlFile(doc, filePath); }catch(Exception e) { e.printStackTrace(); } }
关键是Node appNode = doc.getElementsByTagName("application").item(0); appNode.appendChild(serviceEle);这样就实现了往根节点<manifest />下的子节点<application />追加一个形如<service android:name="xx.xx.xxx.xxxx"/>的子节点
三、BufferedReader读取文件特定内容
eg.读取包名:
public static String getPackName(String xmlPath) { String packName = null; try { File f = new File(xmlPath + "\\AndroidManifest.xml"); InputStream in = new FileInputStream(f); //获取缓冲字符输入流 BufferedReader br = new BufferedReader(new InputStreamReader(in, "utf-8")); String line = null; while(null != (line = br.readLine())) { if(line.contains("android:name=")) { //循环读取 int start = line.indexOf("android:name=")+"android:name=".length()+1; int end = line.indexOf("\"", start); packName = line.substring(start, end); break; } } } catch (IOException e) { e.printStackTrace(); } return packName; }
相关推荐
内容关键词:读取文件、写入文件、追加内容、文件管理、代码示例 用途:在软件开发和数据处理中,对文件的读写操作是基本且重要的技能。掌握C语言的文件IO操作对于进行数据存储、配置加载、日志记录等任务至关重要。...
在C语言中,进行文件读写操作通常涉及使用标准库函数如fopen, fprintf, fscanf, fgets, fputs, fclose等...此外,对于更复杂的操作,比如追加内容、处理二进制数据、读取特定格式的数据等,还需要使用其他函数和技巧。
skip=n - 指在文件开始时忽略的行数。 delims=xxx - 指分隔符集。这个替换了空格和跳格键的 默认分隔符集。 tokens=x,y,m-n - 指每行的哪一个符号被传递到每个迭代 的 for 本身。这会导致额外变量名称的 格式为一...
3.1Makefile文件的内容 3.2Makefile文件的命名 3.3包含其它的Makefile文件 3.4变量MAKEFILES 3.5Makefile文件重新生成的过程 3.6重载其它Makefile文件 3.7make读取Makefile文件的过程 4 编写规则 4.1规则的...
这使得将新文件添加到存档非常容易,因为移动文件可以追加到末尾,但是这使得不可能进行随机读取,因为必须读取每个文件头,直到找到所需的特定文件为止。 TAR索引(.tar.index)是一个JSON文档,其中包含tar文件...
要访问CD-ROM上的文件,需要将CD-ROM设备挂装在文件树中的某个挂装点。如果发行版安装了自动挂装包,那么这个步骤可自动进行。在Linux中,如果要使用硬盘、光驱等储存设备,就得先将它加载,当储存设备挂上了之后,...
copy 1st.jpg/b+2st.txt/a 3st.jpg 将2st.txt的内容藏身到1st.jpg中生成3st.jpg新的文件,注:2st.txt文件头要空三排,参数:/b指二进制文件,/a指ASCLL格式文件 copy ipadmin$svv.exe c: 或:copyipadmin$*.* 复制...
通过使用Serv-U,用户能够将任何一台PC 设置成一个FTP 服务器,这样,用户或其他使用者就能够使用FTP 协议,通过在同一网络上的任何一台PC与FTP 服务器连接,进行文件或目录的复制,移动,创建,和删除等。...
+ 当读取客户端正在下载的文件时,添加了使用浮动缓冲区大小的功能。浮动缓冲区大小取决于当前的传输率,这使得传输效率大大提高。 + 添加了目录重命名权限设置。 + 添加了文件重命名权限设置。 + 添加了 "\" 路径...
想利用蒙特卡洛方法和yahoo,stooq等财经网站上的数据快速预测特定portfolio的收益。 整个程序的功能包括 读取json中的portfolio组合 创建蒙特卡洛模拟预测收益的算法 创建从财经网站获得特定投资组合数据,并根据2...
《C#全能速查宝典》共分为8章,分别介绍了C#语言基础、Windows窗体及常用控件、Windows高级控件、控件公共属性、方法及事件、数据库开发、文件、数据流与注册表、GDI+绘图技术和C#高级编程,共包含562个C#编程中常用...
本书是第II卷,以开发人员在项目开发中经常遇到的问题和必须掌握的技术为中心,介绍了应用Java进行桌面程序开发各个方面的知识和技巧,主要包括Java语法与面向对象技术、Java高级应用、窗体与控件应用、文件操作...
6.9 拖动时动态更改鼠标的光标类型和位置 6.10 拖曳并放置到目标容器 6.11 限制可放置的元素 6.12 实现可拖放的购物车 6.13 可排序的拖放 6.14 在多个列表之间进行拖放 6.15 使用拖动方式选择多个元素 6.16 在两个...
5、 由于PetShop只是一个演示程序,所以若对数据库操作的某一类别(如对Account进行操作)中定义的“操作类”不够用(如除了接口中定义的几个方法外还需要其他Account操作),还可以在接口中追加其他的方法,用以...
1246.2.3 在多个字段上排序数据 1256.2.4 删除表排序次序和解冻列 1256.3 查找表中的匹配记录 1266.4 自动地替换匹配的字段值 1276.5 筛选表数据 1286.5.1 按选定内容筛选 1286.5.2 按窗体筛选 1306.5.3 高级筛选和...
28912.6.1 窗体视图中的工具栏按钮 28912.6.2 使用Personnel Actions窗体 29012.6.3 向Personnel Actions表追加新记录 29012.6.4 编辑现有的数据 29212.6.5 提交和回退对表的改变 29212.7 在测试之后修改窗体或者...
1246.2.3 在多个字段上排序数据 1256.2.4 删除表排序次序和解冻列 1256.3 查找表中的匹配记录 1266.4 自动地替换匹配的字段值 1276.5 筛选表数据 1286.5.1 按选定内容筛选 1286.5.2 按窗体筛选 1306.5.3 高级筛选和...