一、问题发生的场景

把文本中大写转成小写,小写转成大写,空格转成下划线,在输入到文件中覆盖之前的

前面的没有问题,问题出现在后面的覆盖文件上,输入流、输出流要操作同一个文件的问题

二、问题操作

//口述一下,
//头就创建一个文件输入流对象,紧接着创建一个文件输出流对象,问题就在这里,后面是调用各流的读写方法
//调试:发现read()方法首次读取就是返回-1,说明遇到了文件末尾,也说明此时文件时空的
//运行结果:文件被置空了,原来的内容没了,也没有写入内容进去
public void wordCase(String path){
try(//------①
FileReader fr = new FileReader(path);//------②
FileWriter fw = new FileWriter(path))//------③
{
System.out.println(new File(path).length());
//记录读取到的字符
StringBuilder sb = new StringBuilder();
int hasRead = 0;
while((hasRead = fr.read()) != -1){
char c = (char)hasRead;
//转空格
if(c == ' '){
sb.append("_");
}
System.out.println(c);
//判断是否是小写
if(Character.isLowerCase(c)){
//转换成大写并加入字符串
sb.append(Character.toUpperCase(c));
}else{
//转换成小写并加入字符串
sb.append(Character.toLowerCase(c));
}
}
//将新字符串内容写入文件
fw.write(sb.toString());
}catch(IOException e){
e.printStackTrace();
}
}

三、分析原因

查找了一些资料,总结一下:

输入流资源未关闭的情况下又开启了输出流,去操作同一个路径的文件,引发了冲突;单步调试:看上面代码的标注,从①开始运行-->②-->①-->③-->①-->下面... ,而且我在运行完②③时都查看了本地文本,发现在第③步运行完后,文件内容被置空;

由此我推测,在运行到②时,输入流获取了文件资源;而后运行到③时,输出流获取不到资源,又没抛出FileNotFoundException,应该是没有访问权限或者访问受限了,进而直接生成了一个文件对原文件进行了替换,所以使得文件置空,而获取了文件资源的输入流再来读取文件内容就为空了,从而写出的也是空内容,最终出现文件置空的情况

四、纠错

老老实实做事,先读取完内容,再进行写出操作:

//测试方法:略...
public void wordCase(String path){
StringBuilder sb = null;
/*读取文件内容,并保存成字符串*/
try(
FileReader fr = new FileReader(path))
{
System.out.println(new File(path).length());
//记录读取到的字符
sb = new StringBuilder();
int hasRead = 0;
while((hasRead = fr.read()) != -1){
char c = (char)hasRead;
//转空格
if(c == ' '){
sb.append("_");
}
System.out.println(c);
//判断是否是小写
if(Character.isLowerCase(c)){
//转换成大写并加入字符串
sb.append(Character.toUpperCase(c));
}else{
//转换成小写并加入字符串
sb.append(Character.toLowerCase(c));
}
}
}catch(IOException e){
e.printStackTrace();
}
/*将新字符串内容写入文件*/
try(
FileWriter fw = new FileWriter(path))
{
fw.write(sb.toString());
}catch(IOException e){
e.printStackTrace();
}
}

五、最后

老司机带带我,了解的前辈来发表一下见解,小白学习一下~

java输入输出流操作同一资源实现覆盖引发冲突的解析的更多相关文章

  1. Java基础之文件的输入输出流操作

    在介绍输入输出流之前,首先需要了解如何创建文件,创建文件夹以及遍历文件夹等各种操作,这里面不在一一介绍,主要介绍的是文件的输入输出流操作. 在起初学习文件操作之前,总是喜欢将输入输出弄混淆,后来通过看 ...

  2. 深入理解Java输入输出流

    Java.io包的File类,File类用于目录和文件的创建.删除.遍历等操作,但不能用于文件的读写. Java 对文件的写入和读取涉及到流的概念,写入为输出流,读取为输入流.如何理解流的概念呢?可以 ...

  3. Java输入/输出流体系

    在用java的io流读写文件时,总是被它的各种流能得很混乱,有40多个类,理清啦,过一段时间又混乱啦,决定整理一下!以防再忘 Java输入/输出流体系 1.字节流和字符流 字节流:按字节读取.字符流: ...

  4. Java 输入输出流 转载

    转载自:http://blog.csdn.net/hguisu/article/details/7418161 1.什么是IO Java中I/O操作主要是指使用Java进行输入,输出操作. Java所 ...

  5. java输入输出流总结 转载

    一.基本概念 1.1 什么是IO?     IO(Input/Output)是计算机输入/输出的接口.Java中I/O操作主要是指使用Java进行输入,输出操作.     Java所有的I/O机制都是 ...

  6. Java输入输出流(转载)

    转自http://blog.csdn.net/hguisu/article/details/7418161 目录(?)[+] 1.什么是IO Java中I/O操作主要是指使用Java进行输入,输出操作 ...

  7. 转 Java输入输出流详解(非常详尽)

    转  http://blog.csdn.net/zsw12013/article/details/6534619 通过数据流.序列化和文件系统提供系统输入和输出. Java把这些不同来源和目标的数据都 ...

  8. java输入输出流(I/O)总结

    io流的 四个基本类 java.io包中包含了流式I/O所需要的所有类.在java.io包中有四个基本类:InputStream.OutputStream及Reader.Writer类,它们分别处理字 ...

  9. Java输入输出流详解

    通过数据流.序列化和文件系统提供系统输入和输出. Java把这些不同来源和目标的数据都统一抽象为数据流.Java语言的输入输出功能是十分强大而灵活的,美中不足的是看上去输入输出的代码并不是很简洁,因为 ...

随机推荐

  1. 细看Java序列化机制

    概况 在程序中为了能直接以 Java 对象的形式进行保存,然后再重新得到该 Java 对象,这就需要序列化能力.序列化其实可以看成是一种机制,按照一定的格式将 Java 对象的某状态转成介质可接受的形 ...

  2. stress施压案例分析——cpu、io、mem【命令分析】

    stress施压命令分析 一.stress --cpu 1 --timeout 600  分析现象?负载为啥这么高?top命令查看用户进程消耗的cpu过高(stress进程消耗的) 分析现象,可以看出 ...

  3. makefile中的变量赋值

    在makefile中赋值方式有:'='.':='.'?='和'+='. A = a $(B) B = b all: echo $(A) #运行结果:echo a b a b 这种赋值方式是没有先后顺序 ...

  4. jenkins使用(3)-设置定时任务

    配置时间如果错误,代码不会运行 *表示任意时刻

  5. TNS-04612: "orcl--117-118" 的 RHS 为空

    安装数据库时,TNS-04612: "orcl--117-118" 的 RHS 为空 解决办法: 把 D:\app\xxx\product\11.2.0\dbhome_1\NETW ...

  6. OCR:慧眼读世界

    作者:微软亚洲研究院首席研究员 霍强 把手机摄像头对准菜单上的法语菜名,屏幕上实时显示出翻译好的中文菜名:将全世界图书馆的藏书转化为电子书:街景车游走于大街小巷,拍摄街景的同时也从街景图像中自动提取文 ...

  7. maven工程根项目运行ok但是子项目就报错的解决办法

    正常启动没错 项目出现问题 maven工程根项目运行ok但是子项目就报错 报错信息是xxxx没有创建 解决办法 原来是子项目的依赖少了  没有配置1.8  所以会出现莫明其妙的bug

  8. Luogu_2434_[SDOI2005]区间

    题目描述 现给定n个闭区间[ai, bi],1<=i<=n.这些区间的并可以表示为一些不相交的闭区间的并.你的任务就是在这些表示方式中找出包含最少区间的方案.你的输出应该按照区间的升序排列 ...

  9. JMeter之BeanShell断言---equals使用

    判断变量是否为root if(!"${User}".equals("root")){ Failure=true; FailureMessage="ER ...

  10. Nginx部署前后端分离服务

    飘过... 一,安装Nginx 二,配置nginx 一般nginx配置文件在etc目录下 另,如何找nginx.conf配置文件: 在前后端分离端项目里,前端的代码会被打包成为纯静态文件.使用 Ngi ...