一.概念
以内存为基准,把内存中的数据以字符形式写出到文件中
二.构造器
public FileWriter(Filefile)
创建字节输出流管道与源文件对象接通
public FileWriter(String filepath)
创建字节输出流管道与源文件路径接通
public Filewriter(File file,boolean append)
创建字节输出流管道与源文件对象接通,可追加数据
public FileWriter(String filepath,boolean append)
创建字节输出流管道与源文件路径接通,可追加数据
三.方法
void write(int c)
写一个字符
void write(String str)
写一个字符串
void write(String str,int off,int len)
写一个字符串的一部分
void write(char【】cbuf)
写入一个字符数组
void write(char【】cbuf,int off,int len)
写入字符数组的一部分
四.代码
package org.example;import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;public class day07 {public static void main(String[] args) {try ( //用多态Writer fw = new FileWriter("d:/temp/day05/test1.txt");){//1.写一个字符fw.write('c');fw.write('家');//2.写一个字符串fw.write("故乡");//3.写字符串的一部分fw.write("海浪啊,我的家",0,3);//4.写字符数组char[] buffer = {'和','平'};fw.write(buffer);//5.写字符数组的一部分,和上面写字符串的一部分一样} catch (Exception e) {e.printStackTrace();}}
}
五.问题
该代码在执行中会把原文件内容删了,和前面讲的字节输入流一样,该代码执行多次,里面的内容不会追加,解决方案,在字符输出流后面加true
六.解决方法
1.代码
package org.example;import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;public class day07 {public static void main(String[] args) {try ( //用多态Writer fw = new FileWriter("d:/temp/day05/test1.txt",true);){//1.写一个字符fw.write('c');fw.write('家');//2.写一个字符串fw.write("故乡");//3.写字符串的一部分fw.write("海浪啊,我的家",0,3);//4.写字符数组char[] buffer = {'和','平'};fw.write(buffer);fw.write("\r\n");//5.写字符数组的一部分,和上面写字符串的一部分一样} catch (Exception e) {e.printStackTrace();}}
}
2.结果
七.注意事项
字符输出流写出数据后,必须刷新流,或者关闭流,写出去的数据才能生效
前面我们写的代码用的是try-with-resource 使用资源完毕会自动关闭流
如果我们不用try-with-resouce,使用完资源也不关闭流结果会是什么?
1.代码
package org.example;import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;public class day08 {public static void main(String[] args) throws IOException {Writer fw = new FileWriter("d:/temp/day05/test3.txt");fw.write("你的名字");}
}
2.结果
你会发现该文件下什么都没有写入
原因:
IO流每次读写数据都需要进行系统调用,才可以把数据读写到文件中
当我们使用文件字符输出流写出数据,每一次系统调用都会耗费系统性能,导致性能很差。
文件字符输出流优化了此问题,当我们创建文件字符输出流的时候,会在内存中分配一块缓冲区,在我们用文件字符输出流写出数据的时候,数据并没有写到文件里,而是把数据先写到缓冲区里,这样速度会很快,等数据全都写到缓冲区,掉用刷新流或者关闭流,才进行系统调用,把缓冲区的数据同步到文件中。上面代码既没有调用刷新流,也没有调用关闭流,所以缓冲区的数据无法同步到文件里。
3.调用刷新流或关闭流
(建议用关闭流,这里我们演示刷新流,因为关闭流我们之前演示了好多次)
package org.example;import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;public class day08 {public static void main(String[] args) throws IOException {Writer fw = new FileWriter("d:/temp/day05/test3.txt");fw.write("你的名字");fw.flush();//刷新流}
}
4.结果
在Java中,刷新流和关闭流是两个不同的概念,具有不同的作用。
刷新流(flushing stream)是指将缓冲区中的数据强制输出,以确保数据能够及时写入目标位置。刷新流主要用于确保数据的完整性和一致性。例如,在使用OutputStream或Writer写入数据时,它们通常会使用缓冲区来提高写入效率。但是,如果在缓冲区未满时需要立即写入数据,或者需要在关闭流之前确保所有数据都已经写入,就需要使用flush方法来强制刷新缓冲区。
关闭流(closing stream)是指关闭流并释放与该流相关联的系统资源。关闭流是必要的,因为在程序使用完流之后,如果不关闭流,可能会导致资源泄漏或其他问题。在关闭流之后,流就不能再被使用或恢复。在Java中,关闭流通常使用close方法来实现。
因此,刷新流和关闭流的主要区别在于:刷新流是强制输出缓冲区中的数据,以确保数据的完整性和一致性;而关闭流是释放与流相关的系统资源,以避免资源泄漏和其他问题。通常建议在使用完流之后立即关闭流,以确保资源的正确释放。