1.声明
当前内容主要用于本人复习java基础:IO流向文件中追加数据
2. 坑点
使用文件创建FileOutputStream的坑
1.创建方式一
FileOutputStream fos = new FileOutputStream(file);
OutputStreamWriter writer = new OutputStreamWriter(fos);
默认使用带一个参数的构造器,所以在创建的时候,默认采用写入方式时(即每次打开文件时将文件内容清空)
,无论是调用writer的write方法还是append方法(看似append,实际就是内容清空操作,再写入数据)
2.创建方式二
FileOutputStream fos = new FileOutputStream(file,true);
OutputStreamWriter writer = new OutputStreamWriter(fos);
这个才是标准的文件内容追加操作,所以一旦使用无论是调用writer的write方法还是append方法都是追加操作
所以其实在创建FileOutputStream时就已经决定操作文件的方式了
3.Demo
public class TextFileAppendDataTest {
static void readTxtFile(InputStreamReader reader) throws IOException {
if (reader == null) {
return;
}
char[] buff = new char[1024];
while (reader.read(buff) != -1) {
System.out.println(String.valueOf(buff));
}
}
static void writeTxtFile(OutputStreamWriter writer) throws IOException {
if (writer == null) {
return;
}
//FileWriter k=new FileWriter("",true);
// writer.append(csq, start, end) // append方法是骗人的,实际上就是清空当前的文本信息,最后在写入数据
String writeContext = "\r\n你好这是追加数据内容!";
writer.write(writeContext);
// writer.appedn("\r\n你好这是追加数据内容!"); // 错误
writer.flush();
}
public static void main(String[] args) {
// 1. 追加文本数据前
String txtFilePath = "tmp/txtFile.txt";
File file = new File(txtFilePath);
if (!file.exists()) {
System.out.println("当前需要追加数据的文件不存在");
return;
}
// 显示追加前的文本信息
// 直接使用try()方式,由于当前的流只要实现了Closeable就可以自动关闭流了
try (FileInputStream fis = new FileInputStream(file);
InputStreamReader reader = new InputStreamReader(fis)) {
System.out.println("写入数据前文本信息!");
readTxtFile(reader);
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// 向文本文件中追加数据
// FileOutputStream fos = new FileOutputStream(file,true);//加了true就是追加数据(无论是write或者appedn都是追加数据)
// FileOutputStream fos = new FileOutputStream(file); // 默认就是清空数据,然后写入(无论调用write或者append都是一样)
try (FileOutputStream fos = new FileOutputStream(file,true);
OutputStreamWriter writer = new OutputStreamWriter(fos)) {
writeTxtFile(writer);
System.out.println("写入数据成功!");
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("更新后的文本信息为:");
// 显示追加后的文本信息
try (FileInputStream fis = new FileInputStream(file);
InputStreamReader reader = new InputStreamReader(fis)) {
readTxtFile(reader);
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
执行结果:
4.总结
追加文件时在创建FileOutputStream的时候,追加参数true,就已经决定了的
- 不要被当前
的append方法所迷惑