java.io.FileWriter
类是写出字符到文件的便利类。构造时使用系统默认的字符编码和默认字节缓冲区。
作用:把内存中字符数据写入到文件中
java.io.FileWriter extends OutputStreamWriter extends Writer
1. 共性的成员方法
-
void write(int c)
:写入单个字符。 -
void write(char[] cbuf)
:写入字符数组。 -
abstract void write(char[] cbuf, int off, int len)
:写入字符数组的某一部分,off数组的开始索引,len写的字符个数。 -
void write(String str)
:写入字符串。 -
void write(String str, int off, int len)
:写入字符串的某一部分,off字符串的开始索引,len写的字符个数。 -
void flush()
:刷新该流的缓冲。 -
void close()
:关闭此流,但要先刷新它。
2. 构造方法
-
FileWriter(File file)
: 创建一个新的 FileWriter,给定要读取的File对象。 -
FileWriter(String fileName)
: 创建一个新的 FileWriter,给定要读取的文件的名称。
参数
写入数据的目的地
-
String fileName
:文件的路径 -
File file
:是一个文件
构造方法的作用
- 会创建一个FileWriter对象
- 会根据构造方法中传递的文件/文件的路径,创建文件
- 会把FileWriter对象指向创建好的文件
3. 使用步骤(重点)
当你创建一个流对象时,必须传入一个文件路径,类似于FileOutputStream。
- 创建FileWriter对象,构造方法中绑定要写入数据的目的地
- 使用FileWriter中的方法write,把数据写入到内存缓冲区中(字符转换为字节的过程)
- 使用FileWriter中的方法flush,把内存缓冲区中的数据,刷新到文件中
- 释放资源(会先把内存缓冲区中的数据刷新到文件中)
构造举例,代码如下:
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");
}
}
4. 基本写出数据
1. 写出字符
-
write(int b)
方法,每次可以写出一个字符数据
- 虽然参数为int类型四个字节,但是只会保留一个字符的信息写出。
- 未调用close方法,数据只是保存到了缓冲区,并未写出到文件中。
代码演示:
public class FWWrite {
public static void main(String[] args) throws IOException {
// 使用文件名称创建流对象
FileWriter fw = new FileWriter("fw.txt");
// 写出数据
fw.write(97); // 写出第1个字符
fw.write('b'); // 写出第2个字符
fw.write('C'); // 写出第3个字符
fw.write(30000); // 写出第4个字符,中文编码表中30000对应一个汉字。
/*
【注意】关闭资源时,与FileOutputStream不同。
如果不关闭,数据只是保存到缓冲区,并未保存到文件。
*/
// fw.close();
}
}
输出结果:
abC田
2. 关闭和刷新
因为内置缓冲区的原因,如果不关闭输出流,无法写出字符到文件中。但是关闭的流对象,是无法继续写出数据的。如果我们既想写出数据,又想继续使用流,就需要flush
方法了。
-
flush
:刷新缓冲区,流对象可以继续使用。 -
close
:先刷新缓冲区,然后通知系统释放资源。流对象不可以再被使用了。
注意
即便是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();
}
}
3. 写出其他数据
3.1 写出字符数组
-
write(char[] cbuf)
和write(char[] cbuf, int off, int len)
,每次可以写出字符数组中的数据,用法类似FileOutputStream
代码演示:
public class FWWrite {
public static void main(String[] args) throws IOException {
// 使用文件名称创建流对象
FileWriter fw = new FileWriter("fw.txt");
// 字符串转换为字节数组
char[] chars = "黑马程序员".toCharArray();
// 写出字符数组
fw.write(chars); // 黑马程序员
// 写出从索引2开始,2个字节。索引2是'程',两个字节,也就是'程序'。
fw.write(b,2,2); // 程序
// 关闭资源
fos.close();
}
}
3.2 写出字符串
-
write(String str)
和write(String str, int off, int len)
,每次可以写出字符串中的数据,更为方便
代码演示:
public class FWWrite {
public static void main(String[] args) throws IOException {
// 使用文件名称创建流对象
FileWriter fw = new FileWriter("fw.txt");
// 字符串
String msg = "黑马程序员";
// 写出字符数组
fw.write(msg); //黑马程序员
// 写出从索引2开始,2个字节。索引2是'程',两个字节,也就是'程序'。
fw.write(msg,2,2); // 程序
// 关闭资源
fos.close();
}
}
3.3 续写和换行
操作类似于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();
}
}
结果:
我的
天呐