java输入输出流操作同一资源实现覆盖引发冲突的解析
一、问题发生的场景
把文本中大写转成小写,小写转成大写,空格转成下划线,在输入到文件中覆盖之前的
前面的没有问题,问题出现在后面的覆盖文件上,输入流、输出流要操作同一个文件的问题
二、问题操作
//口述一下,
//头就创建一个文件输入流对象,紧接着创建一个文件输出流对象,问题就在这里,后面是调用各流的读写方法
//调试:发现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输入输出流操作同一资源实现覆盖引发冲突的解析的更多相关文章
- Java基础之文件的输入输出流操作
		在介绍输入输出流之前,首先需要了解如何创建文件,创建文件夹以及遍历文件夹等各种操作,这里面不在一一介绍,主要介绍的是文件的输入输出流操作. 在起初学习文件操作之前,总是喜欢将输入输出弄混淆,后来通过看 ... 
- 深入理解Java输入输出流
		Java.io包的File类,File类用于目录和文件的创建.删除.遍历等操作,但不能用于文件的读写. Java 对文件的写入和读取涉及到流的概念,写入为输出流,读取为输入流.如何理解流的概念呢?可以 ... 
- Java输入/输出流体系
		在用java的io流读写文件时,总是被它的各种流能得很混乱,有40多个类,理清啦,过一段时间又混乱啦,决定整理一下!以防再忘 Java输入/输出流体系 1.字节流和字符流 字节流:按字节读取.字符流: ... 
- Java 输入输出流 转载
		转载自:http://blog.csdn.net/hguisu/article/details/7418161 1.什么是IO Java中I/O操作主要是指使用Java进行输入,输出操作. Java所 ... 
- java输入输出流总结 转载
		一.基本概念 1.1 什么是IO? IO(Input/Output)是计算机输入/输出的接口.Java中I/O操作主要是指使用Java进行输入,输出操作. Java所有的I/O机制都是 ... 
- Java输入输出流(转载)
		转自http://blog.csdn.net/hguisu/article/details/7418161 目录(?)[+] 1.什么是IO Java中I/O操作主要是指使用Java进行输入,输出操作 ... 
- 转  Java输入输出流详解(非常详尽)
		转 http://blog.csdn.net/zsw12013/article/details/6534619 通过数据流.序列化和文件系统提供系统输入和输出. Java把这些不同来源和目标的数据都 ... 
- java输入输出流(I/O)总结
		io流的 四个基本类 java.io包中包含了流式I/O所需要的所有类.在java.io包中有四个基本类:InputStream.OutputStream及Reader.Writer类,它们分别处理字 ... 
- Java输入输出流详解
		通过数据流.序列化和文件系统提供系统输入和输出. Java把这些不同来源和目标的数据都统一抽象为数据流.Java语言的输入输出功能是十分强大而灵活的,美中不足的是看上去输入输出的代码并不是很简洁,因为 ... 
随机推荐
- 细看Java序列化机制
			概况 在程序中为了能直接以 Java 对象的形式进行保存,然后再重新得到该 Java 对象,这就需要序列化能力.序列化其实可以看成是一种机制,按照一定的格式将 Java 对象的某状态转成介质可接受的形 ... 
- stress施压案例分析——cpu、io、mem【命令分析】
			stress施压命令分析 一.stress --cpu 1 --timeout 600 分析现象?负载为啥这么高?top命令查看用户进程消耗的cpu过高(stress进程消耗的) 分析现象,可以看出 ... 
- makefile中的变量赋值
			在makefile中赋值方式有:'='.':='.'?='和'+='. A = a $(B) B = b all: echo $(A) #运行结果:echo a b a b 这种赋值方式是没有先后顺序 ... 
- jenkins使用(3)-设置定时任务
			配置时间如果错误,代码不会运行 *表示任意时刻 
- TNS-04612: "orcl--117-118" 的 RHS 为空
			安装数据库时,TNS-04612: "orcl--117-118" 的 RHS 为空 解决办法: 把 D:\app\xxx\product\11.2.0\dbhome_1\NETW ... 
- OCR:慧眼读世界
			作者:微软亚洲研究院首席研究员 霍强 把手机摄像头对准菜单上的法语菜名,屏幕上实时显示出翻译好的中文菜名:将全世界图书馆的藏书转化为电子书:街景车游走于大街小巷,拍摄街景的同时也从街景图像中自动提取文 ... 
- maven工程根项目运行ok但是子项目就报错的解决办法
			正常启动没错 项目出现问题 maven工程根项目运行ok但是子项目就报错 报错信息是xxxx没有创建 解决办法 原来是子项目的依赖少了 没有配置1.8 所以会出现莫明其妙的bug 
- Luogu_2434_[SDOI2005]区间
			题目描述 现给定n个闭区间[ai, bi],1<=i<=n.这些区间的并可以表示为一些不相交的闭区间的并.你的任务就是在这些表示方式中找出包含最少区间的方案.你的输出应该按照区间的升序排列 ... 
- JMeter之BeanShell断言---equals使用
			判断变量是否为root if(!"${User}".equals("root")){ Failure=true; FailureMessage="ER ... 
- Nginx部署前后端分离服务
			飘过... 一,安装Nginx 二,配置nginx 一般nginx配置文件在etc目录下 另,如何找nginx.conf配置文件: 在前后端分离端项目里,前端的代码会被打包成为纯静态文件.使用 Ngi ... 
