输入输出流操作同一个文件的问题及解决办法
1、问题场景
由于需要对文本文件的部分内容进行更新操作,具体操作是需要先将文本文件内容读取出来,暂以字符串形式保存,然后进行匹配替换,并将字符串重新写入原文本文件中。
2、代码规划
规划使用BufferedReader进行读取,使用PrintWriter进行写入操作
BufferedReader br = null;
PrintWriter pw = null;
StringBuilder sqlMapConf = new StringBuilder();
try {
File sqlMapConfFile = new File(sqlMapConfPath, name);
br = new BufferedReader(new InputStreamReader(
new FileInputStream(sqlMapConfFile), “UTF-8”));
pw = new PrintWriter(sqlMapConfFile,“UTF-8”);
String str = “”;
while ((str = br.readLine())!=null) {
sqlMapConf.append(str+"\r\n");
}
str = sqlMapConf.toString().replaceFirst("\sqlMap映射文件\", config);
pw.write(str);
System.out.println(str);
} catch (FileNotFoundException e) {
throw new RuntimeException(name+“文件未找到!”);
} catch (IOException e) {
e.printStackTrace();
throw new RuntimeException(name+“文件IO处理异常!”);
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException(name+“文件处理出现未知异常!”);
}finally {
if (pw!=null) {
pw.close();
}
if (br!=null) {
try {
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
3、问题现象
测试时发现,原文本文件内容会被清空,且未有内容写入,也无异常报错信息
4、分析推测
通过分析推测,输入流未关闭的情况下,输出流操作同一路径文件,会造成冲突,输入流会认为该文件不存在并重新创建同名文件覆盖原文件,而后输入流实际读取的是一个空文件,那么输出流写入的内容也为空,最后造成文件内容置空的现象。
5、错误纠正
在输入流操作完该文件后,输出流再进行文件操作,代码纠正如下:
BufferedReader br = null;
PrintWriter pw = null;
StringBuilder sqlMapConf = new StringBuilder();
try {
File sqlMapConfFile = new File(sqlMapConfPath, name);
br = new BufferedReader(new InputStreamReader(
new FileInputStream(sqlMapConfFile), “UTF-8”));
// pw = new PrintWriter(sqlMapConfFile,“UTF-8”);
String str = “”;
while ((str = br.readLine())!=null) {
sqlMapConf.append(str+"\r\n");
}
str = sqlMapConf.toString().replaceFirst("\sqlMap映射文件\", config);
pw = new PrintWriter(sqlMapConfFile,“UTF-8”);//纠正增加的代码
pw.write(str);
System.out.println(str);
} catch (FileNotFoundException e) {
throw new RuntimeException(name+“文件未找到!”);
} catch (IOException e) {
e.printStackTrace();
throw new RuntimeException(name+“文件IO处理异常!”);
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException(name+“文件处理出现未知异常!”);
}finally {
if (pw!=null) {
pw.close();
}
if (br!=null) {
try {
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 发现一个好看的手机壁纸网站,撸代码的手已经饥渴难耐了
- 还在为怎么学习Android苦恼?看完学会这些大牛资料,2年高级3年资深不是问题!
- 面试心得:一个BAT大厂面试者整理的Android面试题目,五轮面试后终于拿到Offer!
- 【Lighthouse教程】scrapy爬虫初探
- python 手把手教你基于搜索引擎实现文章查重
- Intellij IDEA 如何自动生成 serialVersionUID
- Spring事务是如何应用到你的业务场景中的?
- BFE.dev前端刷题#9. 解密消息 (Facebook面试题)
- JUnit 5 测试问题 must be static unless the test class is
- Intellij IDEA 如何自动生成 serialVersionUID
- 图解面试题:SQL存储过程有什么用?
- LeetCode-6.Z 字形变换 - 消费补偿算法
- python + redis 实现 分布式队列任务
- Git error: hint: Updates were rejected because the remote contains work that you do hint: not have l
- 500 行代码写一个俄罗斯方块游戏