一、问题发生的场景

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

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

二、问题操作

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

三、分析原因

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

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

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

四、纠错

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

  1. //测试方法:略...
  2. public void wordCase(String path){
  3. StringBuilder sb = null;
  4. /*读取文件内容,并保存成字符串*/
  5. try(
  6. FileReader fr = new FileReader(path))
  7. {
  8. System.out.println(new File(path).length());
  9. //记录读取到的字符
  10. sb = new StringBuilder();
  11. int hasRead = 0;
  12. while((hasRead = fr.read()) != -1){
  13. char c = (char)hasRead;
  14. //转空格
  15. if(c == ' '){
  16. sb.append("_");
  17. }
  18. System.out.println(c);
  19. //判断是否是小写
  20. if(Character.isLowerCase(c)){
  21. //转换成大写并加入字符串
  22. sb.append(Character.toUpperCase(c));
  23. }else{
  24. //转换成小写并加入字符串
  25. sb.append(Character.toLowerCase(c));
  26. }
  27. }
  28. }catch(IOException e){
  29. e.printStackTrace();
  30. }
  31. /*将新字符串内容写入文件*/
  32. try(
  33. FileWriter fw = new FileWriter(path))
  34. {
  35. fw.write(sb.toString());
  36. }catch(IOException e){
  37. e.printStackTrace();
  38. }
  39. }

五、最后

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

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. python循环删除list中的元素

    直接上例子: a = [1,2,3,4,5,6] for i in a: a.remove(i) print(a) 返回:[2, 4, 6] 循环a,想删除a的所有元素,但实际确有数据保留了下来,这是 ...

  2. IOC @Autowired/@Resource/@Qulified的用法实例

    首先要知道另一个东西,default-autowire,它是在xml文件中进行配置的,可以设置为byName.byType.constructor和autodetect:比如byName,不用显式的在 ...

  3. .net和JAVA面向对象,继承有趣的细节

    原型是同事间讨论的一道面试题.估计这题秒杀了不少人,LZ也被秒了. 但这个题里隐藏了一个很有趣的细节,这个细节不说清楚,不少人会其实死的冤枉. 这是C#的代码. class Program { sta ...

  4. SpringMVC学习笔记三:Controller的返回值

    springMVC的返回值有ModelAndView,String,void,Object类型 项目目录树: 该项目是在前面项目的基础上修改的,这里的pom.xml文件需要加入使用到的包,应为@Res ...

  5. 上传第三方jar包到nexus

    1.创建一个新的repository存放第三方jar包(3rd_party) 2.执行以下命令进行上传:切记需要上传的本地jar包路径不能在本地仓库下,可以随便放一个位置.(以下标红的,请根据自己情况 ...

  6. idea如何打包项目(java)

    1.右击项目打开open module settings 2.依次打开 3.选择你的程序主入口 JAR files from libraies ①和设置库中的jar文件选择第一个打包时会把依赖库(li ...

  7. pandas入门(一):pandas的安装和创建

    pandas 对于数据分析的人员来说都是必须熟悉的第三方库,pandas 在科学计算上有很大的优势,特别是对于数据分析人员来说,相当的重要.python中有了Numpy ,但是Numpy 还是比较数学 ...

  8. 改变生活的移动计算——感受 MobiSys 2015

    MobiSys 2015" title="改变生活的移动计算--感受 MobiSys 2015"> 作者:微软亚洲研究院研究员 张健松 今年的MobiSys会议地点 ...

  9. python自动化测试技术-Allure

    文末有源码 大部分人可能做的是爬虫和web,数据分析方面的工作,今天分享个在自动化测试领域python能做什么样的事情,比如下方,是用python+pytest+allure生成的精美自动化测试报告, ...

  10. 关于struct stat

    需要使用struct stat 类型时如果编译不过,修改Makefile: ##CFG_INC := -I$(MPI_DIR)/api/so/##CFG_INC += -I$(BASE_DIR)/pu ...