`
Everyday都不同
  • 浏览: 714612 次
  • 性别: Icon_minigender_1
  • 来自: 宇宙
社区版块
存档分类
最新评论

在文件的特定位置追加内容和读取文件特定内容

阅读更多

一、使用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语言专家教你一招搞定!.zip

    内容关键词:读取文件、写入文件、追加内容、文件管理、代码示例 用途:在软件开发和数据处理中,对文件的读写操作是基本且重要的技能。掌握C语言的文件IO操作对于进行数据存储、配置加载、日志记录等任务至关重要。...

    C语言文件读写操作.rar

    在C语言中,进行文件读写操作通常涉及使用标准库函数如fopen, fprintf, fscanf, fgets, fputs, fclose等...此外,对于更复杂的操作,比如追加内容、处理二进制数据、读取特定格式的数据等,还需要使用其他函数和技巧。

    如何编写批处理文件批处理文件批处理文件

    skip=n - 指在文件开始时忽略的行数。 delims=xxx - 指分隔符集。这个替换了空格和跳格键的 默认分隔符集。 tokens=x,y,m-n - 指每行的哪一个符号被传递到每个迭代 的 for 本身。这会导致额外变量名称的 格式为一...

    gnu_makefile文档pdf html

    3.1Makefile文件的内容 3.2Makefile文件的命名 3.3包含其它的Makefile文件 3.4变量MAKEFILES 3.5Makefile文件重新生成的过程 3.6重载其它Makefile文件 3.7make读取Makefile文件的过程 4 编写规则 4.1规则的...

    cotar:云优化的焦油

    这使得将新文件添加到存档非常容易,因为移动文件可以追加到末尾,但是这使得不可能进行随机读取,因为必须读取每个文件头,直到找到所需的特定文件为止。 TAR索引(.tar.index)是一个JSON文档,其中包含tar文件...

    入门学习Linux常用必会60个命令实例详解doc/txt

    要访问CD-ROM上的文件,需要将CD-ROM设备挂装在文件树中的某个挂装点。如果发行版安装了自动挂装包,那么这个步骤可自动进行。在Linux中,如果要使用硬盘、光驱等储存设备,就得先将它加载,当储存设备挂上了之后,...

    cmd操作命令和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最新注册版

    通过使用Serv-U,用户能够将任何一台PC 设置成一个FTP 服务器,这样,用户或其他使用者就能够使用FTP 协议,通过在同一网络上的任何一台PC与FTP 服务器连接,进行文件或目录的复制,移动,创建,和删除等。...

    Serv-U FTP Server v7.0.0.2

    + 当读取客户端正在下载的文件时,添加了使用浮动缓冲区大小的功能。浮动缓冲区大小取决于当前的传输率,这使得传输效率大大提高。 + 添加了目录重命名权限设置。 + 添加了文件重命名权限设置。 + 添加了 "\" 路径...

    Python-Fintech-蒙特卡洛-预测投资组合收益源码-需要一定网络条件

    想利用蒙特卡洛方法和yahoo,stooq等财经网站上的数据快速预测特定portfolio的收益。 整个程序的功能包括 读取json中的portfolio组合 创建蒙特卡洛模拟预测收益的算法 创建从财经网站获得特定投资组合数据,并根据2...

    C#全能速查宝典

    《C#全能速查宝典》共分为8章,分别介绍了C#语言基础、Windows窗体及常用控件、Windows高级控件、控件公共属性、方法及事件、数据库开发、文件、数据流与注册表、GDI+绘图技术和C#高级编程,共包含562个C#编程中常用...

    Java开发实战1200例(第1卷).(清华出版.李钟尉.陈丹丹).part3

    本书是第II卷,以开发人员在项目开发中经常遇到的问题和必须掌握的技术为中心,介绍了应用Java进行桌面程序开发各个方面的知识和技巧,主要包括Java语法与面向对象技术、Java高级应用、窗体与控件应用、文件操作...

    超实用的jQuery代码段

    6.9 拖动时动态更改鼠标的光标类型和位置 6.10 拖曳并放置到目标容器 6.11 限制可放置的元素 6.12 实现可拖放的购物车 6.13 可排序的拖放 6.14 在多个列表之间进行拖放 6.15 使用拖动方式选择多个元素 6.16 在两个...

    PetShop4.0宠物商店+系统架构设计+中文注释源码+PDF中文详解

    5、 由于PetShop只是一个演示程序,所以若对数据库操作的某一类别(如对Account进行操作)中定义的“操作类”不够用(如除了接口中定义的几个方法外还需要其他Account操作),还可以在接口中追加其他的方法,用以...

    Access 2000数据库系统设计(PDF)---002

    1246.2.3 在多个字段上排序数据 1256.2.4 删除表排序次序和解冻列 1256.3 查找表中的匹配记录 1266.4 自动地替换匹配的字段值 1276.5 筛选表数据 1286.5.1 按选定内容筛选 1286.5.2 按窗体筛选 1306.5.3 高级筛选和...

    Access 2000数据库系统设计(PDF)---018

    28912.6.1 窗体视图中的工具栏按钮 28912.6.2 使用Personnel Actions窗体 29012.6.3 向Personnel Actions表追加新记录 29012.6.4 编辑现有的数据 29212.6.5 提交和回退对表的改变 29212.7 在测试之后修改窗体或者...

    Access 2000数据库系统设计(PDF)---003

    1246.2.3 在多个字段上排序数据 1256.2.4 删除表排序次序和解冻列 1256.3 查找表中的匹配记录 1266.4 自动地替换匹配的字段值 1276.5 筛选表数据 1286.5.1 按选定内容筛选 1286.5.2 按窗体筛选 1306.5.3 高级筛选和...

Global site tag (gtag.js) - Google Analytics