一、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();
}
}
运行结果: