JAVA FileWriter

概述

java.io.FileWriter类用于写 文本文件,是 便利类,可以快速使用

构造时使用 UTF-8 字符集 和 默认字节缓冲区

要自己指定这些值,需要在 FileInputStream 上构造一个 InputStreamReader

字符集:

字节与字符的对应规则

  • Windows10 系统默认字符集是 UTF-8 ,之前的默认字符集是 GBK
  • unix、linux系统默认字符集是UTF-8。
  • idea等一些开发工具,默认编码集是UTF-8

字节缓冲区:一个字节数组,用来临时存储字节数据。

构造方法

  • FileWriter(File file): 创建一个新的 FileWriter,给定要读取的File对象。
  • FileWriter(String fileName): 创建一个新的 FileWriter,给定要读取的文件的名称。

必须传入一个文件路径,类似于FileOutputStream。

例子:

public class FileWriterConstructor {
    public static void main(String[] args) throws IOException {
            // 使用File对象创建流对象
        File file = new File("a.txt");
        FileWriter fw = new FileWriter(file);

        // 使用文件名称创建流对象
        FileWriter fw = new FileWriter("b.txt");
    }
}

写 数据

写一个字符

写出字符:write(int b) 方法,每次可以写出一个字符数据,代码使用演示:

// 使用文件名称创建流对象
FileWriter fw = new FileWriter("fw.txt");     
// 写出数据
fw.write(97); // 写出第1个字符
fw.write('b'); // 写出第2个字符
fw.write('C'); // 写出第3个字符
fw.write(30000); // 写出第4个字符,中文编码表中30000对应一个汉字。

fw.close();

输出结果:

abC田
  1. 虽然参数为int类型四个字节,但是只会保留一个字符的信息写出。
  2. 未调用close()方法,数据只是保存到了缓冲区,并未写出到文件中。

写 字符数组

public void write(char cbuf[]) throws IOException
public void write(char cbuf[], int off, int len) throws IOException

把字符数组的内容写入到文件中

例子

// 使用文件名称创建流对象
FileWriter fw = new FileWriter("fw.txt");
// 字符串转换为字节数组
char[] chars = "抖音快手打王者".toCharArray();

// 写出字符数组
fw.write(chars); 

// 写出从索引2开始,2个字节
fw.write(b,2,2); 

// 关闭资源
fos.close();

写字符串

public void write(String str) throws IOException
public void write(String str, int off, int len) throws IOException

把字符串中的数据写入到文件中,更为方便

例子:

// 使用文件名称创建流对象
FileWriter fw = new FileWriter("fw.txt");
// 字符串
String msg = "抖音快手打王者";

// 写出字符数组
fw.write(msg); 

// 写出从索引2开始
fw.write(msg,2,2);    // 程序

// 关闭资源
fos.close();

flush()

写操作,实际是将数据 写入 到缓冲区中,刷新缓冲区 或 关闭文件时,才真正将数据写入到文件中

刷新缓冲区,将 缓冲区中 的数据立刻 写入 文件中

f.flush()

例子

FileWriter fw = new FileWriter("fw.txt");
String msg = "抖音快手打王者";
fw.write(msg);
Thread.sleep(10000);

休眠10秒,在10秒内,打开文件,并没有内容

执行flush()方法刷新缓冲区,才将数据写入文件

关闭

写操作,实际是将数据 写入 到缓冲区中,刷新缓冲区 或 关闭文件时,才真正将数据写入到文件中

读写文件后应 及时关闭 ,关闭后将 不能 对文件进行任何 操作。

如果不关闭,那么 文件一直被占用,会出现问题,如:

  • 不能改文件名
  • 有时运行某软件时会提示XXX文件被占用,为了避免该情况,读写文件后应及时关闭
  • 操作系统对 打开文件的次数有限制
  • 当 程序退出 后,文件会释放

补充:
有的软件,在运行时, 会一直独占文件 ,这种时候,就不能关闭 。
如:word、ppt、excel等,在实现某软件服务器时,在运行期间要一直输出日志,所以一直独占日志文件

语法

close()

例子:

FileWriter fw = new FileWriter("fw.txt");
String msg = "抖音快手打王者";
fw.write(msg);
Thread.sleep(10000);

关闭后,将内存中的 数据 立刻 写入 文件中

刷新

因为内置缓冲区的原因,如果不关闭输出流,无法写出字符到文件中。但是关闭的流对象,是无法继续写出数据的。如果我们既想写出数据,又想继续使用流,就需要flush 方法了。

  • flush :刷新缓冲区,流对象可以继续使用。
  • close:先刷新缓冲区,然后通知系统释放资源。流对象不可以再被使用了。

代码使用演示:

public class FWWrite {
    public static void main(String[] args) throws IOException {
        // 使用文件名称创建流对象
        FileWriter fw = new FileWriter("fw.txt");
        // 写出数据,通过flush
        fw.write('刷'); // 写出第1个字符
        fw.flush();
        fw.write('新'); // 继续写出第2个字符,写出成功
        fw.flush();

          // 写出数据,通过close
        fw.write('关'); // 写出第1个字符
        fw.close();
        fw.write('闭'); // 继续写出第2个字符,【报错】java.io.IOException: Stream closed
        fw.close();
    }
}

小贴士:即便是flush方法写出了数据,操作的最后还是要调用close方法,释放系统资源。

续写和换行:操作类似于FileOutputStream。

public class FWWrite {
    public static void main(String[] args) throws IOException {
        // 使用文件名称创建流对象,可以续写数据
        FileWriter fw = new FileWriter("fw.txt",true);     
          // 写出字符串
        fw.write("黑马");
          // 写出换行
          fw.write("\r\n");
          // 写出字符串
          fw.write("程序员");
          // 关闭资源
        fw.close();
    }
}
输出结果:
牛B
程序员

小贴士:字符流,只能操作文本文件,不能操作图片,视频等非文本文件。

当我们单纯读或者写文本文件时 使用字符流 其他情况使用字节流**


原文出处:/show_1EF4sdsnuyok.html