使用IO流时遇到的一些小问题

一、FileWriter中文件内容的覆盖

在测试java.lang.IO包下的Wirter类时,发现了文件中内容的覆盖问题,以下以FileWriter类为例

 代码如下:

public class FileWriterTest {
    public static void main(String[] args) {
        String filePath="d:\\example03.txt";
        FileWriter fileWriter=null;
        try {
            fileWriter=new FileWriter(filePath);
            fileWriter.write("I am fine,thanks. 我很好,谢谢");
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                fileWriter.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        System.out.println("程序结束");
    }
}

在D盘下生成了一个“example03.txt”,内容与在代码中所输入的一致。

而当我想继续在已经生成的“example.txt”中输入一些其他的内容,如输入“Hello,world!问世!”

public class FileWriterTest {
    public static void main(String[] args) {
        String filePath="d:\\example03.txt";
        FileWriter fileWriter=null;
        try {
            fileWriter=new FileWriter(filePath);
           // fileWriter.write("I am fine,thanks. 我很好,谢谢");
            fileWriter.write("Hello,world!问世!");
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                fileWriter.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        System.out.println("程序结束");
    }
}

本以为会在原先的文件已有内容的基础上加上“Hello,world!问世!”这一句话,却没想之前的内容直接消失不见,只有后面输入的内容。

接下来我又尝试一次性写入两次的内容:

public class FileWriterTest {
    public static void main(String[] args) {
        String filePath="d:\\example03.txt";
        FileWriter fileWriter=null;
        try {
            fileWriter=new FileWriter(filePath);
            fileWriter.write("I am fine,thanks. 我很好,谢谢");
            fileWriter.write("Hello,world!问世!");
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                fileWriter.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        System.out.println("程序结束");
    }
}

 发现每一次重新输入的内容都会覆盖原先的内容。

原因:

在仔细翻阅了FileWriter类的方法后,原来这与该类的构造器有关

(1)、使用FileWriter(String FileName) 构造器:

文件的内容默认会被下一次所输入的内容覆盖,如本人以上所写。

(2)、若想实现内容的追加,则需使用另一个构造器使用FileWriter(String FileName,boolean append),并将第二个参数设置为true。

 解决方法:

在构造器中传入一个参数true,并在“I am fine,thanks. 我很好,谢谢Hello,world!问世!"的基础上写入“代码修改成功!”

更改后的代码:

public class FileWriterTest {
    public static void main(String[] args) {
        String filePath="d:\\example03.txt";
        FileWriter fileWriter=null;
        try {
            fileWriter=new FileWriter(filePath,true);
            //fileWriter.write("I am fine,thanks. 我很好,谢谢");
           // fileWriter.write("Hello,world!问世!");
            fileWriter.write("代码修改成功!");
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                fileWriter.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        System.out.println("程序结束");
    }
}

二、Reader类中readerLine()换行读取问题

在测试IO包下的BufferedReader类时,使用对readLine()方法的循环时发现输出到控制台的行少了一些,文件内容如下。

代码如下:

public class BufferedReaderTest {
    public static void main(String[] args) throws Exception{
        String filePath="d:\\a.txt";
        BufferedReader bufferedReader=new BufferedReader(new FileReader(filePath));
        while (bufferedReader.readLine()!=null){
            System.out.println(bufferedReader.readLine());
        }
        bufferedReader.close();
    }
}

运行结果:

 可以看到文件第一行与第三行并没有输出,只输出了第二行与第四行。

而当我不使用循环,直接多次调用readLine()方法时:

public class BufferedReaderTest {
    public static void main(String[] args) throws Exception{
        String filePath="d:\\a.txt";
        BufferedReader bufferedReader=new BufferedReader(new FileReader(filePath));
       /* while (bufferedReader.readLine()!=null){
            System.out.println(bufferedReader.readLine());
        }
*/
          System.out.println(bufferedReader.readLine());
          System.out.println(bufferedReader.readLine());
          System.out.println(bufferedReader.readLine());
          System.out.println(bufferedReader.readLine());
        bufferedReader.close();
    }
}

 这时输出的内容又正常了。这是为什么呢?

原因:

readLine() 方法每调用一次就读取一行,而在while(bufferedReader.readLine()!=null)中,判断此行内容是否为空时就已经调用了一次readLine() 方法(println输出的则是下一行内容),每循环一次就多调用了一次,就造成了隔行读取,致使许多行内容都没输出。

解决方法:

将readLine() 的结果赋值给一个变量,输出的是变量的内容而没有再次调用readLine() 方法

代码如下:

public class BufferedReaderTest {
    public static void main(String[] args) throws Exception{
        String filePath="d:\\a.txt";
        BufferedReader bufferedReader=new BufferedReader(new FileReader(filePath));
        String line;
        while ((line=bufferedReader.readLine())!=null){
            System.out.println(line);
        }
        bufferedReader.close();

    }
}

运行结果:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值