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里面的内容没清空,但是内容翻倍了,楼下的是正解
2 年多之前 回复
wojiushiwo945you
wojiushiwo945you 回复GDUT_Lyy: 跟顺序有关系的,输入流没关闭,又执行写操作了。
2 年多之前 回复
GDUT_Lyy
GDUT_Lyy 还是不行,还是被清空了,这个应该跟在开头还是末尾添加无关吧,我本来预期的结果是保持不变的,但是却被清空了
2 年多之前 回复
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");是从文件开头添加内容,覆盖原来的内容,但是并没有删除
2 年多之前 回复
GDUT_Lyy
GDUT_Lyy 回复毕小宝: 你的方法我试了是可以得到预期结果的,但是不知道我的理解对不对
2 年多之前 回复
GDUT_Lyy
GDUT_Lyy 回复毕小宝: FileInputStream in = new FileInputStream("a.txt"); //打开a.txt FileOutputStream out = new FileOutputStream("a.txt");//打开a.txt并把a.txt的内容清空,所以下面的dos的内容一直是空的
2 年多之前 回复
GDUT_Lyy
GDUT_Lyy 回复毕小宝: 应该是先删除原文件再进行处理吧,因为要是先处理再删除的话我上面的代码里的dos的内容就不为空了。
2 年多之前 回复
wojiushiwo945you
wojiushiwo945you 默认append=false,输出流先存到一个临时文件,处理完成后删除原文件,然后renameTo ,所以你的文件都是新建的空文件了。
2 年多之前 回复
CSDNXIAOD
CSDNXIAOD   2016.03.30 11:22

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

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
FileInputStream 和FileOutputStream
/*(FileInputStream 和FileOutputStream)利用FileInputStream 和FileOutputStream,完成 下面的要求: 1) 用FileOutputStream 在当前目录下创建一个文件“test.txt”,并向文件输出“Hello World”,如果文件已存在,则在原有文件内容后面追加。 2) 用FileInputStream 读入test.
用FileInputStream和FileOutputStream拷贝文件
在E:\JavaIO中新建abc.txt文件,并在里面写上一些文字。现在要做的是,在Eclipse里面用FileInputStream和 FileOutputStream的read()和write()方法,实现,abc.txt文件的拷贝新建IOUitl.java,代码如下: import java.io.File; import java.io.FileInputStream; impor
用FileInputStream和FileOutPutStream读写文件
用FileInputStream和FileOutPutStream读写文件   用FileInputStream和FileOutPutStream读写文件 package io; import java.io.BufferedOutputStream; import java.io.DataOutputStream; import java.io.Fil
FileOutputStream和FileInputStream的构造方法
package com.dengwen8; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; public class IOTest { /** * Which two construct an OutputSream that append
FileOutputStream和FileInputStream
操作图片数据,需要用到字节流 FileOutputStream FileInputStream public class FileStream { public static void writeFile() throws Exception { //创建一个字节流的输出流对象 FileOutputStream fos = new File
FileInputStream FileOutputStream
String path=context.getFilesDir().getPath();//应用的路径 //String sdpathString=Environment.getExternalStorageDirectory().getPath();//sd卡的路径 写数据 String result=username+"##"+password; String path=conte
FileInputStream的读取和FileOutputStream的写入
package day08; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; public class I_copydemo { /**使用文件字节输入流FIS与文件字节输出流FOS * 实现文件的复制操作 * @param args * @
FileInputStream和FileOutputStream应用实例
复制文件FileStreamDemo.java的内容至文件file.txt文件,并显示输出 file.txt文件内容 package sky;import java.io.*;public class FileStreamDemo...{    public static void main(String[] args)...{        try...{            by
FileInputStream和FileOutputStream
FileInputStream 用于顺序访问本地文件,用于读取诸如图像数据之类的原始字节流,从超类InputStream中继承了read,close等方法,对文件进行操作,不支持方法和方法.它的两个常用的构造方法是:                                   FileInputStream(String filepath/*文件的全称路径*/);    FileInput
FileInputStream and FileOutputStream
import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException;public class FileTest { /**  * @param args  * @throws IOException  */ public static void m