当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("成功");
}
}