最近公司在做一个项目其中一个需求是读取文件中的特殊字符在其后进行添加或删除字符操作,本来想直接使用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://blog.csdn.net/Caide3/article/details/81947569

最新文章

  1. C#析构函数与垃圾回收
  2. CentOS7下安装soaplib
  3. Android -- 重设字符并统计原字符以及修改字符的长度以及位置
  4. 在Eclipse中查看JDK类库的源代码
  5. Frogs' Neighborhood
  6. 配置Rip的认证
  7. 推荐最近使用的一个APP
  8. Ubuntu环境下手动配置HBase0.94.25
  9. c语言 while (~scanf("%d%d",&n,&m)) 在这里这个符号“~”是什么意思
  10. 简单ESB的服务架构
  11. linux虚拟文件系统2
  12. 常用oracle语句-------------------------------------------》(笔记)
  13. 重新认识JavaScript
  14. 关于理解python类的小题
  15. 在ASP.NET 中检测手机浏览器(转)
  16. VS打开项目或解决方案卡死,一直处于未响应状态。
  17. 如何查看linux中文件打开情况
  18. JavaWeb学习 (二十六)————监听器(Listener)学习(二)
  19. Codeforces 526F Pudding Monsters - CDQ分治 - 桶排序
  20. Doxygen自动文档生成工具在Eclipse中的集成及使用举例

热门文章

  1. 关于haar特征的理解及使用(java实现)
  2. 第5篇 Scrum 冲刺博客
  3. 23种设计模式 - 对象性能(Singleton - Flyweight享元)
  4. 前端用vue怎么接收并导出文件
  5. python3笔记-读取ini配置文件
  6. java的方法详解和总结
  7. Visual Studio编译Core程序部署到linux
  8. 转载过来的参考内容---常规36个WEB渗透测试漏洞描述及修复方法----很详细
  9. linux 文件系统和磁盘
  10. 发布jar包到服务器读取resource目录下文件