IO流之FileWriter常见错误总结(经验教训)

IO流不可谓不熟,但是一旦自己动手写,总是会出一些莫名其妙的错,先看代码:

import java.io.*;

public class TestIO {
    public static int i = 0;

    public static void main(String[] args) throws IOException{
        
        FileReader fr = new FileReader("F://hello.txt");
        BufferedReader br = new BufferedReader(fr);
        String line = "";
        FileWriter fw = new FileWriter("F://ni.txt");   
        while((line = br.readLine()) != null){
            System.err.println(line);
            fw.write(line);
        }
        fr.close();
        br.close();
        
//      fw.close(); //关闭流 释放资源
        System.out.print("i == " + i);
        
    }
}

代码很容易理解,就是把hello.txt文件中的内容写到ni.txt文件中去,乍一看,代码没任何毛病,可是一运行:

13566833-6e94ea615bd4c8ca.png

发现竟然写入为空,怎么会这样子?发现把注释处取消,竟然就写入了!这是为什么呢?为什么不用FileWriter.flush()?两者有什么区别?我们先看代码:

import java.io.*;

public class TestIO {
    public static int i = 0;

    public static void main(String[] args) throws IOException{
        FileWriter fw = new FileWriter("F://ni.txt");   
        //调用write方法,将字符串写入到流中。
        fw.write("酒剑仙——莫一兮");
        
        //刷新流对象中的缓冲中的数据 将数据刷到目的地中
        fw.flush(); //取消注释 才可以写入到ni文件中 但后面write内容写不进去
        
        fw.write("酒剑仙是仙剑中我最喜欢的角色");
        
        FileReader fr = new FileReader("F://ni.txt");
        BufferedReader br = new BufferedReader(fr);
        String line = "";   
        while((line = br.readLine()) != null){
            System.err.println("ni文件内容为:"+"\n"+line);
        }
    }
}

代码注释处写的很明了,执行代码,发现第二句话并没有追加到文件中,所以FileWriter .close() 和FileWriter .flush()的区别如下:
new FileWriter()后,我们要执行write() 操作,将数据写入文本,但是这时的数据并没有写入文本,而是存在了计算机中的流中。而如果这是我们使用fw.flush()刷新操作时,是可以将存储在计算机流中的数据写入fw的,但是如果我们之后再write,该数据是写不进去的。

fw.close()是先刷新一次,然后关闭数据流。(事实上,close是包含了两步,flush 和close 这两步)。所以我们可以注释掉flush(),因为在这里一个close()语句就够用了。
flush 刷新后,流可以继续使用,close刷新后,会将流关闭。

需要注意的是:
FileWriter.write()是覆盖写入,如果我们只想要追加,可以这样:

public static void main(String[] args) throws IOException{
        FileWriter fw = new FileWriter("F://ni.txt",true);  
        //调用write方法,将字符串写入到流中。
        fw.write(" 追加操作 而非覆盖");
        fw.close(); //
        
        FileReader fr = new FileReader("F://ni.txt");
        BufferedReader br = new BufferedReader(fr);
        String line = "";   
        while((line = br.readLine()) != null){
            System.err.println("ni文件内容为:"+"\n"+line);
        }   
    }

13566833-880bf41a1238afc9.png

追加写入也可用RandomAccessFile方法,代码:

import java.io.*;

public class TestIO {
    public static int i = 0;

    public static void main(String[] args) throws IOException{
//      FileWriter fw = new FileWriter("F://ni.txt",true);  
//      //调用write方法,将字符串写入到流中。
//      fw.write(" 追加操作 而非覆盖");
//      fw.close(); //
        appendMethodA("F://ni.txt","陪你步入蝉夏 跃过城市喧嚣");
        
        FileReader fr = new FileReader("F://ni.txt");
        BufferedReader br = new BufferedReader(fr);
        String line = "";   
        while((line = br.readLine()) != null){
            System.err.println("ni文件内容为:"+"\n"+line);
        }   
    }
    
    
     /**
     * 追加文件:使用RandomAccessFile
     */
    public static void appendMethodA(String fileName, String content) {
        try {
            // 打开一个随机访问文件流,按读写方式
            RandomAccessFile randomFile = new RandomAccessFile(fileName,"rw");
            // 文件长度,字节数
            long fileLength = randomFile.length();
            //将写文件指针移到文件尾。在该位置发生下一个读取或写入操作。
            randomFile.seek(fileLength);
           
//            randomFile.writeBytes(content);
            //按系统默认编码获取字符串的字节码 避免乱码
            randomFile.write(content.getBytes());   
  
            randomFile.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }   
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值