基本概念

java.io.FileWriter类:将文本内容写入到文本文件。

常用的方法

方法声明 功能介绍
FileWriter(String fileName) 根据参数指定的文件名构造对象
FileWriter(String fileName, boolean append) 以追加的方式根据参数指定的文件名来构造对象
void write(int c) 写入单个字符
void write(char cbuf[], int off, int len) 将指定字符数组中从偏移量off开始的len个字符写入此文件输出流
void write(char cbuf[]) cbuf.length
个字符从指定字符数组写入此文件输出流中
void flush() 刷新流
void close() 关闭流对象并释放有关的资源
  1. //构造FileWrite类型的对象与电脑/Users/gaigai/Desktop/test.txt文件关联
  2. FileWriter fileWriter = new FileWriter("/Users/gaigai/Desktop/test.txt");
  3. //通过流对象写入数据内容
  4. fileWriter.write("a");
  5. //关闭流对象并释放有关的资源
  6. fileWriter.close();

就像我们用水管节水,首先要拿个盛水的容器「就是对应电脑文件名」,
然后需要把水流进容器中「写入数据」,
最后我们要关了水管,不然就会被淹了「关闭流对象」

声明、写入、关闭

  • 构造FileWrite类型的对象与电脑文件关联
  1. FileWriter fileWriter = new FileWriter("/Users/gaigai/Desktop/test.txt");
  • 报错:IO异常
  1. public class FileWriterDemo {
  2. public static void main(String[] args) {
  3. //捕获异常代码
  4. //mac: command + alt + t
  5. //window: ctrl + alt + t
  6. FileWriter fileWriter = null;
  7. try {
  8. //构造FileWrite类型的对象与电脑/Users/gaigai/Desktop/test.txt文件关联
  9. fileWriter = new FileWriter("/Users/gaigai/Desktop/test.txt");
  10. //通过流对象写入数据内容
  11. fileWriter.write("a");
  12. } catch (IOException e) {
  13. e.printStackTrace();
  14. } finally {
  15. //关闭流对象并释放有关的资源
  16. fileWriter.close();
  17. }
  18. }
  19. }

如果在new对象的时候发生异常,那么在后面调用该对象的实例化的时候有可能会发生对应的空指针异常,所以write/close()方法也报错

  • 异常处理有三种方式:避免,捕获,抛出

我们这里用抛出来解决异常,这个时候对应的close方法还是标红

fileWriter.close();要放在finally里面,就是不管我水管开没开成功、接没接水,
对应的我最后走的时候都要确认下对应水管是否关好了。

  • 放入finally里面,加上一个判断,如果不是空,那就关。如果是空,那就算了,不多此一举了
  1. finally {
  2. if (null != fileWriter){
  3. //关闭流对象并释放有关的资源
  4. fileWriter.close();
  5. }
  6. }
  • 这个时候还是报错,我们继续看,对应的还是要抛出一个IO异常,同样我们用 try-catch 捕获
  1. finally {
  2. if (null != fileWriter){
  3. //关闭流对象并释放有关的资源
  4. try {
  5. fileWriter.close();
  6. } catch (IOException e) {
  7. e.printStackTrace();
  8. }
  9. }
  10. }

到此,对应编译不报错,我们运行看一下,对应桌面是没有这个文件的,我们发现在运行之后,
对应文件被创建了,并且显示为13个字节。

文件不存在
  • 该流会自动创建新的空文件

文件存在
  • 该流会清空文件中的原有内容

第一次添加运行,第二次不添加,会发现文件内容为空,变成了0字节。

  • 多次运行,该流并未持续添加内容进文件

追加添加

多次运行追加添加
  • new对象的时候添加true
  • 以追加的方式创建对象去关联文件
  1. fileWriter = new FileWriter("/Users/gaigai/Desktop/test.txt",true);

若文件不存在,该流会自动创建新的空文件

若文件存在,以追加的方式创建对象去关联文件

第一次添加运行,第二次添加,会发现文件内容添加2次,字节数变为2倍。

  • 多次运行,该流持续添加内容进文件

一次运行追加添加
  • a写入的时候还可以把它变成数字,对应ASCII表
    FileWriter类 - 图1
    FileWriter类 - 图2
  • void write(char cbuf[], int off, int len)
    • [off,len] : 左右都包含
  • void write(char cbuf[])
    • 直接写入char数组

对应多个内容添加的时候,不是清空对应的文件,而是在后面写入的。
只有new对象的时候才清空文件,对应多个write()顺序执行的时候,是一直追加往后面写入。

  • 当写入一个字符后则文件中的读写位置向后移动一位
  • 如果想要写入多个aellhello,则声明对象的时候加上true,并且多次运行即可。
  1. import java.io.FileWriter;
  2. import java.io.IOException;
  3. public class FileWriterDemo {
  4. public static void main(String[] args) {
  5. //捕获异常代码
  6. //mac: command + alt + t
  7. //window: ctrl + alt + t
  8. FileWriter fileWriter = null;
  9. try {
  10. //构造FileWrite类型的对象与电脑/Users/gaigai/Desktop/test.txt文件关联
  11. fileWriter = new FileWriter("/Users/gaigai/Desktop/test.txt");
  12. // fileWriter = new FileWriter("/Users/gaigai/Desktop/test.txt",true);
  13. //通过流对象写入数据内容
  14. fileWriter.write(97);
  15. // fileWriter.write("a");
  16. // 准备一个字符数组
  17. char[] cArr = new char[]{'h', 'e', 'l', 'l', 'o'};
  18. // 将字符数组中的一部分内容写入进去
  19. fileWriter.write(cArr, 1, 3); // ell
  20. // 将整个字符数组写进去
  21. fileWriter.write(cArr); // hello
  22. //aellhello 9个字节
  23. // 刷新流
  24. fileWriter.flush();
  25. System.out.println("写入数据成功!");
  26. } catch (IOException e) {
  27. e.printStackTrace();
  28. } finally {
  29. if (null != fileWriter){
  30. //关闭流对象并释放有关的资源
  31. try {
  32. fileWriter.close();
  33. } catch (IOException e) {
  34. e.printStackTrace();
  35. }
  36. }
  37. }
  38. }
  39. }