一、问题发生的场景

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

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

二、问题操作

//口述一下,
//头就创建一个文件输入流对象,紧接着创建一个文件输出流对象,问题就在这里,后面是调用各流的读写方法
//调试:发现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. HDU-1711-Number Sequence(KMP)(Rabin-Karp)

    Rabin-Karp Accepted 1711 904MS 5272K 1310 B G++ #include "bits/stdc++.h" using namespace s ...

  2. JVM笔记(二)

    内存分配1)对象的内存分配,往大的方向讲,就是在堆上分配2)对象优先在Eden分3)大对象直接进入老年代4)长期存活的对象进入老年代:对象在Survivor区每“熬过”一次Minor GC,年数加1, ...

  3. jquery.Table实现的翻页功能比较完整漂亮,本想扩展个模版DIV

    jquery.dataTable实现的翻页功能比较完整漂亮,本想提取其的翻页部分,再结合模版DIV,bootstrop实现聊天记息的展示. jquery.Table 与table结合的较紧,不能在很下 ...

  4. curl模拟

    header('content-type:text/html;charset=utf-8');function curlPost($url,$data,$method){ $ch = curl_ini ...

  5. 吴裕雄--天生自然KITTEN编程:拾金币

  6. 吴裕雄--天生自然KITTEN编程:对话

  7. Image图片

    # View more python tutorials on my Youtube and Youku channel!!! # Youtube video tutorial: https://ww ...

  8. 5.7之sql_model

    问题发生背景 今天在部署项目的时候发现,测试后台接口,直接报 500,仔细一看原来是操作数据库的时候报错了,在本地测试的时候是没遇到类似的问题,数据库的版本是一样的,后面查找资料,说是 MySQL 5 ...

  9. 你的胃能Hold住未来的食物吗?

    ​ 如果你是一名美食客,那么一定会发现现在越来越多的食物已经发生了翻天覆地的变化,很多食物正在以我们未知的形式出现在生活中,其中最大的莫过于分子美食.你想过吗?当食物发生改变的时候,你的胃是否能够Ho ...

  10. Docker深入浅出系列 | 单机Nginx+Springboot实战

    目录 Nginx+Springboot实战 前期准备 实战目标 实战步骤 创建Docker网络 搭建Mysql容器 搭建额度服务集群 搭建Nginx服务 验证额度服务 附录 Nginx+Springb ...