`
Everyday都不同
  • 浏览: 723725 次
  • 性别: 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#打开二进制图片文件 读写并追加数据

    以上是关于“C#打开二进制图片文件读写并追加数据”的基本步骤和注意事项。实际应用中,还需要考虑错误处理、资源释放等细节,以确保程序的稳定性和安全性。在提供的压缩包文件"readWriteBinaryFile"中,可能包含了...

    利用Go语言追加内容到文件末尾

    此外,由于我们是在文件末尾追加数据,因此不会破坏现有的文件内容,确保了数据的完整性和连续性。 希望这篇教程能够帮助你在实际开发中解决类似问题。如果你在实践中遇到任何疑问或困难,请随时留言交流。愿你的...

    VC++在TXT文件指定位置追加内容的方法

    总的来说,VC++在TXT文件指定位置追加内容的方法涉及到文件操作的基本流程,包括打开、读取、修改和关闭文件。通过对标准C库函数的熟练运用,开发者可以轻松实现对文本文件的复杂操作。这个实例提供了基本的框架,...

    java中多种方式读文件,追加文件内容,对文件的各种操作

    这在需要跳过文件的一部分或在文件的特定位置写入数据时非常有用。 ```java RandomAccessFile raf = new RandomAccessFile(fileName, "r"); long position = 100L; // 跳到文件的第100个字节 raf.seek(position); ...

    codesys读取文件txt 百分百好使

    除了基本的读取操作,你还可以结合其他函数实现更复杂的文件操作,如搜索特定字符串、追加数据等。在实际应用中,你可能还需要处理错误,比如文件不存在或无法打开的情况。 博客链接提供了具体的示例代码和详细步骤...

    hex文件转bin格式支持追加crc到文件结尾

    在C语言中,实现HEX到BIN的转换可以使用标准I/O库,如`fopen`、`fgets`、`sscanf`来读取和解析HEX文件,以及`fwrite`来写入BIN文件。CRC计算则可能需要自定义的CRC函数,或者使用现成的库如`zlib`或`libcrc`。 总的...

    用C语言读写SGY格式的地震数据文件-苏.rar_C语言;读写SGY格式文件_sgy_sgy文件读取_sgy读写_读写sgy文件

    在本项目中,我们关注的是如何使用C语言来读取和写入这种特定格式的文件。C语言是一种底层、高效且灵活的编程语言,非常适合进行这样的底层数据操作。 首先,了解SGY文件的基本结构至关重要。SGY文件通常包含头信息...

    一个文件的读写例子

    `append()`模式("a")则会在文件末尾追加内容。例如,`file.write("Hello, World!")`会将字符串写入文件。 4. **关闭文件**:使用完文件后,应使用`close()`方法关闭它,确保数据被正确保存并释放系统资源。例如,...

    易语言TXT文本文件数据的添加修改删除例程

    如果要在原有内容基础上追加,可以使用“附加写入”模式打开文件: ```易语言 .文件句柄 = .文件打开("C:\example.txt", .写入) .写入文件(.文件句柄, "这是新数据") .文件关闭(.文件句柄) ``` 三、添加数据 在...

    实例224——在文件的指定位置存放和读取数据

    本实例“实例224——在文件的指定位置存放和读取数据”主要探讨了如何利用MFC来实现对文件的高级操作,即在文件的特定位置进行数据的写入和读取。这对于处理大型文件或者需要精确控制数据流的应用来说是至关重要的。...

    文本文件和二进制文件区别读写.rar

    在C语言中,读写文本文件主要使用`fopen()`函数以"r"(读)或"w"(写)模式打开文件,对于追加内容则使用"a"模式。`fgets()`和`fputs()`函数用于读写字符串,`scanf()`和`printf()`可以处理格式化的输入输出。而读写二...

    C ++文件读写

    `file.open("filename", mode, access)`,这里的`mode`参数可以设置打开文件的模式,如`ios::in`表示以输入方式打开,`ios::out`表示以输出方式打开,`ios::app`表示追加方式,`ios::ate`则会在打开文件后将位置指针...

    文件读取 文件读取C

    "文件读取 文件读取C"这个标题暗示我们将讨论如何在C语言环境下处理文件输入和输出(I/O)。C语言提供了标准库函数来实现文件操作,使得程序员能够读取、写入或追加文件内容。 首先,让我们关注描述中的"lib和...

    实例70读写文件.rar_写文件_文件读写_读写文件

    "a"模式则会在文件末尾添加新内容,不覆盖原有数据。 2. 写入数据:打开文件后,可以调用相关方法将文本或二进制数据写入文件。Python中,`write()`方法用于写入字符串,`writelines()`方法用于一次性写入多行文本...

    文件读写替换行

    本篇文章将详细介绍如何利用C#进行文件读写,并针对特定内容进行匹配和替换。 首先,让我们了解C#中的基本文件操作。`System.IO`命名空间提供了丰富的类用于文件和流的读写。其中,`File`类是最常用的一个,它包含...

    文件动态实时监测增量读取截取JDK1.7版本

    其中,`RandomAccessFile`类可以用来在文件的任意位置进行读写操作,而`FileInputStream`和`BufferedReader`则可以用于连续读取文件内容。通过结合这些类,开发者可以构建一个监听器,当文件大小发生变化时,捕获...

    读取打开txt文件程序(VB6.0代码编写)

    这在处理大型文件时非常有用,因为你可以跳过不需要的数据,直接读取特定位置的信息。 接下来是`Line Input #`函数,这是VB6.0中读取文本文件行的主要方法。它的语法为`Line Input #fileno, variable`,其中`fileno...

    文件扫描和读取

    在IT行业中,文件扫描和读取是常见的操作,特别是在软件开发和数据分析中。这个过程涉及到对指定文件夹的遍历,查找并读取特定类型的文件,以及将这些文件中的信息,如源代码,导出到新的文件中。在这个场景中,我们...

    C#读写文本文件(不会产生乱码)[初学者用]

    这里的`false`参数表示是否追加内容到文件,如果是`true`,则会在现有内容后添加,否则会覆盖原有内容。 四、避免乱码问题 1. 确定编码:在读取文件前,了解或检测文件的编码格式,避免使用错误的编码导致乱码。 2....

    MiniDemoCSV1_TwinCAT3读写CSV文件_twincat_bicyclef1q_

    【MiniDemoCSV1_TwinCAT3读写CSV文件_twincat_bicyclef1q_】是一个基于TwinCAT3的示例项目,它演示了如何在自动化编程中使用TwinCAT系统服务来读取和写入CSV(逗号分隔值)文件。TwinCAT3是Beckhoff公司开发的一种...

Global site tag (gtag.js) - Google Analytics