Java io实现读取文件特殊内容进行替换

最近公司在做一个项目其中一个需求是读取文件中的特殊字符在其后进行添加或删除字符操作,本来想直接使用randomAccessFile按行读取,读取到特殊字符就进行添加或删除操作,但是randomAccessFile会覆盖后边的内容,虽然可以使用临时文件的方式解决,但是感觉很古怪,权衡之后用如下方式实现:

public static void delAccessNumber(File source, File dest,String str){
     logger.info("进入IvrManageController.addAndDelAccessNumber()...方法");
     FileInputStream fis=null;
     InputStreamReader isr=null;
     BufferedReader bReader=null;
     OutputStreamWriter osw=null;
     FileOutputStream fos=null;
     BufferedWriter bWriter=null;
     try {
         String line;
         StringBuffer stringBuffer ;
         fis=new FileInputStream(source);//定义输入文件
         fos=new FileOutputStream(dest);//定义输出文件
         isr=new InputStreamReader(fis,"gb2312");//读取输入文件
         osw=new OutputStreamWriter(fos,"gb2312");//写入输入文件
         bReader=new BufferedReader(isr);//读取缓冲区
         bWriter=new BufferedWriter(osw);//写入缓存区
         while((line=bReader.readLine())!=null){ //按行读取数据
             if(line.indexOf("OnLineBList &")>0 || line.indexOf("ReturnBList &")>0) {
                 int pos = line.indexOf("\"|");
                 line=new StringBuffer(line).delete(pos+1,pos+2+str.length()).toString();
                 System.out.println(line);//输出拼接结果
                 bWriter.write(line);//将拼结果按行写入出入文件中
                 bWriter.newLine();
             }else{
                 bWriter.write(line);
                 bWriter.newLine();
             }
         }
     } catch (FileNotFoundException e) {
         logger.error("找不到文件",e);
     }catch (IOException e) {
         logger.error("读取文件失败",e);
     }finally{
         try {
             bReader.close();//关闭读取缓冲区
             isr.close();//关闭读取文件内容
             fis.close();//关闭读取文件
             bWriter.close();//关闭写入缓存区
             osw.close();//关闭写入文件内容
             fos.close();//关闭写入文件
         } catch (IOException e) {
             logger.error("关闭文件流失败!",e);
         }
     }
 }

注意:不能多次读写同一文件 

randomAccessFile使用临时文件方式

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.RandomAccessFile;

public class InsertContent {
    public static void insert(String fileName, long pos, String insertContent) throws IOException{
        File file = File.createTempFile("tmp", null);
        file.deleteOnExit();
        RandomAccessFile raf = new RandomAccessFile(fileName, "rw");
        FileInputStream fileInputStream = new FileInputStream(file);
        FileOutputStream fileOutputStream = new FileOutputStream(file);
        raf.seek(pos);
        byte[] buff = new byte[64];
        int hasRead = 0;
        while((hasRead = raf.read(buff)) > 0){
            fileOutputStream.write(buff);
        }
        raf.seek(pos);
        raf.write(insertContent.getBytes());
        //追加文件插入点之后的内容
        while((hasRead = fileInputStream.read(buff)) > 0){
            raf.write(buff, 0, hasRead);
        }
        raf.close();
        fileInputStream.close();
        fileOutputStream.close();
    }
    public static void main(String[] args) throws IOException {
        insert("F:\AttendanceActivity.java", 57, "插入的内容rn");
    }
}

https://segmentfault.com/a/1190000007845780

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值