求助一个关于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("成功");
}
}

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

你这段代码,本质上是先读取文件信息存入到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("成功");
    }
}