概述
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田
- 虽然参数为int类型四个字节,但是只会保留一个字符的信息写出。
- 未调用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
程序员
小贴士:字符流,只能操作文本文件,不能操作图片,视频等非文本文件。
当我们单纯读或者写文本文件时 使用字符流 其他情况使用字节流**