2 gdut lyy GDUT_Lyy 于 2016.03.24 22:06 提问

求助一个关于FileInputStream跟FileOutputStream的问题

当FileInputStream跟FileOutputStream的路径相同时,会把文件的内容清空,这是为什么?代码如下,a.txt的内容被清空了

import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class Test {
public static void main(String[] args) throws IOException{
FileInputStream in = new FileInputStream("a.txt");
FileOutputStream out = new FileOutputStream("a.txt");
ByteArrayOutputStream bos = new ByteArrayOutputStream();
int b;
while((b = in.read()) != -1){
bos.write(b);
}
out.write(bos.toByteArray());
in.close();
out.close();
bos.close();
System.out.println("成功");
}
}

3个回答

wjsgtxy
wjsgtxy   2016.03.24 22:33

改成 FileOutputStream out = new FileOutputStream("a.txt",true); 试一试,不加true是默认清空的,加了true是追加模式

GDUT_Lyy
GDUT_Lyy 我又试了下你的方法,发现a.txt里面的内容没清空,但是内容翻倍了,楼下的是正解
一年多之前 回复
wojiushiwo945you
wojiushiwo945you 回复GDUT_Lyy: 跟顺序有关系的,输入流没关闭,又执行写操作了。
一年多之前 回复
GDUT_Lyy
GDUT_Lyy 还是不行,还是被清空了,这个应该跟在开头还是末尾添加无关吧,我本来预期的结果是保持不变的,但是却被清空了
一年多之前 回复
wojiushiwo945you
wojiushiwo945you   Ds   Rxr 2016.03.25 08:21

你这段代码,本质上是先读取文件信息存入到ByteArrayOutputStream,然后将读取的内容写入文件中。
所以需要注意这个顺序,先都完成后关闭输入流,再写入。因为你输入流关闭之前,又执行写操作,导致混乱了。
修正下代码如下:就能保持文件内容不变了:

 public class Test {
    public static void main(String[] args) throws IOException {
        //先读取文件输入流信息
        FileInputStream in = new FileInputStream("src/x/a.txt");
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        int b;
        while ((b = in.read()) != -1) {
            bos.write(b);
        }
        in.close();

        //再写入文件输出流中
        FileOutputStream out = new FileOutputStream("src/x/a.txt",false);
        out.write(bos.toByteArray());
        bos.close();
        out.close();
        System.out.println("成功");
    }
}

GDUT_Lyy
GDUT_Lyy 回复毕小宝: 我去查了下资料,FileOutputStream out = FileOutputStream("a.txt");是从文件开头添加内容,覆盖原来的内容,但是并没有删除
一年多之前 回复
GDUT_Lyy
GDUT_Lyy 回复毕小宝: 你的方法我试了是可以得到预期结果的,但是不知道我的理解对不对
一年多之前 回复
GDUT_Lyy
GDUT_Lyy 回复毕小宝: FileInputStream in = new FileInputStream("a.txt"); //打开a.txt FileOutputStream out = new FileOutputStream("a.txt");//打开a.txt并把a.txt的内容清空,所以下面的dos的内容一直是空的
一年多之前 回复
GDUT_Lyy
GDUT_Lyy 回复毕小宝: 应该是先删除原文件再进行处理吧,因为要是先处理再删除的话我上面的代码里的dos的内容就不为空了。
一年多之前 回复
wojiushiwo945you
wojiushiwo945you 默认append=false,输出流先存到一个临时文件,处理完成后删除原文件,然后renameTo ,所以你的文件都是新建的空文件了。
一年多之前 回复
CSDNXIAOD
CSDNXIAOD   2016.03.30 11:22

FileOutputStream&FileInputStream
----------------------biu~biu~biu~~~在下问答机器人小D,这是我依靠自己的聪明才智给出的答案,如果不正确,你来咬我啊!

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!