Java 之 字符输出流[writer]

一、字符输出流

  java.io.Writer 抽象类是表示用于写出字符流的所有类的超类,将指定的字符信息写出到目的地。

    它定义了字节输出流的基本共性功能方法。

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() 关闭此流,但要先刷新它。

  Writer 抽象类下面的子类结构:

   图中深色的为节点流,浅色的为处理流。

二、FileWriter 类

  java.io.FileWriter 类是写出字符到文件的便利类。构造时使用系统默认的字符编码和默认字节缓冲区 。

  作用:把内存中字符数据写入到文件中。

  1、构造方法

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

     参数:写入数据的目的地。

      File file:文件对象

      String fileName:文件的路径。

      构造方法作用

      ① 会创建一个 FileWriter 对象

      ② 会根据构造方法中传递的文件 / 文件的路径,创建对象

      ③ 会把 FileWriter 对象指向创建好的文件。

      字符输出流的使用步骤重要】:

      ① 创建FileWriter对象,构造方法中绑定要写入数据的目的地

      ② 使用FileWriter中的方法write,把数据写入到内存缓冲区中(字符转换为字节的过程)

      ③ 使用FileWriter中的方法flush,把内存缓冲区中的数据,刷新到文件中

      ④ 释放资源(会先把内存缓冲区中的数据刷新到文件中)

  2、基本写入数据

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

 1 public static void main(String[] args) throws IOException {
 2         //1.创建FileWriter对象,构造方法中绑定要写入数据的目的地
 3         FileWriter fw = new FileWriter("E:\\d.txt");
 4         //2.使用FileWriter中的方法write,把数据写入到内存缓冲区中(字符转换为字节的过程)
 5         //void write(int c) 写入单个字符。
 6         fw.write(97);
 7         //3.使用FileWriter中的方法flush,把内存缓冲区中的数据,刷新到文件中
 8         //fw.flush();
 9         //4.释放资源(会先把内存缓冲区中的数据刷新到文件中)
10         fw.close();
11     }

     注意:如果未调用 close 方法,数据只是保存到了缓冲区,并未写出到文件中。

    (2)关闭与刷新

      区别:

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

      Demo:

 1  public static void main(String[] args) throws IOException {
 2         //1.创建FileWriter对象,构造方法中绑定要写入数据的目的地
 3         FileWriter fw = new FileWriter("E:\\e.txt");
 4         //2.使用FileWriter中的方法write,把数据写入到内存缓冲区中(字符转换为字节的过程)
 5         //void write(int c) 写入单个字符。
 6         fw.write(97);
 7         //3.使用FileWriter中的方法flush,把内存缓冲区中的数据,刷新到文件中
 8         fw.flush();
 9         //刷新之后流可以继续使用
10         fw.write(98);
11 
12         //4.释放资源(会先把内存缓冲区中的数据刷新到文件中)
13         fw.close();
14 
15         //close方法之后流已经关闭了,已经从内存中消失了,流就不能再使用了
16         fw.write(99);//IOException: Stream closed
17     }

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

  3、写出其他数据

    (1)写出字符数组:write(char[] cbuf) write(char[] cbuf, int off, int len) ,每次可以写出字符数组中的数据,用法类似FileOutputStream,代码使用演示:

 1  public static void main(String[] args) throws IOException {
 2         FileWriter fw = new FileWriter("E:\\f.txt");
 3         char[] cs = {'a','b','c','d','e'};
 4         //void write(char[] cbuf)写入字符数组。
 5         fw.write(cs);//abcde
 6 
 7         //void write(char[] cbuf, int off, int len)写入字符数组的某一部分,off数组的开始索引,len写的字符个数。
 8         fw.write(cs,1,3);//bcd
 9 
10         fw.close();
11     }

 

    (2)写出字符串:write(String str) write(String str, int off, int len) ,每次可以写出字符串中的数据,更为方便,代码使用演示:

 1  public static void main(String[] args) throws IOException {
 2         FileWriter fw = new FileWriter("E:\\f.txt");
 3    
 4         //void write(String str)写入字符串。
 5         fw.write("博客园");//博客园 6 
 7         //void write(String str, int off, int len) 写入字符串的某一部分,off字符串的开始索引,len写的字符个数。
 8         fw.write("天道酬勤啊",2,3);//酬勤啊
 9 
10         fw.close();
11     }

    (3)续写和换行

      续写,追加写:使用两个参数的构造方法

FileWriter(String fileName, boolean append)
FileWriter(File file, boolean append)

                     参数

        String fileName,File file:写入数据的目的地。

        boolean append:续写开关 true:不会创建新的文件覆盖源文件,可以续写; false:创建新的文件覆盖源文件。

      换行:换行符号

        windows:\r\n

        Linux / Unix:\n

        mac:\r

      Demo :

1 public static void main(String[] args) throws IOException {
2         FileWriter fw = new FileWriter("E:\\g.txt",true);
3         for (int i = 0; i <10 ; i++) {
4             fw.write("HelloWorld"+i+"\r\n");
5         }
6 
7         fw.close();
8     }

注意:字符流,只能操作文本文件,不能操作图片,视频等非文本文件。单纯读或者写文本文件时,使用字符流,其他情况使用字节流。

猜你喜欢

转载自www.cnblogs.com/niujifei/p/11489087.html