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

来源:互联网 发布:怎样找回以前淘宝店铺 编辑:程序博客网 时间:2024/05/20 20:19

文件中的插入一行字符目前没找到什么好方法,只能将数据读出来,然后在该插入的地方插入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

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 微信账号长时间未登录不想要怎么办 手机号注销了百度云登录不了怎么办 申请百度云账号的手机不用了怎么办 新注册的微信号显示账号异常怎么办 注册公众号说邮箱被占用了怎么办 向钱贷登录手机号换了怎么办 qq号绑定的手机号码换了怎么办 用手机号注册的支付宝换号了怎么办 支付宝转的账户手机号消号了怎么办 激活微信账号手机号写错了怎么办 大学试卷没有写名字和考号怎么办 公司被注销了公众号还想要怎么办 公司认证的公众号公司注销了怎么办 信而富注册手机号码不用了怎么办 信而富本时段额度已放完怎么办 知道qq号密码账号忘了怎么办 扣扣绑定的手机号被别人用了怎么办 我的手机号被别人绑定了快手怎么办 微信密码忘记了没绑定手机号怎么办 扣扣绑定银行卡忘记密码了怎么办 扣扣忘记密码了又换手机号了怎么办 微信订阅号里有删除后的信息怎么办 申请微信公众号邮箱已被占用怎么办 公众号验证没有对公账户怎么办 qq密码忘记了怎么办手机绑定没有 我的扣扣怎么申诉都找不回来怎么办 装修装的不好又没有签合同怎么办 日本免税的零食不小心拆了怎么办 闲鱼同意买家退货了买家不退怎么办 手机里淘宝钱付了不发货怎么办 百度云下载手机储存空间不足怎么办 苹果8的照片储存空间满了怎么办 为什么下载的软件已停止运行怎么办 苹果手机刷机忘记注册邮箱了怎么办 刺激战场模拟器注册已达上限怎么办 用模拟器玩刺激战场注册上限怎么办 微信解除实名认证后退款怎么办 苹果为什么qq收消息有延迟怎么办 qq忘记密码手机号也换了怎么办 扣扣空间圈人时照片服务错误怎么办 删了qq好友怎么找回来怎么办