文件中的插入一行字符目前没找到什么好方法,只能将数据读出来,然后在该插入的地方插入string后再写回去

[java]  
   view plain 
    copy 
   
 
   
 
 
1. /**
2.  * 在文件里面的指定行插入一行数据
3.  * 
4.  * @param inFile
5.  *            文件
6.  * @param lineno
7.  *            行号
8.  * @param lineToBeInserted
9.  *            要插入的数据
10.  * @throws Exception
11.  *             IO操作引发的异常
12.  */  
13. public static void insertStringInFile(File inFile, int lineno,  
14. throws Exception {  
15. // 临时文件  
16. "name", ".tmp");  
17.   
18. // 输入  
19. new FileInputStream(inFile);  
20. new BufferedReader(new InputStreamReader(fis));  
21.   
22. // 输出  
23. new FileOutputStream(outFile);  
24. new PrintWriter(fos);  
25.   
26. // 保存一行数据  
27.     String thisLine;  
28. // 行号从1开始  
29. int i = 1;  
30. while ((thisLine = in.readLine()) != null) {  
31. // 如果行号等于目标行,则输出要插入的数据  
32. if (i == lineno) {  
33.             out.println(lineToBeInserted);  
34.         }  
35. // 输出读取到的数据  
36.         out.println(thisLine);  
37. // 行号增加  
38.         i++;  
39.     }  
40.     out.flush();  
41.     out.close();  
42.     in.close();  
43.   
44. // 删除原始文件  
45.     inFile.delete();  
46. // 把临时文件改名为原文件名  
47.     outFile.renameTo(inFile);  
48.   
49. }

删除当然也可以像上面那样,但是如果文件比较大,那就是个工程了。

先看看下面的关于RandomAccessFile的seek

seek

public void seek(long pos) throws IOException

参数:

pos - 从文件开头以字节为单位测量的偏移量位置,在该位置设置文件指针。

抛出:

IOException - 如果 

pos 小于 

0 或者发生 I/O 错误。

说的很是让人迷糊。

下面就一个小例子说明你:

在项目目录下建一个test文件夹,在该文件夹中新建一个aa.txt的文件。在里面写上abcdefghijklmnopqrstuvwsyz

源文件内容如下(Main方法部分):

[java]  
      view plain 
       copy 
      
 
      
 
    
1. String basePath=System.getProperty("user.dir");  
2. String fileName="aa.txt";  
3. System.out.println(basePath);  
4. File file=new File(basePath+"/test", fileName);  
5. RandomAccessFile accessor=new RandomAccessFile(file, "rw");  
6. System.out.println("文件长度:"+accessor.length());  
7. accessor.seek(accessor.length());  
8. accessor.writeBytes("[First Add]");  
9. accessor.close();

程序执行结果为:

abcdefghijklmnopqrstuvwsyz[First Add]
 
 
   [java]  
   view plain 
    copy 
   
 
   
 
 
1. abcdefghijklmnopqrstuvwsyz[First Add]

现在修改一下程序:

[java]  
      view plain 
       copy 
      
 
      
 
    
1. String basePath=System.getProperty("user.dir");  
2. String fileName="aa.txt";  
3. System.out.println(basePath);  
4. File file=new File(basePath+"/test", fileName);  
5. RandomAccessFile accessor=new RandomAccessFile(file, "rw");  
6. System.out.println("文件长度:"+accessor.length());  
7. accessor.seek(3);  
8. accessor.writeBytes("[Second Add]");  
9. accessor.close();

程序运行结果为:

abc[Second Add]pqrstuvwsyz[First Add]

[java]  view plain  copy

  1. abc[Second Add]pqrstuvwsyz[First Add]  

比较两次结果我们可以得出以下的结论:

seek()方法是移动文件操作的指针的,而其参数就是位移量。

我们第一次将位移量设置为整个文件的长度,则指针指向了文件的末尾,我们向文件写入[First Add],则会出现在文件的结尾。

第二次,我们将位移量设置为3,则文件指针指向了第三个字符c的后面,我们向我文件写入[Second Add],则该文字出现在c的后方,同时覆盖掉了其所占位置的原来的字符。

这样如果是中间的文字,可以用空格符(或者其他无意义的字符)来进行一个替换。一个简单在第一行插入一个标识字符串。

[java]  
   view plain 
    copy 
   
 
   
 
 
1. public static void writeOffset(String name, String str) {    
2. new File(name);    
3.     
4. if (file == null || !file.exists()) {    
5. "file donest exist");    
6. return;    
7.     }    
8.     
9. if (str == null || str.length() <= 0) {    
10. return;    
11.     }    
12.     
13.     RandomAccessFile rf;    
14. try {    
15. new RandomAccessFile(file, "rw");    
16.     
17.     String line1 = rf.readLine();    
18.         
19. if(line1 != null && line1.startsWith("PrefixXXXXXXXX")) {    
20.      
21. //PrefixXXXXXXXX 的长度    
22. 13);    
23.         rf.write(str.getBytes());    
24.         rf.close();    
25. else{    
26.             
27.         rf.close();             
28. 1, "XXXXXXX");    
29.     }    
30.         
31. catch (FileNotFoundException e) {    
32.         e.printStackTrace();    
33. catch (IOException e) {    
34. // TODO Auto-generated catch block    
35.         e.printStackTrace();    
36. catch (Exception e) {    
37. // TODO Auto-generated catch block    
38.         e.printStackTrace();    
39.     }    
40.     
41. }

参考,http://yuanpan1987.iteye.com/blog/668204