zoukankan      html  css  js  c++  java
  • Java IO流:(六)节点流(文件流)之 FileWriter

    一、FileWriter

      1、FileWriter 类概述

        FileWriter 是用于字符传输的输出流,常用于把用户的输入持久化,即把输入的字符保存到文件内。

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

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

      2、FileWriter 类继承结构

        

      3、构造方法

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

      

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

          File file:文件对象

          String fileName:文件的路径。

          构造方法作用

          ① 会创建一个 FileWriter 对象

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

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

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

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

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

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

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

    二、常用方法

    void write(int c)
    

        写入单个字符。 要写入的字符包含在给定整数值的 16 个低位中, 16 高位被忽略。 即写入到 65535 之间的Unicode码。

    void write(char[] cbuf)
    

        写入字符数组。

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

        写入字符数组的某一部分。 从off开始, 写入len个字符

    void write(String str)
    

        写入字符串。

    void write(String str,int off,int len)
    

        写入字符串的某一部分。

    void flush()
    

        刷新该流的缓冲, 则立即将它们写入预期目标。

     public void close() throws IOException
    

        关闭此输出流并释放与该流关联的所有系统资源。

     

        因为字符流直接以字符作为操作单位,所以 Writer 可以用字符串来替换字符数组,即以 String 对象作为参数

    void write(String str);
    void write(String str, int off, int len);

    三、案例

      1、从内存中写出数据到硬盘的文件里

        代码实现:

     1     @Test
     2     public void testFileWriter() {
     3         FileWriter fileWriter = null;
     4         try {
     5             //1.提供File类的对象,指明写出到的文件
     6             File file = new File("hi.txt");
     7 
     8             //2.提供FileWriter的对象,用于数据的写出
     9             fileWriter = new FileWriter(file);
    10 
    11             //3.写出的操作
    12             fileWriter.write("I have a dream!
    ");
    13             fileWriter.write("you need to have a dream!");
    14         } catch (IOException e) {
    15             e.printStackTrace();
    16         } finally {
    17             //4.流资源的关闭
    18             try {
    19                 if(fileWriter != null) {
    20                     fileWriter.close();
    21                 }
    22             } catch (IOException e) {
    23                 e.printStackTrace();
    24             }
    25         }
    26     }

          利用 writer 的重载方法,可以写入字符串。

          当第二次运行这个程序时,可以发现要输出的内容会把第一次的覆盖掉!

      2、构造器的重载

     1     @Test
     2     public void testFileWriter() {
     3         FileWriter fileWriter = null;
     4         try {
     5             //1.提供File类的对象,指明写出到的文件
     6             File file = new File("hi.txt");
     7 
     8             //2.提供FileWriter的对象,用于数据的写出
     9             fileWriter = new FileWriter(file, true);
    10 
    11             //3.写出的操作
    12             fileWriter.write("I have a dream!
    ");
    13             fileWriter.write("you need to have a dream!");
    14         } catch (IOException e) {
    15             e.printStackTrace();
    16         } finally {
    17             //4.流资源的关闭
    18             try {
    19                 if(fileWriter != null) {
    20                     fileWriter.close();
    21                 }
    22             } catch (IOException e) {
    23                 e.printStackTrace();
    24             }
    25         }
    26     }

        在构造 FileWriter 时,可以指定两个参数,其中第二个参数决定是最文件的追加还是覆盖。

        如果为 true,代表追加;如果为 false,代表为覆盖。

      3、字符文件的拷贝赋值

        代码实现:

     1     @Test
     2     public void testFileReaderFileWriter() {
     3         FileReader fileReader = null;
     4         FileWriter fileWriter = null;
     5         try {
     6             //1.创建File类的对象,指明读入和写出的文件
     7             File srcFile = new File("hello.txt");
     8             File destFile = new File("hello2.txt");
     9 
    10             //2.创建输入流和输出流的对象
    11             fileReader = new FileReader(srcFile);
    12             fileWriter = new FileWriter(destFile);
    13 
    14             //3.数据的读入和写出操作
    15             char[] cbuf = new char[5];
    16             int len;//记录每次读入到cbuf数组中的字符的个数
    17             while((len = fileReader.read(cbuf)) != -1){
    18                 //每次写出len个字符
    19                 fileWriter.write(cbuf,0,len);
    20             }
    21         } catch (IOException e) {
    22             e.printStackTrace();
    23         } finally {
    24             //4.关闭流资源
    25             //方式一:
    26             /*
    27             try {
    28                 if(fileWriter != null) {
    29                     fileWriter.close();
    30                 }
    31             } catch (IOException e) {
    32                 e.printStackTrace();
    33             }finally{
    34                 try {
    35                     if(fileReader != null) {
    36                         fileReader.close();
    37                     }
    38                 } catch (IOException e) {
    39                     e.printStackTrace();
    40                 }
    41             }
    42              */
    43 
    44             //方式二:
    45             try {
    46                 if(fileWriter != null) {
    47                     fileWriter.close();
    48                 }
    49             } catch (IOException e) {
    50                 e.printStackTrace();
    51             }
    52 
    53             try {
    54                 if(fileReader != null) {
    55                     fileReader.close();
    56                 }
    57             } catch (IOException e) {
    58                 e.printStackTrace();
    59             }
    60         }
    61     }

        注意:不能使用字符流来处理图片等字节数据,例如图片、视频等类型。

      4、写出字符

        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 方法,数据只是保存到了缓冲区,并未写出到文件中。

      5、关闭与刷新

        区别:

    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方法,释放系统资源。 

      6、写出字符数组

        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     }

      7、写出字符串

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

        Demo:

     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     }

      8、续写和换行

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

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

      

          参数

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

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

          换行:换行符号

    Windows:
    
    
    Linux / Unix:
    
    
    mac:
    

          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+"
    ");
    5         }
    6 
    7         fw.close();
    8     }

    四、写入文件注意点

      1、输出操作,对应的File可以不存在的。并不会报异常;

      2、File对应的硬盘中的文件如果不存在,在输出的过程中,会自动创建此文件。

      3、File对应的硬盘中的文件如果存在:

        如果流使用的构造器是:FileWriter(file,false) / FileWriter(file):对原有文件的覆盖;(默认

        如果流使用的构造器是:FileWriter(file,true):不会对原有文件覆盖,而是在原有文件基础上追加内容;

  • 相关阅读:
    spring boot @value 使用
    mac Navicat premium 链接oracle
    List sort 排序
    mac 配置jdk+maven环境变量
    mybatis 根据主键批量insert或update
    git 常用命令
    SpringBoot整合Activiti案例
    Activiti网关-并行网关
    Activiti网关-包含网关
    Activiti网关-排他网关
  • 原文地址:https://www.cnblogs.com/niujifei/p/14836723.html
Copyright © 2011-2022 走看看