RandomAccessFile 文件的插入和删除一行文字

文件中的插入一行字符目前没找到什么好方法,只能将数据读出来,然后在该插入的地方插入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.         String lineToBeInserted) throws Exception {  
  15.     // 临时文件  
  16.     File outFile = File.createTempFile("name"".tmp");  
  17.   
  18.     // 输入  
  19.     FileInputStream fis = new FileInputStream(inFile);  
  20.     BufferedReader in = new BufferedReader(new InputStreamReader(fis));  
  21.   
  22.     // 输出  
  23.     FileOutputStream fos = new FileOutputStream(outFile);  
  24.     PrintWriter out = 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.     File file = new File(name);    
  3.     
  4.     if (file == null || !file.exists()) {    
  5.         Log.d(TAG, name + "file donest exist");    
  6.         return;    
  7.     }    
  8.     
  9.     if (str == null || str.length() <= 0) {    
  10.         return;    
  11.     }    
  12.     
  13.     RandomAccessFile rf;    
  14.     try {    
  15.         rf = new RandomAccessFile(file, "rw");    
  16.     
  17.     String line1 = rf.readLine();    
  18.         
  19.     if(line1 != null && line1.startsWith("PrefixXXXXXXXX")) {    
  20.      
  21.         //PrefixXXXXXXXX 的长度    
  22.         rf.seek(13);    
  23.         rf.write(str.getBytes());    
  24.         rf.close();    
  25.     }else{    
  26.             
  27.         rf.close();             
  28.         insertStringInFile(file, 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值